Showing preview only (2,690K chars total). Download the full file or copy to clipboard to get everything.
Repository: erdewit/eventkit
Branch: master
Commit: caec9382bf4e
Files: 83
Total size: 2.5 MB
Directory structure:
gitextract_7ujg68vi/
├── .gitattributes
├── .github/
│ └── workflows/
│ └── test.yml
├── .gitignore
├── .readthedocs.yml
├── LICENSE
├── README.rst
├── docs/
│ ├── Makefile
│ ├── api.rst
│ ├── conf.py
│ ├── html/
│ │ ├── _modules/
│ │ │ ├── asyncio/
│ │ │ │ └── unix_events.html
│ │ │ ├── eventkit/
│ │ │ │ ├── event.html
│ │ │ │ ├── ops/
│ │ │ │ │ ├── aggregate.html
│ │ │ │ │ ├── array.html
│ │ │ │ │ ├── combine.html
│ │ │ │ │ ├── create.html
│ │ │ │ │ ├── misc.html
│ │ │ │ │ ├── op.html
│ │ │ │ │ ├── select.html
│ │ │ │ │ ├── timing.html
│ │ │ │ │ └── transform.html
│ │ │ │ └── util.html
│ │ │ ├── index.html
│ │ │ └── logging.html
│ │ ├── _sources/
│ │ │ ├── api.rst.txt
│ │ │ └── index.rst.txt
│ │ ├── _static/
│ │ │ ├── _sphinx_javascript_frameworks_compat.js
│ │ │ ├── basic.css
│ │ │ ├── css/
│ │ │ │ ├── badge_only.css
│ │ │ │ └── theme.css
│ │ │ ├── doctools.js
│ │ │ ├── documentation_options.js
│ │ │ ├── fonts/
│ │ │ │ └── FontAwesome.otf
│ │ │ ├── jquery-3.2.1.js
│ │ │ ├── jquery-3.5.1.js
│ │ │ ├── jquery-3.6.0.js
│ │ │ ├── jquery.js
│ │ │ ├── js/
│ │ │ │ ├── badge_only.js
│ │ │ │ └── theme.js
│ │ │ ├── language_data.js
│ │ │ ├── pygments.css
│ │ │ ├── searchtools.js
│ │ │ ├── sphinx_highlight.js
│ │ │ ├── underscore-1.12.0.js
│ │ │ ├── underscore-1.13.1.js
│ │ │ ├── underscore-1.3.1.js
│ │ │ ├── underscore.js
│ │ │ └── websupport.js
│ │ ├── api.html
│ │ ├── genindex.html
│ │ ├── index.html
│ │ ├── objects.inv
│ │ ├── py-modindex.html
│ │ ├── search.html
│ │ └── searchindex.js
│ ├── index.rst
│ ├── make.bat
│ └── requirements.txt
├── eventkit/
│ ├── __init__.py
│ ├── event.py
│ ├── ops/
│ │ ├── __init__.py
│ │ ├── aggregate.py
│ │ ├── array.py
│ │ ├── combine.py
│ │ ├── create.py
│ │ ├── misc.py
│ │ ├── op.py
│ │ ├── select.py
│ │ ├── timing.py
│ │ └── transform.py
│ ├── util.py
│ └── version.py
├── notebooks/
│ └── eventkit_introduction.ipynb
├── requirements.txt
├── setup.cfg
├── setup.py
└── tests/
├── __init__.py
├── aggregate_test.py
├── combine_test.py
├── create_test.py
├── event_test.py
├── select_test.py
├── timing_test.py
└── transform_test.py
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitattributes
================================================
notebooks/* linguist-documentation
================================================
FILE: .github/workflows/test.yml
================================================
name: eventkit
on: [ push, pull_request ]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: [ 3.8, 3.9, "3.10", "3.11", "3.12" ]
steps:
- uses: actions/checkout@v3
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install flake8 mypy pytest .
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
- name: Flake8 static code analysis
run:
flake8 eventkit
- name: MyPy static code analysis
run: |
mypy -p eventkit
- name: Test with pytest
run: |
pytest tests
================================================
FILE: .gitignore
================================================
dist.sh
**/__pycache__
dist
build
.vscode
.idea
.settings
.spyproject
.project
.pydevproject
.mypy_cache
docs/html/.buildinfo
docs/html/.doctrees
docs/doctrees
eventkit.egg-info
================================================
FILE: .readthedocs.yml
================================================
# .readthedocs.yml
version: 2
build:
os: ubuntu-22.04
tools:
python: "3.12"
python:
install:
- method: pip
path: .
- requirements: requirements.txt
- requirements: docs/requirements.txt
# Build all formats
formats: all
================================================
FILE: LICENSE
================================================
BSD 2-Clause License
Copyright (c) 2023, Ewald de Wit
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
================================================
FILE: README.rst
================================================
|Build| |PyVersion| |Status| |PyPiVersion| |License| |Docs|
Introduction
------------
The primary use cases of eventkit are
* to send events between loosely coupled components;
* to compose all kinds of event-driven data pipelines.
The interface is kept as Pythonic as possible,
with familiar names from Python and its libraries where possible.
For scheduling asyncio is used and there is seamless integration with it.
See the examples and the
`introduction notebook <https://github.com/erdewit/eventkit/tree/master/notebooks/eventkit_introduction.ipynb>`_
to get a true feel for the possibilities.
Installation
------------
::
pip3 install eventkit
Python_ version 3.6 or higher is required.
Examples
--------
**Create an event and connect two listeners**
.. code-block:: python
import eventkit as ev
def f(a, b):
print(a * b)
def g(a, b):
print(a / b)
event = ev.Event()
event += f
event += g
event.emit(10, 5)
**Create a simple pipeline**
.. code-block:: python
import eventkit as ev
event = (
ev.Sequence('abcde')
.map(str.upper)
.enumerate()
)
print(event.run()) # in Jupyter: await event.list()
Output::
[(0, 'A'), (1, 'B'), (2, 'C'), (3, 'D'), (4, 'E')]
**Create a pipeline to get a running average and standard deviation**
.. code-block:: python
import random
import eventkit as ev
source = ev.Range(1000).map(lambda i: random.gauss(0, 1))
event = source.array(500)[ev.ArrayMean, ev.ArrayStd].zip()
print(event.last().run()) # in Jupyter: await event.last()
Output::
[(0.00790957852672618, 1.0345673260655333)]
**Combine async iterators together**
.. code-block:: python
import asyncio
import eventkit as ev
async def ait(r):
for i in r:
await asyncio.sleep(0.1)
yield i
async def main():
async for t in ev.Zip(ait('XYZ'), ait('123')):
print(t)
asyncio.get_event_loop().run_until_complete(main()) # in Jupyter: await main()
Output::
('X', '1')
('Y', '2')
('Z', '3')
**Real-time video analysis pipeline**
.. code-block:: python
self.video = VideoStream(conf.CAM_ID)
scene = self.video | FaceTracker | SceneAnalyzer
lastScene = scene.aiter(skip_to_last=True)
async for frame, persons in lastScene:
...
`Full source code <https://github.com/erdewit/heartwave/blob/100e1a89d18756e141f9dcfbb73c55a1009debf4/heartwave/app.py#L88>`_
Distributed computing
---------------------
The `distex <https://github.com/erdewit/distex>`_ library provides a
``poolmap`` extension method to put multiple cores or machines to use:
.. code-block:: python
from distex import Pool
import eventkit as ev
import bz2
pool = Pool()
# await pool # un-comment in Jupyter
data = [b'A' * 1000000] * 1000
pipe = ev.Sequence(data).poolmap(pool, bz2.compress).map(len).mean().last()
print(pipe.run()) # in Jupyter: print(await pipe)
pool.shutdown()
Inspired by:
------------
* `Qt Signals & Slots <https://doc.qt.io/qt-5/signalsandslots.html>`_
* `itertools <https://docs.python.org/3/library/itertools.html>`_
* `aiostream <https://github.com/vxgmichel/aiostream>`_
* `Bacon <https://baconjs.github.io/index.html>`_
* `aioreactive <https://github.com/dbrattli/aioreactive>`_
* `Reactive extensions <http://reactivex.io/documentation/operators.html>`_
* `underscore.js <https://underscorejs.org>`_
* `.NET Events <https://docs.microsoft.com/en-us/dotnet/standard/events>`_
Documentation
-------------
The complete `API documentation <https://eventkit.readthedocs.io/en/latest/api.html>`_.
.. _Python: http://www.python.org
.. _`Interactive Brokers Python API`: http://interactivebrokers.github.io
.. |Build| image:: https://github.com/erdewit/eventkit/actions/workflows/test.yml/badge.svg?branch=master
:alt: Build
:target: https://github.com/erdewit/eventkit/actions
.. |PyPiVersion| image:: https://img.shields.io/pypi/v/eventkit.svg
:alt: PyPi
:target: https://pypi.python.org/pypi/eventkit
.. |PyVersion| image:: https://img.shields.io/badge/python-3.6+-blue.svg
:alt:
.. |Status| image:: https://img.shields.io/badge/status-stable-green.svg
:alt:
.. |License| image:: https://img.shields.io/badge/license-BSD-blue.svg
:alt:
.. |Docs| image:: https://readthedocs.org/projects/eventkit/badge/?version=latest
:alt: Documentation
:target: https://eventkit.readthedocs.io
================================================
FILE: docs/Makefile
================================================
# Minimal makefile for Sphinx documentation
#
# You can set these variables from the command line.
SPHINXOPTS =
SPHINXBUILD = python3 -msphinx
SPHINXPROJ = distex
SOURCEDIR = .
BUILDDIR = .
# 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)
================================================
FILE: docs/api.rst
================================================
.. _api:
eventkit
========
Release |release|.
.. toctree::
:maxdepth: 3
:caption: Modules:
Event
-----
.. autoclass:: eventkit.event.Event
:members:
.. automethod:: __await__
.. automethod:: __aiter__
Op
--
.. automodule:: eventkit.ops.op
Create
------
.. automodule:: eventkit.ops.create
Select
------
.. automodule:: eventkit.ops.select
Transform
---------
.. automodule:: eventkit.ops.transform
Aggregate
---------
.. automodule:: eventkit.ops.aggregate
Combine
-------
.. automodule:: eventkit.ops.combine
Timing
------
.. automodule:: eventkit.ops.timing
Array
-----
.. automodule:: eventkit.ops.array
Misc
----
.. automodule:: eventkit.ops.misc
Util
----
.. automodule:: eventkit.util
================================================
FILE: docs/conf.py
================================================
extensions = [
'sphinx.ext.autodoc',
'sphinx.ext.viewcode',
'sphinx.ext.napoleon',
'sphinx_autodoc_typehints',
]
templates_path = ['_templates']
source_suffix = '.rst'
master_doc = 'index'
project = 'eventkit'
copyright = '2021, Ewald de Wit'
author = 'Ewald de Wit'
__version__ = None
exec(open('../eventkit/version.py').read())
version = '.'.join(__version__.split('.')[:2])
release = __version__
language = None
exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
pygments_style = 'sphinx'
todo_include_todos = False
html_theme = 'sphinx_rtd_theme'
html_theme_options = {
'canonical_url': 'https://eventkit.readthedocs.io',
'logo_only': False,
'display_version': True,
'prev_next_buttons_location': 'bottom',
'style_external_links': False,
# Toc options
'collapse_navigation': True,
'sticky_navigation': True,
'navigation_depth': 4,
'includehidden': True,
'titles_only': False
}
github_url = 'https://github.com/erdewit/eventkit'
autoclass_content = 'both'
autodoc_member_order = "bysource"
autodoc_default_flags = [
'members',
'undoc-members',
]
================================================
FILE: docs/html/_modules/asyncio/unix_events.html
================================================
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>asyncio.unix_events — eventkit 0.8.5 documentation</title>
<link rel="canonical" href="https://eventkit.readthedocs.io_modules/asyncio/unix_events.html"/>
<script type="text/javascript" src="../../_static/js/modernizr.min.js"></script>
<script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../_static/jquery.js"></script>
<script type="text/javascript" src="../../_static/underscore.js"></script>
<script type="text/javascript" src="../../_static/doctools.js"></script>
<script type="text/javascript" src="../../_static/language_data.js"></script>
<script type="text/javascript" src="../../_static/js/theme.js"></script>
<link rel="stylesheet" href="../../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="../../index.html" class="icon icon-home"> eventkit
</a>
<div class="version">
0.8
</div>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../api.html">eventkit</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../index.html">eventkit</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="../../index.html">Docs</a> »</li>
<li><a href="../index.html">Module code</a> »</li>
<li>asyncio.unix_events</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<h1>Source code for asyncio.unix_events</h1><div class="highlight"><pre>
<span></span><span class="sd">"""Selector event loop for Unix with signal handling."""</span>
<span class="kn">import</span> <span class="nn">errno</span>
<span class="kn">import</span> <span class="nn">io</span>
<span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">selectors</span>
<span class="kn">import</span> <span class="nn">signal</span>
<span class="kn">import</span> <span class="nn">socket</span>
<span class="kn">import</span> <span class="nn">stat</span>
<span class="kn">import</span> <span class="nn">subprocess</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">threading</span>
<span class="kn">import</span> <span class="nn">warnings</span>
<span class="kn">from</span> <span class="nn">.</span> <span class="k">import</span> <span class="n">base_events</span>
<span class="kn">from</span> <span class="nn">.</span> <span class="k">import</span> <span class="n">base_subprocess</span>
<span class="kn">from</span> <span class="nn">.</span> <span class="k">import</span> <span class="n">constants</span>
<span class="kn">from</span> <span class="nn">.</span> <span class="k">import</span> <span class="n">coroutines</span>
<span class="kn">from</span> <span class="nn">.</span> <span class="k">import</span> <span class="n">events</span>
<span class="kn">from</span> <span class="nn">.</span> <span class="k">import</span> <span class="n">futures</span>
<span class="kn">from</span> <span class="nn">.</span> <span class="k">import</span> <span class="n">selector_events</span>
<span class="kn">from</span> <span class="nn">.</span> <span class="k">import</span> <span class="n">tasks</span>
<span class="kn">from</span> <span class="nn">.</span> <span class="k">import</span> <span class="n">transports</span>
<span class="kn">from</span> <span class="nn">.log</span> <span class="k">import</span> <span class="n">logger</span>
<span class="n">__all__</span> <span class="o">=</span> <span class="p">(</span>
<span class="s1">'SelectorEventLoop'</span><span class="p">,</span>
<span class="s1">'AbstractChildWatcher'</span><span class="p">,</span> <span class="s1">'SafeChildWatcher'</span><span class="p">,</span>
<span class="s1">'FastChildWatcher'</span><span class="p">,</span> <span class="s1">'DefaultEventLoopPolicy'</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">sys</span><span class="o">.</span><span class="n">platform</span> <span class="o">==</span> <span class="s1">'win32'</span><span class="p">:</span> <span class="c1"># pragma: no cover</span>
<span class="k">raise</span> <span class="ne">ImportError</span><span class="p">(</span><span class="s1">'Signals are not really supported on Windows'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_sighandler_noop</span><span class="p">(</span><span class="n">signum</span><span class="p">,</span> <span class="n">frame</span><span class="p">):</span>
<span class="sd">"""Dummy signal handler."""</span>
<span class="k">pass</span>
<span class="k">class</span> <span class="nc">_UnixSelectorEventLoop</span><span class="p">(</span><span class="n">selector_events</span><span class="o">.</span><span class="n">BaseSelectorEventLoop</span><span class="p">):</span>
<span class="sd">"""Unix event loop.</span>
<span class="sd"> Adds signal handling and UNIX Domain Socket support to SelectorEventLoop.</span>
<span class="sd"> """</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">selector</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">selector</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_signal_handlers</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">sys</span><span class="o">.</span><span class="n">is_finalizing</span><span class="p">():</span>
<span class="k">for</span> <span class="n">sig</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_signal_handlers</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">remove_signal_handler</span><span class="p">(</span><span class="n">sig</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_signal_handlers</span><span class="p">:</span>
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="n">f</span><span class="s2">"Closing the loop </span><span class="si">{self!r}</span><span class="s2"> "</span>
<span class="n">f</span><span class="s2">"on interpreter shutdown "</span>
<span class="n">f</span><span class="s2">"stage, skipping signal handlers removal"</span><span class="p">,</span>
<span class="ne">ResourceWarning</span><span class="p">,</span>
<span class="n">source</span><span class="o">=</span><span class="bp">self</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_signal_handlers</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">_process_self_data</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
<span class="k">for</span> <span class="n">signum</span> <span class="ow">in</span> <span class="n">data</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">signum</span><span class="p">:</span>
<span class="c1"># ignore null bytes written by _write_to_self()</span>
<span class="k">continue</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_handle_signal</span><span class="p">(</span><span class="n">signum</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">add_signal_handler</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sig</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
<span class="sd">"""Add a handler for a signal. UNIX only.</span>
<span class="sd"> Raise ValueError if the signal number is invalid or uncatchable.</span>
<span class="sd"> Raise RuntimeError if there is a problem setting up the handler.</span>
<span class="sd"> """</span>
<span class="k">if</span> <span class="p">(</span><span class="n">coroutines</span><span class="o">.</span><span class="n">iscoroutine</span><span class="p">(</span><span class="n">callback</span><span class="p">)</span> <span class="ow">or</span>
<span class="n">coroutines</span><span class="o">.</span><span class="n">iscoroutinefunction</span><span class="p">(</span><span class="n">callback</span><span class="p">)):</span>
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">"coroutines cannot be used "</span>
<span class="s2">"with add_signal_handler()"</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_check_signal</span><span class="p">(</span><span class="n">sig</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_check_closed</span><span class="p">()</span>
<span class="k">try</span><span class="p">:</span>
<span class="c1"># set_wakeup_fd() raises ValueError if this is not the</span>
<span class="c1"># main thread. By calling it early we ensure that an</span>
<span class="c1"># event loop running in another thread cannot add a signal</span>
<span class="c1"># handler.</span>
<span class="n">signal</span><span class="o">.</span><span class="n">set_wakeup_fd</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_csock</span><span class="o">.</span><span class="n">fileno</span><span class="p">())</span>
<span class="k">except</span> <span class="p">(</span><span class="ne">ValueError</span><span class="p">,</span> <span class="ne">OSError</span><span class="p">)</span> <span class="k">as</span> <span class="n">exc</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">exc</span><span class="p">))</span>
<span class="n">handle</span> <span class="o">=</span> <span class="n">events</span><span class="o">.</span><span class="n">Handle</span><span class="p">(</span><span class="n">callback</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="bp">self</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_signal_handlers</span><span class="p">[</span><span class="n">sig</span><span class="p">]</span> <span class="o">=</span> <span class="n">handle</span>
<span class="k">try</span><span class="p">:</span>
<span class="c1"># Register a dummy signal handler to ask Python to write the signal</span>
<span class="c1"># number in the wakup file descriptor. _process_self_data() will</span>
<span class="c1"># read signal numbers from this file descriptor to handle signals.</span>
<span class="n">signal</span><span class="o">.</span><span class="n">signal</span><span class="p">(</span><span class="n">sig</span><span class="p">,</span> <span class="n">_sighandler_noop</span><span class="p">)</span>
<span class="c1"># Set SA_RESTART to limit EINTR occurrences.</span>
<span class="n">signal</span><span class="o">.</span><span class="n">siginterrupt</span><span class="p">(</span><span class="n">sig</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">OSError</span> <span class="k">as</span> <span class="n">exc</span><span class="p">:</span>
<span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">_signal_handlers</span><span class="p">[</span><span class="n">sig</span><span class="p">]</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_signal_handlers</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">signal</span><span class="o">.</span><span class="n">set_wakeup_fd</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>
<span class="k">except</span> <span class="p">(</span><span class="ne">ValueError</span><span class="p">,</span> <span class="ne">OSError</span><span class="p">)</span> <span class="k">as</span> <span class="n">nexc</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s1">'set_wakeup_fd(-1) failed: </span><span class="si">%s</span><span class="s1">'</span><span class="p">,</span> <span class="n">nexc</span><span class="p">)</span>
<span class="k">if</span> <span class="n">exc</span><span class="o">.</span><span class="n">errno</span> <span class="o">==</span> <span class="n">errno</span><span class="o">.</span><span class="n">EINVAL</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="n">f</span><span class="s1">'sig </span><span class="si">{sig}</span><span class="s1"> cannot be caught'</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span>
<span class="k">def</span> <span class="nf">_handle_signal</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sig</span><span class="p">):</span>
<span class="sd">"""Internal helper that is the actual signal handler."""</span>
<span class="n">handle</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_signal_handlers</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">sig</span><span class="p">)</span>
<span class="k">if</span> <span class="n">handle</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="c1"># Assume it's some race condition.</span>
<span class="k">if</span> <span class="n">handle</span><span class="o">.</span><span class="n">_cancelled</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">remove_signal_handler</span><span class="p">(</span><span class="n">sig</span><span class="p">)</span> <span class="c1"># Remove it properly.</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_add_callback_signalsafe</span><span class="p">(</span><span class="n">handle</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">remove_signal_handler</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sig</span><span class="p">):</span>
<span class="sd">"""Remove a handler for a signal. UNIX only.</span>
<span class="sd"> Return True if a signal handler was removed, False if not.</span>
<span class="sd"> """</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_check_signal</span><span class="p">(</span><span class="n">sig</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">_signal_handlers</span><span class="p">[</span><span class="n">sig</span><span class="p">]</span>
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="k">if</span> <span class="n">sig</span> <span class="o">==</span> <span class="n">signal</span><span class="o">.</span><span class="n">SIGINT</span><span class="p">:</span>
<span class="n">handler</span> <span class="o">=</span> <span class="n">signal</span><span class="o">.</span><span class="n">default_int_handler</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">handler</span> <span class="o">=</span> <span class="n">signal</span><span class="o">.</span><span class="n">SIG_DFL</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">signal</span><span class="o">.</span><span class="n">signal</span><span class="p">(</span><span class="n">sig</span><span class="p">,</span> <span class="n">handler</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">OSError</span> <span class="k">as</span> <span class="n">exc</span><span class="p">:</span>
<span class="k">if</span> <span class="n">exc</span><span class="o">.</span><span class="n">errno</span> <span class="o">==</span> <span class="n">errno</span><span class="o">.</span><span class="n">EINVAL</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="n">f</span><span class="s1">'sig </span><span class="si">{sig}</span><span class="s1"> cannot be caught'</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_signal_handlers</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">signal</span><span class="o">.</span><span class="n">set_wakeup_fd</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>
<span class="k">except</span> <span class="p">(</span><span class="ne">ValueError</span><span class="p">,</span> <span class="ne">OSError</span><span class="p">)</span> <span class="k">as</span> <span class="n">exc</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s1">'set_wakeup_fd(-1) failed: </span><span class="si">%s</span><span class="s1">'</span><span class="p">,</span> <span class="n">exc</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">def</span> <span class="nf">_check_signal</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sig</span><span class="p">):</span>
<span class="sd">"""Internal helper to validate a signal.</span>
<span class="sd"> Raise ValueError if the signal number is invalid or uncatchable.</span>
<span class="sd"> Raise RuntimeError if there is a problem setting up the handler.</span>
<span class="sd"> """</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">sig</span><span class="p">,</span> <span class="nb">int</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="n">f</span><span class="s1">'sig must be an int, not </span><span class="si">{sig!r}</span><span class="s1">'</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="mi">1</span> <span class="o"><=</span> <span class="n">sig</span> <span class="o"><</span> <span class="n">signal</span><span class="o">.</span><span class="n">NSIG</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">f</span><span class="s1">'sig </span><span class="si">{sig}</span><span class="s1"> out of range(1, </span><span class="si">{signal.NSIG}</span><span class="s1">)'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_make_read_pipe_transport</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pipe</span><span class="p">,</span> <span class="n">protocol</span><span class="p">,</span> <span class="n">waiter</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">extra</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="k">return</span> <span class="n">_UnixReadPipeTransport</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pipe</span><span class="p">,</span> <span class="n">protocol</span><span class="p">,</span> <span class="n">waiter</span><span class="p">,</span> <span class="n">extra</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_make_write_pipe_transport</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pipe</span><span class="p">,</span> <span class="n">protocol</span><span class="p">,</span> <span class="n">waiter</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">extra</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="k">return</span> <span class="n">_UnixWritePipeTransport</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pipe</span><span class="p">,</span> <span class="n">protocol</span><span class="p">,</span> <span class="n">waiter</span><span class="p">,</span> <span class="n">extra</span><span class="p">)</span>
<span class="k">async</span> <span class="k">def</span> <span class="nf">_make_subprocess_transport</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">protocol</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">shell</span><span class="p">,</span>
<span class="n">stdin</span><span class="p">,</span> <span class="n">stdout</span><span class="p">,</span> <span class="n">stderr</span><span class="p">,</span> <span class="n">bufsize</span><span class="p">,</span>
<span class="n">extra</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">with</span> <span class="n">events</span><span class="o">.</span><span class="n">get_child_watcher</span><span class="p">()</span> <span class="k">as</span> <span class="n">watcher</span><span class="p">:</span>
<span class="n">waiter</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">create_future</span><span class="p">()</span>
<span class="n">transp</span> <span class="o">=</span> <span class="n">_UnixSubprocessTransport</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">protocol</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">shell</span><span class="p">,</span>
<span class="n">stdin</span><span class="p">,</span> <span class="n">stdout</span><span class="p">,</span> <span class="n">stderr</span><span class="p">,</span> <span class="n">bufsize</span><span class="p">,</span>
<span class="n">waiter</span><span class="o">=</span><span class="n">waiter</span><span class="p">,</span> <span class="n">extra</span><span class="o">=</span><span class="n">extra</span><span class="p">,</span>
<span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="n">watcher</span><span class="o">.</span><span class="n">add_child_handler</span><span class="p">(</span><span class="n">transp</span><span class="o">.</span><span class="n">get_pid</span><span class="p">(),</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_child_watcher_callback</span><span class="p">,</span> <span class="n">transp</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">await</span> <span class="n">waiter</span>
<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
<span class="n">transp</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="k">await</span> <span class="n">transp</span><span class="o">.</span><span class="n">_wait</span><span class="p">()</span>
<span class="k">raise</span>
<span class="k">return</span> <span class="n">transp</span>
<span class="k">def</span> <span class="nf">_child_watcher_callback</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pid</span><span class="p">,</span> <span class="n">returncode</span><span class="p">,</span> <span class="n">transp</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call_soon_threadsafe</span><span class="p">(</span><span class="n">transp</span><span class="o">.</span><span class="n">_process_exited</span><span class="p">,</span> <span class="n">returncode</span><span class="p">)</span>
<span class="k">async</span> <span class="k">def</span> <span class="nf">create_unix_connection</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span> <span class="n">protocol_factory</span><span class="p">,</span> <span class="n">path</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span>
<span class="n">ssl</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">sock</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">server_hostname</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">ssl_handshake_timeout</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="k">assert</span> <span class="n">server_hostname</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">server_hostname</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span>
<span class="k">if</span> <span class="n">ssl</span><span class="p">:</span>
<span class="k">if</span> <span class="n">server_hostname</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
<span class="s1">'you have to pass server_hostname when using ssl'</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="n">server_hostname</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'server_hostname is only meaningful with ssl'</span><span class="p">)</span>
<span class="k">if</span> <span class="n">ssl_handshake_timeout</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
<span class="s1">'ssl_handshake_timeout is only meaningful with ssl'</span><span class="p">)</span>
<span class="k">if</span> <span class="n">path</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">if</span> <span class="n">sock</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
<span class="s1">'path and sock can not be specified at the same time'</span><span class="p">)</span>
<span class="n">path</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">fspath</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
<span class="n">sock</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">socket</span><span class="p">(</span><span class="n">socket</span><span class="o">.</span><span class="n">AF_UNIX</span><span class="p">,</span> <span class="n">socket</span><span class="o">.</span><span class="n">SOCK_STREAM</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">sock</span><span class="o">.</span><span class="n">setblocking</span><span class="p">(</span><span class="kc">False</span><span class="p">)</span>
<span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock_connect</span><span class="p">(</span><span class="n">sock</span><span class="p">,</span> <span class="n">path</span><span class="p">)</span>
<span class="k">except</span><span class="p">:</span>
<span class="n">sock</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="k">raise</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="n">sock</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'no path and sock were specified'</span><span class="p">)</span>
<span class="k">if</span> <span class="p">(</span><span class="n">sock</span><span class="o">.</span><span class="n">family</span> <span class="o">!=</span> <span class="n">socket</span><span class="o">.</span><span class="n">AF_UNIX</span> <span class="ow">or</span>
<span class="n">sock</span><span class="o">.</span><span class="n">type</span> <span class="o">!=</span> <span class="n">socket</span><span class="o">.</span><span class="n">SOCK_STREAM</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
<span class="n">f</span><span class="s1">'A UNIX Domain Stream Socket was expected, got </span><span class="si">{sock!r}</span><span class="s1">'</span><span class="p">)</span>
<span class="n">sock</span><span class="o">.</span><span class="n">setblocking</span><span class="p">(</span><span class="kc">False</span><span class="p">)</span>
<span class="n">transport</span><span class="p">,</span> <span class="n">protocol</span> <span class="o">=</span> <span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">_create_connection_transport</span><span class="p">(</span>
<span class="n">sock</span><span class="p">,</span> <span class="n">protocol_factory</span><span class="p">,</span> <span class="n">ssl</span><span class="p">,</span> <span class="n">server_hostname</span><span class="p">,</span>
<span class="n">ssl_handshake_timeout</span><span class="o">=</span><span class="n">ssl_handshake_timeout</span><span class="p">)</span>
<span class="k">return</span> <span class="n">transport</span><span class="p">,</span> <span class="n">protocol</span>
<span class="k">async</span> <span class="k">def</span> <span class="nf">create_unix_server</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span> <span class="n">protocol_factory</span><span class="p">,</span> <span class="n">path</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span>
<span class="n">sock</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">backlog</span><span class="o">=</span><span class="mi">100</span><span class="p">,</span> <span class="n">ssl</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">ssl_handshake_timeout</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">start_serving</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">ssl</span><span class="p">,</span> <span class="nb">bool</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">'ssl argument must be an SSLContext or None'</span><span class="p">)</span>
<span class="k">if</span> <span class="n">ssl_handshake_timeout</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">ssl</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
<span class="s1">'ssl_handshake_timeout is only meaningful with ssl'</span><span class="p">)</span>
<span class="k">if</span> <span class="n">path</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">if</span> <span class="n">sock</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
<span class="s1">'path and sock can not be specified at the same time'</span><span class="p">)</span>
<span class="n">path</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">fspath</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
<span class="n">sock</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">socket</span><span class="p">(</span><span class="n">socket</span><span class="o">.</span><span class="n">AF_UNIX</span><span class="p">,</span> <span class="n">socket</span><span class="o">.</span><span class="n">SOCK_STREAM</span><span class="p">)</span>
<span class="c1"># Check for abstract socket. `str` and `bytes` paths are supported.</span>
<span class="k">if</span> <span class="n">path</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="s1">'</span><span class="se">\x00</span><span class="s1">'</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">if</span> <span class="n">stat</span><span class="o">.</span><span class="n">S_ISSOCK</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">stat</span><span class="p">(</span><span class="n">path</span><span class="p">)</span><span class="o">.</span><span class="n">st_mode</span><span class="p">):</span>
<span class="n">os</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">FileNotFoundError</span><span class="p">:</span>
<span class="k">pass</span>
<span class="k">except</span> <span class="ne">OSError</span> <span class="k">as</span> <span class="n">err</span><span class="p">:</span>
<span class="c1"># Directory may have permissions only to create socket.</span>
<span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s1">'Unable to check or remove stale UNIX socket '</span>
<span class="s1">'</span><span class="si">%r</span><span class="s1">: </span><span class="si">%r</span><span class="s1">'</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">sock</span><span class="o">.</span><span class="n">bind</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">OSError</span> <span class="k">as</span> <span class="n">exc</span><span class="p">:</span>
<span class="n">sock</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="k">if</span> <span class="n">exc</span><span class="o">.</span><span class="n">errno</span> <span class="o">==</span> <span class="n">errno</span><span class="o">.</span><span class="n">EADDRINUSE</span><span class="p">:</span>
<span class="c1"># Let's improve the error message by adding</span>
<span class="c1"># with what exact address it occurs.</span>
<span class="n">msg</span> <span class="o">=</span> <span class="n">f</span><span class="s1">'Address </span><span class="si">{path!r}</span><span class="s1"> is already in use'</span>
<span class="k">raise</span> <span class="ne">OSError</span><span class="p">(</span><span class="n">errno</span><span class="o">.</span><span class="n">EADDRINUSE</span><span class="p">,</span> <span class="n">msg</span><span class="p">)</span> <span class="kn">from</span> <span class="nn">None</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span>
<span class="k">except</span><span class="p">:</span>
<span class="n">sock</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="k">raise</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="n">sock</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
<span class="s1">'path was not specified, and no sock specified'</span><span class="p">)</span>
<span class="k">if</span> <span class="p">(</span><span class="n">sock</span><span class="o">.</span><span class="n">family</span> <span class="o">!=</span> <span class="n">socket</span><span class="o">.</span><span class="n">AF_UNIX</span> <span class="ow">or</span>
<span class="n">sock</span><span class="o">.</span><span class="n">type</span> <span class="o">!=</span> <span class="n">socket</span><span class="o">.</span><span class="n">SOCK_STREAM</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
<span class="n">f</span><span class="s1">'A UNIX Domain Stream Socket was expected, got </span><span class="si">{sock!r}</span><span class="s1">'</span><span class="p">)</span>
<span class="n">sock</span><span class="o">.</span><span class="n">setblocking</span><span class="p">(</span><span class="kc">False</span><span class="p">)</span>
<span class="n">server</span> <span class="o">=</span> <span class="n">base_events</span><span class="o">.</span><span class="n">Server</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="p">[</span><span class="n">sock</span><span class="p">],</span> <span class="n">protocol_factory</span><span class="p">,</span>
<span class="n">ssl</span><span class="p">,</span> <span class="n">backlog</span><span class="p">,</span> <span class="n">ssl_handshake_timeout</span><span class="p">)</span>
<span class="k">if</span> <span class="n">start_serving</span><span class="p">:</span>
<span class="n">server</span><span class="o">.</span><span class="n">_start_serving</span><span class="p">()</span>
<span class="c1"># Skip one loop iteration so that all 'loop.add_reader'</span>
<span class="c1"># go through.</span>
<span class="k">await</span> <span class="n">tasks</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">loop</span><span class="o">=</span><span class="bp">self</span><span class="p">)</span>
<span class="k">return</span> <span class="n">server</span>
<span class="k">async</span> <span class="k">def</span> <span class="nf">_sock_sendfile_native</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sock</span><span class="p">,</span> <span class="n">file</span><span class="p">,</span> <span class="n">offset</span><span class="p">,</span> <span class="n">count</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">os</span><span class="o">.</span><span class="n">sendfile</span>
<span class="k">except</span> <span class="ne">AttributeError</span> <span class="k">as</span> <span class="n">exc</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">events</span><span class="o">.</span><span class="n">SendfileNotAvailableError</span><span class="p">(</span>
<span class="s2">"os.sendfile() is not available"</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">fileno</span> <span class="o">=</span> <span class="n">file</span><span class="o">.</span><span class="n">fileno</span><span class="p">()</span>
<span class="k">except</span> <span class="p">(</span><span class="ne">AttributeError</span><span class="p">,</span> <span class="n">io</span><span class="o">.</span><span class="n">UnsupportedOperation</span><span class="p">)</span> <span class="k">as</span> <span class="n">err</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">events</span><span class="o">.</span><span class="n">SendfileNotAvailableError</span><span class="p">(</span><span class="s2">"not a regular file"</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">fsize</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">fstat</span><span class="p">(</span><span class="n">fileno</span><span class="p">)</span><span class="o">.</span><span class="n">st_size</span>
<span class="k">except</span> <span class="ne">OSError</span> <span class="k">as</span> <span class="n">err</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">events</span><span class="o">.</span><span class="n">SendfileNotAvailableError</span><span class="p">(</span><span class="s2">"not a regular file"</span><span class="p">)</span>
<span class="n">blocksize</span> <span class="o">=</span> <span class="n">count</span> <span class="k">if</span> <span class="n">count</span> <span class="k">else</span> <span class="n">fsize</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">blocksize</span><span class="p">:</span>
<span class="k">return</span> <span class="mi">0</span> <span class="c1"># empty file</span>
<span class="n">fut</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">create_future</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_sock_sendfile_native_impl</span><span class="p">(</span><span class="n">fut</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="n">sock</span><span class="p">,</span> <span class="n">fileno</span><span class="p">,</span>
<span class="n">offset</span><span class="p">,</span> <span class="n">count</span><span class="p">,</span> <span class="n">blocksize</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="k">return</span> <span class="k">await</span> <span class="n">fut</span>
<span class="k">def</span> <span class="nf">_sock_sendfile_native_impl</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">fut</span><span class="p">,</span> <span class="n">registered_fd</span><span class="p">,</span> <span class="n">sock</span><span class="p">,</span> <span class="n">fileno</span><span class="p">,</span>
<span class="n">offset</span><span class="p">,</span> <span class="n">count</span><span class="p">,</span> <span class="n">blocksize</span><span class="p">,</span> <span class="n">total_sent</span><span class="p">):</span>
<span class="n">fd</span> <span class="o">=</span> <span class="n">sock</span><span class="o">.</span><span class="n">fileno</span><span class="p">()</span>
<span class="k">if</span> <span class="n">registered_fd</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="c1"># Remove the callback early. It should be rare that the</span>
<span class="c1"># selector says the fd is ready but the call still returns</span>
<span class="c1"># EAGAIN, and I am willing to take a hit in that case in</span>
<span class="c1"># order to simplify the common case.</span>
<span class="bp">self</span><span class="o">.</span><span class="n">remove_writer</span><span class="p">(</span><span class="n">registered_fd</span><span class="p">)</span>
<span class="k">if</span> <span class="n">fut</span><span class="o">.</span><span class="n">cancelled</span><span class="p">():</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_sock_sendfile_update_filepos</span><span class="p">(</span><span class="n">fileno</span><span class="p">,</span> <span class="n">offset</span><span class="p">,</span> <span class="n">total_sent</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="n">count</span><span class="p">:</span>
<span class="n">blocksize</span> <span class="o">=</span> <span class="n">count</span> <span class="o">-</span> <span class="n">total_sent</span>
<span class="k">if</span> <span class="n">blocksize</span> <span class="o"><=</span> <span class="mi">0</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_sock_sendfile_update_filepos</span><span class="p">(</span><span class="n">fileno</span><span class="p">,</span> <span class="n">offset</span><span class="p">,</span> <span class="n">total_sent</span><span class="p">)</span>
<span class="n">fut</span><span class="o">.</span><span class="n">set_result</span><span class="p">(</span><span class="n">total_sent</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">sent</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">sendfile</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="n">fileno</span><span class="p">,</span> <span class="n">offset</span><span class="p">,</span> <span class="n">blocksize</span><span class="p">)</span>
<span class="k">except</span> <span class="p">(</span><span class="ne">BlockingIOError</span><span class="p">,</span> <span class="ne">InterruptedError</span><span class="p">):</span>
<span class="k">if</span> <span class="n">registered_fd</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_sock_add_cancellation_callback</span><span class="p">(</span><span class="n">fut</span><span class="p">,</span> <span class="n">sock</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">add_writer</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sock_sendfile_native_impl</span><span class="p">,</span> <span class="n">fut</span><span class="p">,</span>
<span class="n">fd</span><span class="p">,</span> <span class="n">sock</span><span class="p">,</span> <span class="n">fileno</span><span class="p">,</span>
<span class="n">offset</span><span class="p">,</span> <span class="n">count</span><span class="p">,</span> <span class="n">blocksize</span><span class="p">,</span> <span class="n">total_sent</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">OSError</span> <span class="k">as</span> <span class="n">exc</span><span class="p">:</span>
<span class="k">if</span> <span class="p">(</span><span class="n">registered_fd</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span>
<span class="n">exc</span><span class="o">.</span><span class="n">errno</span> <span class="o">==</span> <span class="n">errno</span><span class="o">.</span><span class="n">ENOTCONN</span> <span class="ow">and</span>
<span class="nb">type</span><span class="p">(</span><span class="n">exc</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="ne">ConnectionError</span><span class="p">):</span>
<span class="c1"># If we have an ENOTCONN and this isn't a first call to</span>
<span class="c1"># sendfile(), i.e. the connection was closed in the middle</span>
<span class="c1"># of the operation, normalize the error to ConnectionError</span>
<span class="c1"># to make it consistent across all Posix systems.</span>
<span class="n">new_exc</span> <span class="o">=</span> <span class="ne">ConnectionError</span><span class="p">(</span>
<span class="s2">"socket is not connected"</span><span class="p">,</span> <span class="n">errno</span><span class="o">.</span><span class="n">ENOTCONN</span><span class="p">)</span>
<span class="n">new_exc</span><span class="o">.</span><span class="n">__cause__</span> <span class="o">=</span> <span class="n">exc</span>
<span class="n">exc</span> <span class="o">=</span> <span class="n">new_exc</span>
<span class="k">if</span> <span class="n">total_sent</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="c1"># We can get here for different reasons, the main</span>
<span class="c1"># one being 'file' is not a regular mmap(2)-like</span>
<span class="c1"># file, in which case we'll fall back on using</span>
<span class="c1"># plain send().</span>
<span class="n">err</span> <span class="o">=</span> <span class="n">events</span><span class="o">.</span><span class="n">SendfileNotAvailableError</span><span class="p">(</span>
<span class="s2">"os.sendfile call failed"</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_sock_sendfile_update_filepos</span><span class="p">(</span><span class="n">fileno</span><span class="p">,</span> <span class="n">offset</span><span class="p">,</span> <span class="n">total_sent</span><span class="p">)</span>
<span class="n">fut</span><span class="o">.</span><span class="n">set_exception</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_sock_sendfile_update_filepos</span><span class="p">(</span><span class="n">fileno</span><span class="p">,</span> <span class="n">offset</span><span class="p">,</span> <span class="n">total_sent</span><span class="p">)</span>
<span class="n">fut</span><span class="o">.</span><span class="n">set_exception</span><span class="p">(</span><span class="n">exc</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">exc</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_sock_sendfile_update_filepos</span><span class="p">(</span><span class="n">fileno</span><span class="p">,</span> <span class="n">offset</span><span class="p">,</span> <span class="n">total_sent</span><span class="p">)</span>
<span class="n">fut</span><span class="o">.</span><span class="n">set_exception</span><span class="p">(</span><span class="n">exc</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="n">sent</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="c1"># EOF</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_sock_sendfile_update_filepos</span><span class="p">(</span><span class="n">fileno</span><span class="p">,</span> <span class="n">offset</span><span class="p">,</span> <span class="n">total_sent</span><span class="p">)</span>
<span class="n">fut</span><span class="o">.</span><span class="n">set_result</span><span class="p">(</span><span class="n">total_sent</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">offset</span> <span class="o">+=</span> <span class="n">sent</span>
<span class="n">total_sent</span> <span class="o">+=</span> <span class="n">sent</span>
<span class="k">if</span> <span class="n">registered_fd</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_sock_add_cancellation_callback</span><span class="p">(</span><span class="n">fut</span><span class="p">,</span> <span class="n">sock</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">add_writer</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sock_sendfile_native_impl</span><span class="p">,</span> <span class="n">fut</span><span class="p">,</span>
<span class="n">fd</span><span class="p">,</span> <span class="n">sock</span><span class="p">,</span> <span class="n">fileno</span><span class="p">,</span>
<span class="n">offset</span><span class="p">,</span> <span class="n">count</span><span class="p">,</span> <span class="n">blocksize</span><span class="p">,</span> <span class="n">total_sent</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_sock_sendfile_update_filepos</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">fileno</span><span class="p">,</span> <span class="n">offset</span><span class="p">,</span> <span class="n">total_sent</span><span class="p">):</span>
<span class="k">if</span> <span class="n">total_sent</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span>
<span class="n">os</span><span class="o">.</span><span class="n">lseek</span><span class="p">(</span><span class="n">fileno</span><span class="p">,</span> <span class="n">offset</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">SEEK_SET</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_sock_add_cancellation_callback</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">fut</span><span class="p">,</span> <span class="n">sock</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">cb</span><span class="p">(</span><span class="n">fut</span><span class="p">):</span>
<span class="k">if</span> <span class="n">fut</span><span class="o">.</span><span class="n">cancelled</span><span class="p">():</span>
<span class="n">fd</span> <span class="o">=</span> <span class="n">sock</span><span class="o">.</span><span class="n">fileno</span><span class="p">()</span>
<span class="k">if</span> <span class="n">fd</span> <span class="o">!=</span> <span class="o">-</span><span class="mi">1</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">remove_writer</span><span class="p">(</span><span class="n">fd</span><span class="p">)</span>
<span class="n">fut</span><span class="o">.</span><span class="n">add_done_callback</span><span class="p">(</span><span class="n">cb</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">_UnixReadPipeTransport</span><span class="p">(</span><span class="n">transports</span><span class="o">.</span><span class="n">ReadTransport</span><span class="p">):</span>
<span class="n">max_size</span> <span class="o">=</span> <span class="mi">256</span> <span class="o">*</span> <span class="mi">1024</span> <span class="c1"># max bytes we read in one event loop iteration</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">loop</span><span class="p">,</span> <span class="n">pipe</span><span class="p">,</span> <span class="n">protocol</span><span class="p">,</span> <span class="n">waiter</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">extra</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">extra</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_extra</span><span class="p">[</span><span class="s1">'pipe'</span><span class="p">]</span> <span class="o">=</span> <span class="n">pipe</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_loop</span> <span class="o">=</span> <span class="n">loop</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_pipe</span> <span class="o">=</span> <span class="n">pipe</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_fileno</span> <span class="o">=</span> <span class="n">pipe</span><span class="o">.</span><span class="n">fileno</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_protocol</span> <span class="o">=</span> <span class="n">protocol</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_closing</span> <span class="o">=</span> <span class="kc">False</span>
<span class="n">mode</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">fstat</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_fileno</span><span class="p">)</span><span class="o">.</span><span class="n">st_mode</span>
<span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">stat</span><span class="o">.</span><span class="n">S_ISFIFO</span><span class="p">(</span><span class="n">mode</span><span class="p">)</span> <span class="ow">or</span>
<span class="n">stat</span><span class="o">.</span><span class="n">S_ISSOCK</span><span class="p">(</span><span class="n">mode</span><span class="p">)</span> <span class="ow">or</span>
<span class="n">stat</span><span class="o">.</span><span class="n">S_ISCHR</span><span class="p">(</span><span class="n">mode</span><span class="p">)):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_pipe</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_fileno</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_protocol</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"Pipe transport is for pipes/sockets only."</span><span class="p">)</span>
<span class="n">os</span><span class="o">.</span><span class="n">set_blocking</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_fileno</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_loop</span><span class="o">.</span><span class="n">call_soon</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_protocol</span><span class="o">.</span><span class="n">connection_made</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
<span class="c1"># only start reading when connection_made() has been called</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_loop</span><span class="o">.</span><span class="n">call_soon</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_loop</span><span class="o">.</span><span class="n">_add_reader</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_fileno</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_read_ready</span><span class="p">)</span>
<span class="k">if</span> <span class="n">waiter</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="c1"># only wake up the waiter when connection_made() has been called</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_loop</span><span class="o">.</span><span class="n">call_soon</span><span class="p">(</span><span class="n">futures</span><span class="o">.</span><span class="n">_set_result_unless_cancelled</span><span class="p">,</span>
<span class="n">waiter</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">info</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="p">]</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_pipe</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">info</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">'closed'</span><span class="p">)</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">_closing</span><span class="p">:</span>
<span class="n">info</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">'closing'</span><span class="p">)</span>
<span class="n">info</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">f</span><span class="s1">'fd=</span><span class="si">{self._fileno}</span><span class="s1">'</span><span class="p">)</span>
<span class="n">selector</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_loop</span><span class="p">,</span> <span class="s1">'_selector'</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_pipe</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">selector</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">polling</span> <span class="o">=</span> <span class="n">selector_events</span><span class="o">.</span><span class="n">_test_selector_event</span><span class="p">(</span>
<span class="n">selector</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_fileno</span><span class="p">,</span> <span class="n">selectors</span><span class="o">.</span><span class="n">EVENT_READ</span><span class="p">)</span>
<span class="k">if</span> <span class="n">polling</span><span class="p">:</span>
<span class="n">info</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">'polling'</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">info</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">'idle'</span><span class="p">)</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">_pipe</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">info</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">'open'</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">info</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">'closed'</span><span class="p">)</span>
<span class="k">return</span> <span class="s1">'<</span><span class="si">{}</span><span class="s1">>'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="s1">' '</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">info</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">_read_ready</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_fileno</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_size</span><span class="p">)</span>
<span class="k">except</span> <span class="p">(</span><span class="ne">BlockingIOError</span><span class="p">,</span> <span class="ne">InterruptedError</span><span class="p">):</span>
<span class="k">pass</span>
<span class="k">except</span> <span class="ne">OSError</span> <span class="k">as</span> <span class="n">exc</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_fatal_error</span><span class="p">(</span><span class="n">exc</span><span class="p">,</span> <span class="s1">'Fatal read error on pipe transport'</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="n">data</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_protocol</span><span class="o">.</span><span class="n">data_received</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_loop</span><span class="o">.</span><span class="n">get_debug</span><span class="p">():</span>
<span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">"</span><span class="si">%r</span><span class="s2"> was closed by peer"</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_closing</span> <span class="o">=</span> <span class="kc">True</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_loop</span><span class="o">.</span><span class="n">_remove_reader</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_fileno</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_loop</span><span class="o">.</span><span class="n">call_soon</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_protocol</span><span class="o">.</span><span class="n">eof_received</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_loop</span><span class="o">.</span><span class="n">call_soon</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_call_connection_lost</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">pause_reading</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_loop</span><span class="o">.</span><span class="n">_remove_reader</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_fileno</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">resume_reading</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_loop</span><span class="o">.</span><span class="n">_add_reader</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_fileno</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_read_ready</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">set_protocol</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">protocol</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_protocol</span> <span class="o">=</span> <span class="n">protocol</span>
<span class="k">def</span> <span class="nf">get_protocol</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_protocol</span>
<span class="k">def</span> <span class="nf">is_closing</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_closing</span>
<span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_closing</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_close</span><span class="p">(</span><span class="kc">None</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">__del__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_pipe</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="n">f</span><span class="s2">"unclosed transport </span><span class="si">{self!r}</span><span class="s2">"</span><span class="p">,</span> <span class="ne">ResourceWarning</span><span class="p">,</span>
<span class="n">source</span><span class="o">=</span><span class="bp">self</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_pipe</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">_fatal_error</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exc</span><span class="p">,</span> <span class="n">message</span><span class="o">=</span><span class="s1">'Fatal error on pipe transport'</span><span class="p">):</span>
<span class="c1"># should be called by exception handler only</span>
<span class="k">if</span> <span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">exc</span><span class="p">,</span> <span class="ne">OSError</span><span class="p">)</span> <span class="ow">and</span> <span class="n">exc</span><span class="o">.</span><span class="n">errno</span> <span class="o">==</span> <span class="n">errno</span><span class="o">.</span><span class="n">EIO</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_loop</span><span class="o">.</span><span class="n">get_debug</span><span class="p">():</span>
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">"</span><span class="si">%r</span><span class="s2">: </span><span class="si">%s</span><span class="s2">"</span><span class="p">,</span> <span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> <span class="n">exc_info</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_loop</span><span class="o">.</span><span class="n">call_exception_handler</span><span class="p">({</span>
<span class="s1">'message'</span><span class="p">:</span> <span class="n">message</span><span class="p">,</span>
<span class="s1">'exception'</span><span class="p">:</span> <span class="n">exc</span><span class="p">,</span>
<span class="s1">'transport'</span><span class="p">:</span> <span class="bp">self</span><span class="p">,</span>
<span class="s1">'protocol'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_protocol</span><span class="p">,</span>
<span class="p">})</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_close</span><span class="p">(</span><span class="n">exc</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_close</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exc</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_closing</span> <span class="o">=</span> <span class="kc">True</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_loop</span><span class="o">.</span><span class="n">_remove_reader</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_fileno</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_loop</span><span class="o">.</span><span class="n">call_soon</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_call_connection_lost</span><span class="p">,</span> <span class="n">exc</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_call_connection_lost</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exc</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_protocol</span><span class="o">.</span><span class="n">connection_lost</span><span class="p">(</span><span class="n">exc</span><span class="p">)</span>
<span class="k">finally</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_pipe</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_pipe</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_protocol</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_loop</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">class</span> <span class="nc">_UnixWritePipeTransport</span><span class="p">(</span><span class="n">transports</span><span class="o">.</span><span class="n">_FlowControlMixin</span><span class="p">,</span>
<span class="n">transports</span><span class="o">.</span><span class="n">WriteTransport</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">loop</span><span class="p">,</span> <span class="n">pipe</span><span class="p">,</span> <span class="n">protocol</span><span class="p">,</span> <span class="n">waiter</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">extra</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">extra</span><span class="p">,</span> <span class="n">loop</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_extra</span><span class="p">[</span><span class="s1">'pipe'</span><span class="p">]</span> <span class="o">=</span> <span class="n">pipe</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_pipe</span> <span class="o">=</span> <span class="n">pipe</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_fileno</span> <span class="o">=</span> <span class="n">pipe</span><span class="o">.</span><span class="n">fileno</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_protocol</span> <span class="o">=</span> <span class="n">protocol</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_buffer</span> <span class="o">=</span> <span class="nb">bytearray</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_conn_lost</span> <span class="o">=</span> <span class="mi">0</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_closing</span> <span class="o">=</span> <span class="kc">False</span> <span class="c1"># Set when close() or write_eof() called.</span>
<span class="n">mode</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">fstat</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_fileno</span><span class="p">)</span><span class="o">.</span><span class="n">st_mode</span>
<span class="n">is_char</span> <span class="o">=</span> <span class="n">stat</span><span class="o">.</span><span class="n">S_ISCHR</span><span class="p">(</span><span class="n">mode</span><span class="p">)</span>
<span class="n">is_fifo</span> <span class="o">=</span> <span class="n">stat</span><span class="o">.</span><span class="n">S_ISFIFO</span><span class="p">(</span><span class="n">mode</span><span class="p">)</span>
<span class="n">is_socket</span> <span class="o">=</span> <span class="n">stat</span><span class="o">.</span><span class="n">S_ISSOCK</span><span class="p">(</span><span class="n">mode</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">is_char</span> <span class="ow">or</span> <span class="n">is_fifo</span> <span class="ow">or</span> <span class="n">is_socket</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_pipe</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_fileno</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_protocol</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"Pipe transport is only for "</span>
<span class="s2">"pipes, sockets and character devices"</span><span class="p">)</span>
<span class="n">os</span><span class="o">.</span><span class="n">set_blocking</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_fileno</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_loop</span><span class="o">.</span><span class="n">call_soon</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_protocol</span><span class="o">.</span><span class="n">connection_made</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
<span class="c1"># On AIX, the reader trick (to be notified when the read end of the</span>
<span class="c1"># socket is closed) only works for sockets. On other platforms it</span>
<span class="c1"># works for pipes and sockets. (Exception: OS X 10.4? Issue #19294.)</span>
<span class="k">if</span> <span class="n">is_socket</span> <span class="ow">or</span> <span class="p">(</span><span class="n">is_fifo</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">sys</span><span class="o">.</span><span class="n">platform</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">"aix"</span><span class="p">)):</span>
<span class="c1"># only start reading when connection_made() has been called</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_loop</span><span class="o">.</span><span class="n">call_soon</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_loop</span><span class="o">.</span><span class="n">_add_reader</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_fileno</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_read_ready</span><span class="p">)</span>
<span class="k">if</span> <span class="n">waiter</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="c1"># only wake up the waiter when connection_made() has been called</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_loop</span><span class="o">.</span><span class="n">call_soon</span><span class="p">(</span><span class="n">futures</span><span class="o">.</span><span class="n">_set_result_unless_cancelled</span><span class="p">,</span>
<span class="n">waiter</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">info</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="p">]</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_pipe</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">info</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">'closed'</span><span class="p">)</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">_closing</span><span class="p">:</span>
<span class="n">info</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">'closing'</span><span class="p">)</span>
<span class="n">info</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">f</span><span class="s1">'fd=</span><span class="si">{self._fileno}</span><span class="s1">'</span><span class="p">)</span>
<span class="n">selector</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_loop</span><span class="p">,</span> <span class="s1">'_selector'</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_pipe</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">selector</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">polling</span> <span class="o">=</span> <span class="n">selector_events</span><span class="o">.</span><span class="n">_test_selector_event</span><span class="p">(</span>
<span class="n">selector</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_fileno</span><span class="p">,</span> <span class="n">selectors</span><span class="o">.</span><span class="n">EVENT_WRITE</span><span class="p">)</span>
<span class="k">if</span> <span class="n">polling</span><span class="p">:</span>
<span class="n">info</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">'polling'</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">info</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">'idle'</span><span class="p">)</span>
<span class="n">bufsize</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_write_buffer_size</span><span class="p">()</span>
<span class="n">info</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">f</span><span class="s1">'bufsize=</span><span class="si">{bufsize}</span><span class="s1">'</span><span class="p">)</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">_pipe</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">info</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">'open'</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">info</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">'closed'</span><span class="p">)</span>
<span class="k">return</span> <span class="s1">'<</span><span class="si">{}</span><span class="s1">>'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="s1">' '</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">info</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">get_write_buffer_size</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_buffer</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_read_ready</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># Pipe was closed by peer.</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_loop</span><span class="o">.</span><span class="n">get_debug</span><span class="p">():</span>
<span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">"</span><span class="si">%r</span><span class="s2"> was closed by peer"</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_buffer</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_close</span><span class="p">(</span><span class="ne">BrokenPipeError</span><span class="p">())</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_close</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">write</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
<span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="p">(</span><span class="nb">bytes</span><span class="p">,</span> <span class="nb">bytearray</span><span class="p">,</span> <span class="nb">memoryview</span><span class="p">)),</span> <span class="nb">repr</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="nb">bytearray</span><span class="p">):</span>
<span class="n">data</span> <span class="o">=</span> <span class="nb">memoryview</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">data</span><span class="p">:</span>
<span class="k">return</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_conn_lost</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">_closing</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_conn_lost</span> <span class="o">>=</span> <span class="n">constants</span><span class="o">.</span><span class="n">LOG_THRESHOLD_FOR_CONNLOST_WRITES</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s1">'pipe closed by peer or '</span>
<span class="s1">'os.write(pipe, data) raised exception.'</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_conn_lost</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">return</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_buffer</span><span class="p">:</span>
<span class="c1"># Attempt to send it right away first.</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">n</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_fileno</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
<span class="k">except</span> <span class="p">(</span><span class="ne">BlockingIOError</span><span class="p">,</span> <span class="ne">InterruptedError</span><span class="p">):</span>
<span class="n">n</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">exc</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_conn_lost</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_fatal_error</span><span class="p">(</span><span class="n">exc</span><span class="p">,</span> <span class="s1">'Fatal write error on pipe transport'</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="n">n</span> <span class="o">==</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">):</span>
<span class="k">return</span>
<span class="k">elif</span> <span class="n">n</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span>
<span class="n">data</span> <span class="o">=</span> <span class="nb">memoryview</span><span class="p">(</span><span class="n">data</span><span class="p">)[</span><span class="n">n</span><span class="p">:]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_loop</span><span class="o">.</span><span class="n">_add_writer</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_fileno</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_write_ready</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_buffer</span> <span class="o">+=</span> <span class="n">data</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_maybe_pause_protocol</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">_write_ready</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">_buffer</span><span class="p">,</span> <span class="s1">'Data should not be empty'</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">n</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_fileno</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_buffer</span><span class="p">)</span>
<span class="k">except</span> <span class="p">(</span><span class="ne">BlockingIOError</span><span class="p">,</span> <span class="ne">InterruptedError</span><span class="p">):</span>
<span class="k">pass</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">exc</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_buffer</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_conn_lost</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="c1"># Remove writer here, _fatal_error() doesn't it</span>
<span class="c1"># because _buffer is empty.</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_loop</span><span class="o">.</span><span class="n">_remove_writer</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_fileno</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_fatal_error</span><span class="p">(</span><span class="n">exc</span><span class="p">,</span> <span class="s1">'Fatal write error on pipe transport'</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="n">n</span> <span class="o">==</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_buffer</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_buffer</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_loop</span><span class="o">.</span><span class="n">_remove_writer</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_fileno</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_maybe_resume_protocol</span><span class="p">()</span> <span class="c1"># May append to buffer.</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_closing</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_loop</span><span class="o">.</span><span class="n">_remove_reader</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_fileno</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_call_connection_lost</span><span class="p">(</span><span class="kc">None</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">elif</span> <span class="n">n</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span>
<span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">_buffer</span><span class="p">[:</span><span class="n">n</span><span class="p">]</span>
<span class="k">def</span> <span class="nf">can_write_eof</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">def</span> <span class="nf">write_eof</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_closing</span><span class="p">:</span>
<span class="k">return</span>
<span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">_pipe</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_closing</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_buffer</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_loop</span><span class="o">.</span><span class="n">_remove_reader</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_fileno</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_loop</span><span class="o">.</span><span class="n">call_soon</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_call_connection_lost</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">set_protocol</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">protocol</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_protocol</span> <span class="o">=</span> <span class="n">protocol</span>
<span class="k">def</span> <span class="nf">get_protocol</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_protocol</span>
<span class="k">def</span> <span class="nf">is_closing</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_closing</span>
<span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_pipe</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_closing</span><span class="p">:</span>
<span class="c1"># write_eof is all what we needed to close the write pipe</span>
<span class="bp">self</span><span class="o">.</span><span class="n">write_eof</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">__del__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_pipe</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="n">f</span><span class="s2">"unclosed transport </span><span class="si">{self!r}</span><span class="s2">"</span><span class="p">,</span> <span class="ne">ResourceWarning</span><span class="p">,</span>
<span class="n">source</span><span class="o">=</span><span class="bp">self</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_pipe</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">abort</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_close</span><span class="p">(</span><span class="kc">None</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_fatal_error</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exc</span><span class="p">,</span> <span class="n">message</span><span class="o">=</span><span class="s1">'Fatal error on pipe transport'</span><span class="p">):</span>
<span class="c1"># should be called by exception handler only</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">exc</span><span class="p">,</span> <span class="ne">OSError</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_loop</span><span class="o">.</span><span class="n">get_debug</span><span class="p">():</span>
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">"</span><span class="si">%r</span><span class="s2">: </span><span class="si">%s</span><span class="s2">"</span><span class="p">,</span> <span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> <span class="n">exc_info</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_loop</span><span class="o">.</span><span class="n">call_exception_handler</span><span class="p">({</span>
<span class="s1">'message'</span><span class="p">:</span> <span class="n">message</span><span class="p">,</span>
<span class="s1">'exception'</span><span class="p">:</span> <span class="n">exc</span><span class="p">,</span>
<span class="s1">'transport'</span><span class="p">:</span> <span class="bp">self</span><span class="p">,</span>
<span class="s1">'protocol'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_protocol</span><span class="p">,</span>
<span class="p">})</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_close</span><span class="p">(</span><span class="n">exc</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_close</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exc</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_closing</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_buffer</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_loop</span><span class="o">.</span><span class="n">_remove_writer</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_fileno</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_buffer</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_loop</span><span class="o">.</span><span class="n">_remove_reader</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_fileno</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_loop</span><span class="o">.</span><span class="n">call_soon</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_call_connection_lost</span><span class="p">,</span> <span class="n">exc</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_call_connection_lost</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exc</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_protocol</span><span class="o">.</span><span class="n">connection_lost</span><span class="p">(</span><span class="n">exc</span><span class="p">)</span>
<span class="k">finally</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_pipe</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_pipe</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_protocol</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_loop</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">class</span> <span class="nc">_UnixSubprocessTransport</span><span class="p">(</span><span class="n">base_subprocess</span><span class="o">.</span><span class="n">BaseSubprocessTransport</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">_start</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">shell</span><span class="p">,</span> <span class="n">stdin</span><span class="p">,</span> <span class="n">stdout</span><span class="p">,</span> <span class="n">stderr</span><span class="p">,</span> <span class="n">bufsize</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="n">stdin_w</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">if</span> <span class="n">stdin</span> <span class="o">==</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">PIPE</span><span class="p">:</span>
<span class="c1"># Use a socket pair for stdin, since not all platforms</span>
<span class="c1"># support selecting read events on the write end of a</span>
<span class="c1"># socket (which we use in order to detect closing of the</span>
<span class="c1"># other end). Notably this is needed on AIX, and works</span>
<span class="c1"># just fine on other platforms.</span>
<span class="n">stdin</span><span class="p">,</span> <span class="n">stdin_w</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">socketpair</span><span class="p">()</span>
<span class="k">try</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_proc</span> <span class="o">=</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">Popen</span><span class="p">(</span>
<span class="n">args</span><span class="p">,</span> <span class="n">shell</span><span class="o">=</span><span class="n">shell</span><span class="p">,</span> <span class="n">stdin</span><span class="o">=</span><span class="n">stdin</span><span class="p">,</span> <span class="n">stdout</span><span class="o">=</span><span class="n">stdout</span><span class="p">,</span> <span class="n">stderr</span><span class="o">=</span><span class="n">stderr</span><span class="p">,</span>
<span class="n">universal_newlines</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">bufsize</span><span class="o">=</span><span class="n">bufsize</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="k">if</span> <span class="n">stdin_w</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">stdin</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_proc</span><span class="o">.</span><span class="n">stdin</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">stdin_w</span><span class="o">.</span><span class="n">detach</span><span class="p">(),</span> <span class="s1">'wb'</span><span class="p">,</span> <span class="n">buffering</span><span class="o">=</span><span class="n">bufsize</span><span class="p">)</span>
<span class="n">stdin_w</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">finally</span><span class="p">:</span>
<span class="k">if</span> <span class="n">stdin_w</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">stdin</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="n">stdin_w</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="k">class</span> <span class="nc">AbstractChildWatcher</span><span class="p">:</span>
<span class="sd">"""Abstract base class for monitoring child processes.</span>
<span class="sd"> Objects derived from this class monitor a collection of subprocesses and</span>
<span class="sd"> report their termination or interruption by a signal.</span>
<span class="sd"> New callbacks are registered with .add_child_handler(). Starting a new</span>
<span class="sd"> process must be done within a 'with' block to allow the watcher to suspend</span>
<span class="sd"> its activity until the new process if fully registered (this is needed to</span>
<span class="sd"> prevent a race condition in some implementations).</span>
<span class="sd"> Example:</span>
<span class="sd"> with watcher:</span>
<span class="sd"> proc = subprocess.Popen("sleep 1")</span>
<span class="sd"> watcher.add_child_handler(proc.pid, callback)</span>
<span class="sd"> Notes:</span>
<span class="sd"> Implementations of this class must be thread-safe.</span>
<span class="sd"> Since child watcher objects may catch the SIGCHLD signal and call</span>
<span class="sd"> waitpid(-1), there should be only one active object per process.</span>
<span class="sd"> """</span>
<span class="k">def</span> <span class="nf">add_child_handler</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pid</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
<span class="sd">"""Register a new child handler.</span>
<span class="sd"> Arrange for callback(pid, returncode, *args) to be called when</span>
<span class="sd"> process 'pid' terminates. Specifying another callback for the same</span>
<span class="sd"> process replaces the previous handler.</span>
<span class="sd"> Note: callback() must be thread-safe.</span>
<span class="sd"> """</span>
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">remove_child_handler</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pid</span><span class="p">):</span>
<span class="sd">"""Removes the handler for process 'pid'.</span>
<span class="sd"> The function returns True if the handler was successfully removed,</span>
<span class="sd"> False if there was nothing to remove."""</span>
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">attach_loop</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">loop</span><span class="p">):</span>
<span class="sd">"""Attach the watcher to an event loop.</span>
<span class="sd"> If the watcher was previously attached to an event loop, then it is</span>
<span class="sd"> first detached before attaching to the new loop.</span>
<span class="sd"> Note: loop may be None.</span>
<span class="sd"> """</span>
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">"""Close the watcher.</span>
<span class="sd"> This must be called to make sure that any underlying resource is freed.</span>
<span class="sd"> """</span>
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">__enter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">"""Enter the watcher's context and allow starting new processes</span>
<span class="sd"> This function must return self"""</span>
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">__exit__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">):</span>
<span class="sd">"""Exit the watcher's context"""</span>
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
<span class="k">class</span> <span class="nc">BaseChildWatcher</span><span class="p">(</span><span class="n">AbstractChildWatcher</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_loop</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_callbacks</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">attach_loop</span><span class="p">(</span><span class="kc">None</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_do_waitpid</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expected_pid</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">_do_waitpid_all</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">attach_loop</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">loop</span><span class="p">):</span>
<span class="k">assert</span> <span class="n">loop</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">loop</span><span class="p">,</span> <span class="n">events</span><span class="o">.</span><span class="n">AbstractEventLoop</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_loop</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">loop</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_callbacks</span><span class="p">:</span>
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span>
<span class="s1">'A loop is being detached '</span>
<span class="s1">'from a child watcher with pending handlers'</span><span class="p">,</span>
<span class="ne">RuntimeWarning</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_loop</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_loop</span><span class="o">.</span><span class="n">remove_signal_handler</span><span class="p">(</span><span class="n">signal</span><span class="o">.</span><span class="n">SIGCHLD</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_loop</span> <span class="o">=</span> <span class="n">loop</span>
<span class="k">if</span> <span class="n">loop</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">loop</span><span class="o">.</span><span class="n">add_signal_handler</span><span class="p">(</span><span class="n">signal</span><span class="o">.</span><span class="n">SIGCHLD</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sig_chld</span><span class="p">)</span>
<span class="c1"># Prevent a race condition in case a child terminated</span>
<span class="c1"># during the switch.</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_do_waitpid_all</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">_sig_chld</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_do_waitpid_all</span><span class="p">()</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">exc</span><span class="p">:</span>
<span class="c1"># self._loop should always be available here</span>
<span class="c1"># as '_sig_chld' is added as a signal handler</span>
<span class="c1"># in 'attach_loop'</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_loop</span><span class="o">.</span><span class="n">call_exception_handler</span><span class="p">({</span>
<span class="s1">'message'</span><span class="p">:</span> <span class="s1">'Unknown exception in SIGCHLD handler'</span><span class="p">,</span>
<span class="s1">'exception'</span><span class="p">:</span> <span class="n">exc</span><span class="p">,</span>
<span class="p">})</span>
<span class="k">def</span> <span class="nf">_compute_returncode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">status</span><span class="p">):</span>
<span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">WIFSIGNALED</span><span class="p">(</span><span class="n">status</span><span class="p">):</span>
<span class="c1"># The child process died because of a signal.</span>
<span class="k">return</span> <span class="o">-</span><span class="n">os</span><span class="o">.</span><span class="n">WTERMSIG</span><span class="p">(</span><span class="n">status</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">os</span><span class="o">.</span><span class="n">WIFEXITED</span><span class="p">(</span><span class="n">status</span><span class="p">):</span>
<span class="c1"># The child process exited (e.g sys.exit()).</span>
<span class="k">return</span> <span class="n">os</span><span class="o">.</span><span class="n">WEXITSTATUS</span><span class="p">(</span><span class="n">status</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># The child exited, but we don't understand its status.</span>
<span class="c1"># This shouldn't happen, but if it does, let's just</span>
<span class="c1"># return that status; perhaps that helps debug it.</span>
<span class="k">return</span> <span class="n">status</span>
<span class="k">class</span> <span class="nc">SafeChildWatcher</span><span class="p">(</span><span class="n">BaseChildWatcher</span><span class="p">):</span>
<span class="sd">"""'Safe' child watcher implementation.</span>
<span class="sd"> This implementation avoids disrupting other code spawning processes by</span>
<span class="sd"> polling explicitly each process in the SIGCHLD handler instead of calling</span>
<span class="sd"> os.waitpid(-1).</span>
<span class="sd"> This is a safe solution but it has a significant overhead when handling a</span>
<span class="sd"> big number of children (O(n) each time SIGCHLD is raised)</span>
<span class="sd"> """</span>
<span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_callbacks</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">__enter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span>
<span class="k">def</span> <span class="nf">__exit__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">):</span>
<span class="k">pass</span>
<span class="k">def</span> <span class="nf">add_child_handler</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pid</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_loop</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span>
<span class="s2">"Cannot add child handler, "</span>
<span class="s2">"the child watcher does not have a loop attached"</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_callbacks</span><span class="p">[</span><span class="n">pid</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">callback</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
<span class="c1"># Prevent a race condition in case the child is already terminated.</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_do_waitpid</span><span class="p">(</span><span class="n">pid</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">remove_child_handler</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pid</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">_callbacks</span><span class="p">[</span><span class="n">pid</span><span class="p">]</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="k">def</span> <span class="nf">_do_waitpid_all</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">for</span> <span class="n">pid</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_callbacks</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_do_waitpid</span><span class="p">(</span><span class="n">pid</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_do_waitpid</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expected_pid</span><span class="p">):</span>
<span class="k">assert</span> <span class="n">expected_pid</span> <span class="o">></span> <span class="mi">0</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">pid</span><span class="p">,</span> <span class="n">status</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">waitpid</span><span class="p">(</span><span class="n">expected_pid</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">WNOHANG</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">ChildProcessError</span><span class="p">:</span>
<span class="c1"># The child process is already reaped</span>
<span class="c1"># (may happen if waitpid() is called elsewhere).</span>
<span class="n">pid</span> <span class="o">=</span> <span class="n">expected_pid</span>
<span class="n">returncode</span> <span class="o">=</span> <span class="mi">255</span>
<span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span>
<span class="s2">"Unknown child process pid </span><span class="si">%d</span><span class="s2">, will report returncode 255"</span><span class="p">,</span>
<span class="n">pid</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="n">pid</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="c1"># The child process is still alive.</span>
<span class="k">return</span>
<span class="n">returncode</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_compute_returncode</span><span class="p">(</span><span class="n">status</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_loop</span><span class="o">.</span><span class="n">get_debug</span><span class="p">():</span>
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">'process </span><span class="si">%s</span><span class="s1"> exited with returncode </span><span class="si">%s</span><span class="s1">'</span><span class="p">,</span>
<span class="n">expected_pid</span><span class="p">,</span> <span class="n">returncode</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">callback</span><span class="p">,</span> <span class="n">args</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_callbacks</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">pid</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span> <span class="c1"># pragma: no cover</span>
<span class="c1"># May happen if .remove_child_handler() is called</span>
<span class="c1"># after os.waitpid() returns.</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_loop</span><span class="o">.</span><span class="n">get_debug</span><span class="p">():</span>
<span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s2">"Child watcher got an unexpected pid: </span><span class="si">%r</span><span class="s2">"</span><span class="p">,</span>
<span class="n">pid</span><span class="p">,</span> <span class="n">exc_info</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">callback</span><span class="p">(</span><span class="n">pid</span><span class="p">,</span> <span class="n">returncode</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">FastChildWatcher</span><span class="p">(</span><span class="n">BaseChildWatcher</span><span class="p">):</span>
<span class="sd">"""'Fast' child watcher implementation.</span>
<span class="sd"> This implementation reaps every terminated processes by calling</span>
<span class="sd"> os.waitpid(-1) directly, possibly breaking other code spawning processes</span>
<span class="sd"> and waiting for their termination.</span>
<span class="sd"> There is no noticeable overhead when handling a big number of children</span>
<span class="sd"> (O(1) each time a child terminates).</span>
<span class="sd"> """</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_lock</span> <span class="o">=</span> <span class="n">threading</span><span class="o">.</span><span class="n">Lock</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_zombies</span> <span class="o">=</span> <span class="p">{}</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_forks</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_callbacks</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_zombies</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">__enter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">_lock</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_forks</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">return</span> <span class="bp">self</span>
<span class="k">def</span> <span class="nf">__exit__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">):</span>
<span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">_lock</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_forks</span> <span class="o">-=</span> <span class="mi">1</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_forks</span> <span class="ow">or</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_zombies</span><span class="p">:</span>
<span class="k">return</span>
<span class="n">collateral_victims</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_zombies</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_zombies</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
<span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span>
<span class="s2">"Caught subprocesses termination from unknown pids: </span><span class="si">%s</span><span class="s2">"</span><span class="p">,</span>
<span class="n">collateral_victims</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">add_child_handler</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pid</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
<span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">_forks</span><span class="p">,</span> <span class="s2">"Must use the context manager"</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_loop</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span>
<span class="s2">"Cannot add child handler, "</span>
<span class="s2">"the child watcher does not have a loop attached"</span><span class="p">)</span>
<span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">_lock</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">returncode</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_zombies</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">pid</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
<span class="c1"># The child is running.</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_callbacks</span><span class="p">[</span><span class="n">pid</span><span class="p">]</span> <span class="o">=</span> <span class="n">callback</span><span class="p">,</span> <span class="n">args</span>
<span class="k">return</span>
<span class="c1"># The child is dead already. We can fire the callback.</span>
<span class="n">callback</span><span class="p">(</span><span class="n">pid</span><span class="p">,</span> <span class="n">returncode</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">remove_child_handler</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pid</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">_callbacks</span><span class="p">[</span><span class="n">pid</span><span class="p">]</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="k">def</span> <span class="nf">_do_waitpid_all</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># Because of signal coalescing, we must keep calling waitpid() as</span>
<span class="c1"># long as we're able to reap a child.</span>
<span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">pid</span><span class="p">,</span> <span class="n">status</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">waitpid</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">WNOHANG</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">ChildProcessError</span><span class="p">:</span>
<span class="c1"># No more child processes exist.</span>
<span class="k">return</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="n">pid</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="c1"># A child process is still alive.</span>
<span class="k">return</span>
<span class="n">returncode</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_compute_returncode</span><span class="p">(</span><span class="n">status</span><span class="p">)</span>
<span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">_lock</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">callback</span><span class="p">,</span> <span class="n">args</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_callbacks</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">pid</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
<span class="c1"># unknown child</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_forks</span><span class="p">:</span>
<span class="c1"># It may not be registered yet.</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_zombies</span><span class="p">[</span><span class="n">pid</span><span class="p">]</span> <span class="o">=</span> <span class="n">returncode</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_loop</span><span class="o">.</span><span class="n">get_debug</span><span class="p">():</span>
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">'unknown process </span><span class="si">%s</span><span class="s1"> exited '</span>
<span class="s1">'with returncode </span><span class="si">%s</span><span class="s1">'</span><span class="p">,</span>
<span class="n">pid</span><span class="p">,</span> <span class="n">returncode</span><span class="p">)</span>
<span class="k">continue</span>
<span class="n">callback</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_loop</span><span class="o">.</span><span class="n">get_debug</span><span class="p">():</span>
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">'process </span><span class="si">%s</span><span class="s1"> exited with returncode </span><span class="si">%s</span><span class="s1">'</span><span class="p">,</span>
<span class="n">pid</span><span class="p">,</span> <span class="n">returncode</span><span class="p">)</span>
<span class="k">if</span> <span class="n">callback</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span>
<span class="s2">"Caught subprocess termination from unknown pid: "</span>
<span class="s2">"</span><span class="si">%d</span><span class="s2"> -> </span><span class="si">%d</span><span class="s2">"</span><span class="p">,</span> <span class="n">pid</span><span class="p">,</span> <span class="n">returncode</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">callback</span><span class="p">(</span><span class="n">pid</span><span class="p">,</span> <span class="n">returncode</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">_UnixDefaultEventLoopPolicy</span><span class="p">(</span><span class="n">events</span><span class="o">.</span><span class="n">BaseDefaultEventLoopPolicy</span><span class="p">):</span>
<span class="sd">"""UNIX event loop policy with a watcher for child processes."""</span>
<span class="n">_loop_factory</span> <span class="o">=</span> <span class="n">_UnixSelectorEventLoop</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_watcher</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">def</span> <span class="nf">_init_watcher</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">with</span> <span class="n">events</span><span class="o">.</span><span class="n">_lock</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_watcher</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="c1"># pragma: no branch</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_watcher</span> <span class="o">=</span> <span class="n">SafeChildWatcher</span><span class="p">()</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">threading</span><span class="o">.</span><span class="n">current_thread</span><span class="p">(),</span>
<span class="n">threading</span><span class="o">.</span><span class="n">_MainThread</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_watcher</span><span class="o">.</span><span class="n">attach_loop</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_local</span><span class="o">.</span><span class="n">_loop</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">set_event_loop</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">loop</span><span class="p">):</span>
<span class="sd">"""Set the event loop.</span>
<span class="sd"> As a side effect, if a child watcher was set before, then calling</span>
<span class="sd"> .set_event_loop() from the main thread will call .attach_loop(loop) on</span>
<span class="sd"> the child watcher.</span>
<span class="sd"> """</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">set_event_loop</span><span class="p">(</span><span class="n">loop</span><span class="p">)</span>
<span class="k">if</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_watcher</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span>
<span class="nb">isinstance</span><span class="p">(</span><span class="n">threading</span><span class="o">.</span><span class="n">current_thread</span><span class="p">(),</span> <span class="n">threading</span><span class="o">.</span><span class="n">_MainThread</span><span class="p">)):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_watcher</span><span class="o">.</span><span class="n">attach_loop</span><span class="p">(</span><span class="n">loop</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">get_child_watcher</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">"""Get the watcher for child processes.</span>
<span class="sd"> If not yet set, a SafeChildWatcher object is automatically created.</span>
<span class="sd"> """</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_watcher</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_init_watcher</span><span class="p">()</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_watcher</span>
<span class="k">def</span> <span class="nf">set_child_watcher</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">watcher</span><span class="p">):</span>
<span class="sd">"""Set the watcher for child processes."""</span>
<span class="k">assert</span> <span class="n">watcher</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">watcher</span><span class="p">,</span> <span class="n">AbstractChildWatcher</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_watcher</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_watcher</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_watcher</span> <span class="o">=</span> <span class="n">watcher</span>
<span class="n">SelectorEventLoop</span> <span class="o">=</span> <span class="n">_UnixSelectorEventLoop</span>
<span class="n">DefaultEventLoopPolicy</span> <span class="o">=</span> <span class="n">_UnixDefaultEventLoopPolicy</span>
</pre></div>
</div>
</div>
<footer>
<hr/>
<div role="contentinfo">
<p>
© Copyright 2019, Ewald de Wit
</p>
</div>
Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>
================================================
FILE: docs/html/_modules/eventkit/event.html
================================================
<!DOCTYPE html>
<html class="writer-html5" lang="en" >
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>eventkit.event — eventkit 1.0.1 documentation</title>
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="../../_static/css/theme.css" type="text/css" />
<link rel="canonical" href="https://eventkit.readthedocs.io_modules/eventkit/event.html"/>
<script data-url_root="../../" id="documentation_options" src="../../_static/documentation_options.js"></script>
<script src="../../_static/jquery.js"></script>
<script src="../../_static/underscore.js"></script>
<script src="../../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../../_static/doctools.js"></script>
<script src="../../_static/sphinx_highlight.js"></script>
<script src="../../_static/js/theme.js"></script>
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="../../index.html" class="icon icon-home"> eventkit
</a>
<div class="version">
1.0
</div>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../api.html">eventkit</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" >
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../index.html">eventkit</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="Page navigation">
<ul class="wy-breadcrumbs">
<li><a href="../../index.html" class="icon icon-home"></a></li>
<li class="breadcrumb-item"><a href="../index.html">Module code</a></li>
<li class="breadcrumb-item active">eventkit.event</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<h1>Source code for eventkit.event</h1><div class="highlight"><pre>
<span></span><span class="kn">import</span> <span class="nn">asyncio</span>
<span class="kn">import</span> <span class="nn">logging</span>
<span class="kn">import</span> <span class="nn">types</span>
<span class="kn">import</span> <span class="nn">weakref</span>
<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="p">(</span>
<span class="n">Any</span> <span class="k">as</span> <span class="n">AnyType</span><span class="p">,</span> <span class="n">AsyncIterable</span><span class="p">,</span> <span class="n">Awaitable</span><span class="p">,</span> <span class="n">Iterable</span><span class="p">,</span> <span class="n">List</span><span class="p">,</span> <span class="n">Optional</span><span class="p">,</span>
<span class="n">Tuple</span><span class="p">,</span> <span class="n">Union</span><span class="p">)</span>
<span class="kn">from</span> <span class="nn">.util</span> <span class="kn">import</span> <span class="n">NO_VALUE</span><span class="p">,</span> <span class="n">get_event_loop</span><span class="p">,</span> <span class="n">main_event_loop</span>
<div class="viewcode-block" id="Event"><a class="viewcode-back" href="../../api.html#eventkit.event.Event">[docs]</a><span class="k">class</span> <span class="nc">Event</span><span class="p">:</span>
<span class="w"> </span><span class="sd">"""</span>
<span class="sd"> Enable event passing between loosely coupled components.</span>
<span class="sd"> The event emits values to connected listeners and has</span>
<span class="sd"> a selection of operators to create general data flow pipelines.</span>
<span class="sd"> Args:</span>
<span class="sd"> name: Name to use for this event.</span>
<span class="sd"> """</span>
<span class="vm">__slots__</span> <span class="o">=</span> <span class="p">(</span>
<span class="s1">'error_event'</span><span class="p">,</span> <span class="s1">'done_event'</span><span class="p">,</span> <span class="s1">'_name'</span><span class="p">,</span> <span class="s1">'_value'</span><span class="p">,</span>
<span class="s1">'_slots'</span><span class="p">,</span> <span class="s1">'_done'</span><span class="p">,</span> <span class="s1">'_source'</span><span class="p">,</span> <span class="s1">'__weakref__'</span><span class="p">)</span>
<span class="n">NO_VALUE</span> <span class="o">=</span> <span class="n">NO_VALUE</span>
<span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="vm">__name__</span><span class="p">)</span>
<span class="n">error_event</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="s2">"Event"</span><span class="p">]</span>
<span class="n">done_event</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="s2">"Event"</span><span class="p">]</span>
<span class="n">_name</span><span class="p">:</span> <span class="nb">str</span>
<span class="n">_value</span><span class="p">:</span> <span class="n">AnyType</span>
<span class="n">_slots</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="n">List</span><span class="p">]</span>
<span class="n">_done</span><span class="p">:</span> <span class="nb">bool</span>
<span class="n">_source</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="s2">"Event"</span><span class="p">]</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s1">''</span><span class="p">,</span> <span class="n">_with_error_done_events</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">error_event</span> <span class="o">=</span> <span class="kc">None</span>
<span class="w"> </span><span class="sd">"""</span>
<span class="sd"> Sub event that emits errors from this event as</span>
<span class="sd"> ``emit(source, exception)``.</span>
<span class="sd"> """</span>
<span class="bp">self</span><span class="o">.</span><span class="n">done_event</span> <span class="o">=</span> <span class="kc">None</span>
<span class="w"> </span><span class="sd">"""</span>
<span class="sd"> Sub event that emits when this event is done as</span>
<span class="sd"> ``emit(source)``.</span>
<span class="sd"> """</span>
<span class="k">if</span> <span class="n">_with_error_done_events</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">error_event</span> <span class="o">=</span> <span class="n">Event</span><span class="p">(</span><span class="s1">'error'</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">done_event</span> <span class="o">=</span> <span class="n">Event</span><span class="p">(</span><span class="s1">'done'</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_slots</span> <span class="o">=</span> <span class="p">[]</span> <span class="c1"># list of [obj, weakref, func] sublists</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_name</span> <span class="o">=</span> <span class="n">name</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__qualname__</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_value</span> <span class="o">=</span> <span class="n">NO_VALUE</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_done</span> <span class="o">=</span> <span class="kc">False</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_source</span> <span class="o">=</span> <span class="kc">None</span>
<div class="viewcode-block" id="Event.name"><a class="viewcode-back" href="../../api.html#eventkit.event.Event.name">[docs]</a> <span class="k">def</span> <span class="nf">name</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
<span class="w"> </span><span class="sd">"""</span>
<span class="sd"> This event's name.</span>
<span class="sd"> """</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_name</span></div>
<div class="viewcode-block" id="Event.done"><a class="viewcode-back" href="../../api.html#eventkit.event.Event.done">[docs]</a> <span class="k">def</span> <span class="nf">done</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
<span class="w"> </span><span class="sd">"""</span>
<span class="sd"> ``True`` if event has ended with no more emits coming,</span>
<span class="sd"> ``False`` otherwise.</span>
<span class="sd"> """</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_done</span></div>
<div class="viewcode-block" id="Event.set_done"><a class="viewcode-back" href="../../api.html#eventkit.event.Event.set_done">[docs]</a> <span class="k">def</span> <span class="nf">set_done</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">"""</span>
<span class="sd"> Set this event to be ended. The event should not emit anything</span>
<span class="sd"> after that.</span>
<span class="sd"> """</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_done</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_done</span> <span class="o">=</span> <span class="kc">True</span>
<span class="bp">self</span><span class="o">.</span><span class="n">done_event</span><span class="o">.</span><span class="n">emit</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span></div>
<div class="viewcode-block" id="Event.value"><a class="viewcode-back" href="../../api.html#eventkit.event.Event.value">[docs]</a> <span class="k">def</span> <span class="nf">value</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">"""</span>
<span class="sd"> This event's last emitted value.</span>
<span class="sd"> """</span>
<span class="n">v</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_value</span>
<span class="k">return</span> <span class="n">NO_VALUE</span> <span class="k">if</span> <span class="n">v</span> <span class="ow">is</span> <span class="n">NO_VALUE</span> <span class="k">else</span> \
<span class="n">v</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span> <span class="k">else</span> <span class="n">v</span> <span class="k">if</span> <span class="n">v</span> <span class="k">else</span> <span class="n">NO_VALUE</span></div>
<div class="viewcode-block" id="Event.connect"><a class="viewcode-back" href="../../api.html#eventkit.event.Event.connect">[docs]</a> <span class="k">def</span> <span class="nf">connect</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">listener</span><span class="p">,</span> <span class="n">error</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">done</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">keep_ref</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">)</span> <span class="o">-></span> <span class="s2">"Event"</span><span class="p">:</span>
<span class="w"> </span><span class="sd">"""</span>
<span class="sd"> Connect a listener to this event. If the listener is added multiple</span>
<span class="sd"> times then it is invoked just as many times on emit.</span>
<span class="sd"> The ``+=`` operator can be used as a synonym for this method::</span>
<span class="sd"> import eventkit as ev</span>
<span class="sd"> def f(a, b):</span>
<span class="sd"> print(a * b)</span>
<span class="sd"> def g(a, b):</span>
<span class="sd"> print(a / b)</span>
<span class="sd"> event = ev.Event()</span>
<span class="sd"> event += f</span>
<span class="sd"> event += g</span>
<span class="sd"> event.emit(10, 5)</span>
<span class="sd"> Args:</span>
<span class="sd"> listener: The callback to invoke on emit of this event.</span>
<span class="sd"> It gets the ``*args`` from an emit as arguments.</span>
<span class="sd"> If the listener is a coroutine function, or a function that</span>
<span class="sd"> returns an awaitable, the awaitable is run in the</span>
<span class="sd"> asyncio event loop.</span>
<span class="sd"> error: The callback to invoke on error of this event.</span>
<span class="sd"> It gets (this event, exception) as two arguments.</span>
<span class="sd"> done: The callback to invoke on ending of this event.</span>
<span class="sd"> It gets this event as single argument.</span>
<span class="sd"> keep_ref:</span>
<span class="sd"> * ``True``: A strong reference to the callable is kept</span>
<span class="sd"> * ``False``: If the callable allows weak refs and it is</span>
<span class="sd"> garbage collected, then it is automatically disconnected</span>
<span class="sd"> from this event.</span>
<span class="sd"> """</span>
<span class="n">obj</span><span class="p">,</span> <span class="n">func</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_split</span><span class="p">(</span><span class="n">listener</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">keep_ref</span> <span class="ow">and</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s1">'__weakref__'</span><span class="p">):</span>
<span class="n">ref</span> <span class="o">=</span> <span class="n">weakref</span><span class="o">.</span><span class="n">ref</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_onFinalize</span><span class="p">)</span>
<span class="n">obj</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">ref</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">slot</span> <span class="o">=</span> <span class="p">[</span><span class="n">obj</span><span class="p">,</span> <span class="n">ref</span><span class="p">,</span> <span class="n">func</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_slots</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">slot</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">done_event</span> <span class="ow">and</span> <span class="n">done</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">done_event</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">done</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">error_event</span> <span class="ow">and</span> <span class="n">error</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">error_event</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">error</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span></div>
<div class="viewcode-block" id="Event.disconnect"><a class="viewcode-back" href="../../api.html#eventkit.event.Event.disconnect">[docs]</a> <span class="k">def</span> <span class="nf">disconnect</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">listener</span><span class="p">,</span> <span class="n">error</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">done</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="w"> </span><span class="sd">"""</span>
<span class="sd"> Disconnect a listener from this event.</span>
<span class="sd"> The ``-=`` operator can be used as a synonym for this method.</span>
<span class="sd"> Args:</span>
<span class="sd"> listener: The callback to disconnect. The callback is removed at</span>
<span class="sd"> most once. It is valid if the callback is already</span>
<span class="sd"> not connected.</span>
<span class="sd"> error: The error callback to disconnect.</span>
<span class="sd"> done: The done callback to disconnect.</span>
<span class="sd"> """</span>
<span class="n">obj</span><span class="p">,</span> <span class="n">func</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_split</span><span class="p">(</span><span class="n">listener</span><span class="p">)</span>
<span class="k">for</span> <span class="n">slot</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_slots</span><span class="p">:</span>
<span class="k">if</span> <span class="p">(</span><span class="n">slot</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="ow">is</span> <span class="n">obj</span> <span class="ow">or</span> <span class="n">slot</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="ow">and</span> <span class="n">slot</span><span class="p">[</span><span class="mi">1</span><span class="p">]()</span> <span class="ow">is</span> <span class="n">obj</span><span class="p">)</span> \
<span class="ow">and</span> <span class="n">slot</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="ow">is</span> <span class="n">func</span><span class="p">:</span>
<span class="n">slot</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">slot</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">slot</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">break</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_slots</span> <span class="o">=</span> <span class="p">[</span><span class="n">s</span> <span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_slots</span> <span class="k">if</span> <span class="n">s</span> <span class="o">!=</span> <span class="p">[</span><span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">]]</span>
<span class="k">if</span> <span class="n">error</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">error_event</span><span class="o">.</span><span class="n">disconnect</span><span class="p">(</span><span class="n">error</span><span class="p">)</span>
<span class="k">if</span> <span class="n">done</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">done_event</span><span class="o">.</span><span class="n">disconnect</span><span class="p">(</span><span class="n">done</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span></div>
<div class="viewcode-block" id="Event.disconnect_obj"><a class="viewcode-back" href="../../api.html#eventkit.event.Event.disconnect_obj">[docs]</a> <span class="k">def</span> <span class="nf">disconnect_obj</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">):</span>
<span class="w"> </span><span class="sd">"""</span>
<span class="sd"> Disconnect all listeners on the given object.</span>
<span class="sd"> (also the error and done listeners).</span>
<span class="sd"> Args:</span>
<span class="sd"> obj: The target object that is to be completely removed from</span>
<span class="sd"> this event.</span>
<span class="sd"> """</span>
<span class="k">for</span> <span class="n">slot</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_slots</span><span class="p">:</span>
<span class="k">if</span> <span class="n">slot</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="ow">is</span> <span class="n">obj</span> <span class="ow">or</span> <span class="n">slot</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="ow">and</span> <span class="n">slot</span><span class="p">[</span><span class="mi">1</span><span class="p">]()</span> <span class="ow">is</span> <span class="n">obj</span><span class="p">:</span>
<span class="n">slot</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">slot</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">slot</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_slots</span> <span class="o">=</span> <span class="p">[</span><span class="n">s</span> <span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_slots</span> <span class="k">if</span> <span class="n">s</span> <span class="o">!=</span> <span class="p">[</span><span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">]]</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">error_event</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">error_event</span><span class="o">.</span><span class="n">disconnect_obj</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">done_event</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">done_event</span><span class="o">.</span><span class="n">disconnect_obj</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span></div>
<div class="viewcode-block" id="Event.emit"><a class="viewcode-back" href="../../api.html#eventkit.event.Event.emit">[docs]</a> <span class="k">def</span> <span class="nf">emit</span><span class=
gitextract_7ujg68vi/
├── .gitattributes
├── .github/
│ └── workflows/
│ └── test.yml
├── .gitignore
├── .readthedocs.yml
├── LICENSE
├── README.rst
├── docs/
│ ├── Makefile
│ ├── api.rst
│ ├── conf.py
│ ├── html/
│ │ ├── _modules/
│ │ │ ├── asyncio/
│ │ │ │ └── unix_events.html
│ │ │ ├── eventkit/
│ │ │ │ ├── event.html
│ │ │ │ ├── ops/
│ │ │ │ │ ├── aggregate.html
│ │ │ │ │ ├── array.html
│ │ │ │ │ ├── combine.html
│ │ │ │ │ ├── create.html
│ │ │ │ │ ├── misc.html
│ │ │ │ │ ├── op.html
│ │ │ │ │ ├── select.html
│ │ │ │ │ ├── timing.html
│ │ │ │ │ └── transform.html
│ │ │ │ └── util.html
│ │ │ ├── index.html
│ │ │ └── logging.html
│ │ ├── _sources/
│ │ │ ├── api.rst.txt
│ │ │ └── index.rst.txt
│ │ ├── _static/
│ │ │ ├── _sphinx_javascript_frameworks_compat.js
│ │ │ ├── basic.css
│ │ │ ├── css/
│ │ │ │ ├── badge_only.css
│ │ │ │ └── theme.css
│ │ │ ├── doctools.js
│ │ │ ├── documentation_options.js
│ │ │ ├── fonts/
│ │ │ │ └── FontAwesome.otf
│ │ │ ├── jquery-3.2.1.js
│ │ │ ├── jquery-3.5.1.js
│ │ │ ├── jquery-3.6.0.js
│ │ │ ├── jquery.js
│ │ │ ├── js/
│ │ │ │ ├── badge_only.js
│ │ │ │ └── theme.js
│ │ │ ├── language_data.js
│ │ │ ├── pygments.css
│ │ │ ├── searchtools.js
│ │ │ ├── sphinx_highlight.js
│ │ │ ├── underscore-1.12.0.js
│ │ │ ├── underscore-1.13.1.js
│ │ │ ├── underscore-1.3.1.js
│ │ │ ├── underscore.js
│ │ │ └── websupport.js
│ │ ├── api.html
│ │ ├── genindex.html
│ │ ├── index.html
│ │ ├── objects.inv
│ │ ├── py-modindex.html
│ │ ├── search.html
│ │ └── searchindex.js
│ ├── index.rst
│ ├── make.bat
│ └── requirements.txt
├── eventkit/
│ ├── __init__.py
│ ├── event.py
│ ├── ops/
│ │ ├── __init__.py
│ │ ├── aggregate.py
│ │ ├── array.py
│ │ ├── combine.py
│ │ ├── create.py
│ │ ├── misc.py
│ │ ├── op.py
│ │ ├── select.py
│ │ ├── timing.py
│ │ └── transform.py
│ ├── util.py
│ └── version.py
├── notebooks/
│ └── eventkit_introduction.ipynb
├── requirements.txt
├── setup.cfg
├── setup.py
└── tests/
├── __init__.py
├── aggregate_test.py
├── combine_test.py
├── create_test.py
├── event_test.py
├── select_test.py
├── timing_test.py
└── transform_test.py
SYMBOL INDEX (1055 symbols across 32 files)
FILE: docs/html/_static/_sphinx_javascript_frameworks_compat.js
function highlight (line 62) | function highlight(node, addItems) {
FILE: docs/html/_static/doctools.js
constant BLACKLISTED_KEY_CONTROL_ELEMENTS (line 13) | const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([
FILE: docs/html/_static/jquery-3.2.1.js
function DOMEval (line 76) | function DOMEval( code, doc ) {
function isArrayLike (line 522) | function isArrayLike( obj ) {
function Sizzle (line 754) | function Sizzle( selector, context, results, seed ) {
function createCache (line 893) | function createCache() {
function markFunction (line 911) | function markFunction( fn ) {
function assert (line 920) | function assert( fn ) {
function addHandle (line 942) | function addHandle( attrs, handler ) {
function siblingCheck (line 957) | function siblingCheck( a, b ) {
function createInputPseudo (line 983) | function createInputPseudo( type ) {
function createButtonPseudo (line 994) | function createButtonPseudo( type ) {
function createDisabledPseudo (line 1005) | function createDisabledPseudo( disabled ) {
function createPositionalPseudo (line 1061) | function createPositionalPseudo( fn ) {
function testContext (line 1084) | function testContext( context ) {
function setFilters (line 2166) | function setFilters() {}
function toSelector (line 2237) | function toSelector( tokens ) {
function addCombinator (line 2247) | function addCombinator( matcher, combinator, base ) {
function elementMatcher (line 2311) | function elementMatcher( matchers ) {
function multipleContexts (line 2325) | function multipleContexts( selector, contexts, results ) {
function condense (line 2334) | function condense( unmatched, map, filter, context, xml ) {
function setMatcher (line 2355) | function setMatcher( preFilter, selector, matcher, postFilter, postFinde...
function matcherFromTokens (line 2448) | function matcherFromTokens( tokens ) {
function matcherFromGroupMatchers (line 2506) | function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
function nodeName (line 2842) | function nodeName( elem, name ) {
function winnow (line 2854) | function winnow( elements, qualifier, not ) {
function sibling (line 3157) | function sibling( cur, dir ) {
function createOptions (line 3244) | function createOptions( options ) {
function Identity (line 3469) | function Identity( v ) {
function Thrower (line 3472) | function Thrower( ex ) {
function adoptValue (line 3476) | function adoptValue( value, resolve, reject, noValue ) {
function resolve (line 3569) | function resolve( depth, deferred, handler, special ) {
function completed (line 3927) | function completed() {
function Data (line 4029) | function Data() {
function getData (line 4198) | function getData( data ) {
function dataAttr (line 4223) | function dataAttr( elem, key, data ) {
function adjustCSS (line 4536) | function adjustCSS( elem, prop, valueParts, tween ) {
function getDefaultDisplay (line 4601) | function getDefaultDisplay( elem ) {
function showHide (line 4624) | function showHide( elements, show ) {
function getAll (line 4725) | function getAll( context, tag ) {
function setGlobalEval (line 4750) | function setGlobalEval( elems, refElements ) {
function buildFragment (line 4766) | function buildFragment( elems, context, scripts, selection, ignored ) {
function returnTrue (line 4889) | function returnTrue() {
function returnFalse (line 4893) | function returnFalse() {
function safeActiveElement (line 4899) | function safeActiveElement() {
function on (line 4905) | function on( elem, types, selector, data, fn, one ) {
function manipulationTarget (line 5634) | function manipulationTarget( elem, content ) {
function disableScript (line 5645) | function disableScript( elem ) {
function restoreScript (line 5649) | function restoreScript( elem ) {
function cloneCopyEvent (line 5661) | function cloneCopyEvent( src, dest ) {
function fixInput (line 5696) | function fixInput( src, dest ) {
function domManip (line 5709) | function domManip( collection, args, callback, ignored ) {
function remove (line 5799) | function remove( elem, selector, keepData ) {
function computeStyleTests (line 6092) | function computeStyleTests() {
function curCSS (line 6166) | function curCSS( elem, name, computed ) {
function addGetHookIf (line 6219) | function addGetHookIf( conditionFn, hookFn ) {
function vendorPropName (line 6256) | function vendorPropName( name ) {
function finalPropName (line 6277) | function finalPropName( name ) {
function setPositiveNumber (line 6285) | function setPositiveNumber( elem, value, subtract ) {
function augmentWidthOrHeight (line 6297) | function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
function getWidthOrHeight (line 6343) | function getWidthOrHeight( elem, name, extra ) {
function Tween (line 6652) | function Tween( elem, options, prop, end, easing ) {
function schedule (line 6775) | function schedule() {
function createFxNow (line 6788) | function createFxNow() {
function genFx (line 6796) | function genFx( type, includeWidth ) {
function createTween (line 6816) | function createTween( value, prop, animation ) {
function defaultPrefilter (line 6830) | function defaultPrefilter( elem, props, opts ) {
function propFilter (line 7001) | function propFilter( props, specialEasing ) {
function Animation (line 7038) | function Animation( elem, properties, options ) {
function stripAndCollapse (line 7753) | function stripAndCollapse( value ) {
function getClass (line 7759) | function getClass( elem ) {
function buildParams (line 8383) | function buildParams( prefix, obj, traditional, add ) {
function addToPrefiltersOrTransports (line 8533) | function addToPrefiltersOrTransports( structure ) {
function inspectPrefiltersOrTransports (line 8567) | function inspectPrefiltersOrTransports( structure, options, originalOpti...
function ajaxExtend (line 8596) | function ajaxExtend( target, src ) {
function ajaxHandleResponses (line 8616) | function ajaxHandleResponses( s, jqXHR, responses ) {
function ajaxConvert (line 8674) | function ajaxConvert( s, response, jqXHR, isSuccess ) {
function done (line 9187) | function done( status, nativeStatusText, responses, headers ) {
FILE: docs/html/_static/jquery-3.5.1.js
function DOMEval (line 103) | function DOMEval( code, node, doc ) {
function toType (line 133) | function toType( obj ) {
function isArrayLike (line 503) | function isArrayLike( obj ) {
function Sizzle (line 755) | function Sizzle( selector, context, results, seed ) {
function createCache (line 903) | function createCache() {
function markFunction (line 923) | function markFunction( fn ) {
function assert (line 932) | function assert( fn ) {
function addHandle (line 956) | function addHandle( attrs, handler ) {
function siblingCheck (line 971) | function siblingCheck( a, b ) {
function createInputPseudo (line 997) | function createInputPseudo( type ) {
function createButtonPseudo (line 1008) | function createButtonPseudo( type ) {
function createDisabledPseudo (line 1019) | function createDisabledPseudo( disabled ) {
function createPositionalPseudo (line 1075) | function createPositionalPseudo( fn ) {
function testContext (line 1098) | function testContext( context ) {
function setFilters (line 2309) | function setFilters() {}
function toSelector (line 2383) | function toSelector( tokens ) {
function addCombinator (line 2393) | function addCombinator( matcher, combinator, base ) {
function elementMatcher (line 2460) | function elementMatcher( matchers ) {
function multipleContexts (line 2474) | function multipleContexts( selector, contexts, results ) {
function condense (line 2483) | function condense( unmatched, map, filter, context, xml ) {
function setMatcher (line 2504) | function setMatcher( preFilter, selector, matcher, postFilter, postFinde...
function matcherFromTokens (line 2604) | function matcherFromTokens( tokens ) {
function matcherFromGroupMatchers (line 2667) | function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
function nodeName (line 3025) | function nodeName( elem, name ) {
function winnow (line 3035) | function winnow( elements, qualifier, not ) {
function sibling (line 3330) | function sibling( cur, dir ) {
function createOptions (line 3423) | function createOptions( options ) {
function Identity (line 3648) | function Identity( v ) {
function Thrower (line 3651) | function Thrower( ex ) {
function adoptValue (line 3655) | function adoptValue( value, resolve, reject, noValue ) {
function resolve (line 3748) | function resolve( depth, deferred, handler, special ) {
function completed (line 4113) | function completed() {
function fcamelCase (line 4208) | function fcamelCase( _all, letter ) {
function camelCase (line 4215) | function camelCase( string ) {
function Data (line 4232) | function Data() {
function getData (line 4401) | function getData( data ) {
function dataAttr (line 4426) | function dataAttr( elem, key, data ) {
function adjustCSS (line 4738) | function adjustCSS( elem, prop, valueParts, tween ) {
function getDefaultDisplay (line 4806) | function getDefaultDisplay( elem ) {
function showHide (line 4829) | function showHide( elements, show ) {
function getAll (line 4961) | function getAll( context, tag ) {
function setGlobalEval (line 4986) | function setGlobalEval( elems, refElements ) {
function buildFragment (line 5002) | function buildFragment( elems, context, scripts, selection, ignored ) {
function returnTrue (line 5097) | function returnTrue() {
function returnFalse (line 5101) | function returnFalse() {
function expectSync (line 5111) | function expectSync( elem, type ) {
function safeActiveElement (line 5118) | function safeActiveElement() {
function on (line 5124) | function on( elem, types, selector, data, fn, one ) {
function leverageNative (line 5612) | function leverageNative( el, type, expectSync ) {
function manipulationTarget (line 5976) | function manipulationTarget( elem, content ) {
function disableScript (line 5987) | function disableScript( elem ) {
function restoreScript (line 5991) | function restoreScript( elem ) {
function cloneCopyEvent (line 6001) | function cloneCopyEvent( src, dest ) {
function fixInput (line 6034) | function fixInput( src, dest ) {
function domManip (line 6047) | function domManip( collection, args, callback, ignored ) {
function remove (line 6139) | function remove( elem, selector, keepData ) {
function computeStyleTests (line 6453) | function computeStyleTests() {
function roundPixelMeasures (line 6497) | function roundPixelMeasures( measure ) {
function curCSS (line 6571) | function curCSS( elem, name, computed ) {
function addGetHookIf (line 6624) | function addGetHookIf( conditionFn, hookFn ) {
function vendorPropName (line 6649) | function vendorPropName( name ) {
function finalPropName (line 6664) | function finalPropName( name ) {
function setPositiveNumber (line 6690) | function setPositiveNumber( _elem, value, subtract ) {
function boxModelAdjustment (line 6702) | function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, ...
function getWidthOrHeight (line 6770) | function getWidthOrHeight( elem, dimension, extra ) {
function Tween (line 7146) | function Tween( elem, options, prop, end, easing ) {
function schedule (line 7269) | function schedule() {
function createFxNow (line 7282) | function createFxNow() {
function genFx (line 7290) | function genFx( type, includeWidth ) {
function createTween (line 7310) | function createTween( value, prop, animation ) {
function defaultPrefilter (line 7324) | function defaultPrefilter( elem, props, opts ) {
function propFilter (line 7496) | function propFilter( props, specialEasing ) {
function Animation (line 7533) | function Animation( elem, properties, options ) {
function stripAndCollapse (line 8248) | function stripAndCollapse( value ) {
function getClass (line 8254) | function getClass( elem ) {
function classesToArray (line 8258) | function classesToArray( value ) {
function buildParams (line 8885) | function buildParams( prefix, obj, traditional, add ) {
function addToPrefiltersOrTransports (line 9039) | function addToPrefiltersOrTransports( structure ) {
function inspectPrefiltersOrTransports (line 9073) | function inspectPrefiltersOrTransports( structure, options, originalOpti...
function ajaxExtend (line 9102) | function ajaxExtend( target, src ) {
function ajaxHandleResponses (line 9122) | function ajaxHandleResponses( s, jqXHR, responses ) {
function ajaxConvert (line 9180) | function ajaxConvert( s, response, jqXHR, isSuccess ) {
function done (line 9696) | function done( status, nativeStatusText, responses, headers ) {
FILE: docs/html/_static/jquery-3.6.0.js
function DOMEval (line 107) | function DOMEval( code, node, doc ) {
function toType (line 137) | function toType( obj ) {
function isArrayLike (line 507) | function isArrayLike( obj ) {
function Sizzle (line 759) | function Sizzle( selector, context, results, seed ) {
function createCache (line 907) | function createCache() {
function markFunction (line 927) | function markFunction( fn ) {
function assert (line 936) | function assert( fn ) {
function addHandle (line 960) | function addHandle( attrs, handler ) {
function siblingCheck (line 975) | function siblingCheck( a, b ) {
function createInputPseudo (line 1001) | function createInputPseudo( type ) {
function createButtonPseudo (line 1012) | function createButtonPseudo( type ) {
function createDisabledPseudo (line 1023) | function createDisabledPseudo( disabled ) {
function createPositionalPseudo (line 1079) | function createPositionalPseudo( fn ) {
function testContext (line 1102) | function testContext( context ) {
function setFilters (line 2313) | function setFilters() {}
function toSelector (line 2387) | function toSelector( tokens ) {
function addCombinator (line 2397) | function addCombinator( matcher, combinator, base ) {
function elementMatcher (line 2464) | function elementMatcher( matchers ) {
function multipleContexts (line 2478) | function multipleContexts( selector, contexts, results ) {
function condense (line 2487) | function condense( unmatched, map, filter, context, xml ) {
function setMatcher (line 2508) | function setMatcher( preFilter, selector, matcher, postFilter, postFinde...
function matcherFromTokens (line 2608) | function matcherFromTokens( tokens ) {
function matcherFromGroupMatchers (line 2671) | function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
function nodeName (line 3029) | function nodeName( elem, name ) {
function winnow (line 3039) | function winnow( elements, qualifier, not ) {
function sibling (line 3334) | function sibling( cur, dir ) {
function createOptions (line 3427) | function createOptions( options ) {
function Identity (line 3652) | function Identity( v ) {
function Thrower (line 3655) | function Thrower( ex ) {
function adoptValue (line 3659) | function adoptValue( value, resolve, reject, noValue ) {
function resolve (line 3752) | function resolve( depth, deferred, handler, special ) {
function completed (line 4117) | function completed() {
function fcamelCase (line 4212) | function fcamelCase( _all, letter ) {
function camelCase (line 4219) | function camelCase( string ) {
function Data (line 4236) | function Data() {
function getData (line 4405) | function getData( data ) {
function dataAttr (line 4430) | function dataAttr( elem, key, data ) {
function adjustCSS (line 4742) | function adjustCSS( elem, prop, valueParts, tween ) {
function getDefaultDisplay (line 4810) | function getDefaultDisplay( elem ) {
function showHide (line 4833) | function showHide( elements, show ) {
function getAll (line 4965) | function getAll( context, tag ) {
function setGlobalEval (line 4990) | function setGlobalEval( elems, refElements ) {
function buildFragment (line 5006) | function buildFragment( elems, context, scripts, selection, ignored ) {
function returnTrue (line 5098) | function returnTrue() {
function returnFalse (line 5102) | function returnFalse() {
function expectSync (line 5112) | function expectSync( elem, type ) {
function safeActiveElement (line 5119) | function safeActiveElement() {
function on (line 5125) | function on( elem, types, selector, data, fn, one ) {
function leverageNative (line 5613) | function leverageNative( el, type, expectSync ) {
function manipulationTarget (line 5962) | function manipulationTarget( elem, content ) {
function disableScript (line 5973) | function disableScript( elem ) {
function restoreScript (line 5977) | function restoreScript( elem ) {
function cloneCopyEvent (line 5987) | function cloneCopyEvent( src, dest ) {
function fixInput (line 6020) | function fixInput( src, dest ) {
function domManip (line 6033) | function domManip( collection, args, callback, ignored ) {
function remove (line 6125) | function remove( elem, selector, keepData ) {
function computeStyleTests (line 6439) | function computeStyleTests() {
function roundPixelMeasures (line 6483) | function roundPixelMeasures( measure ) {
function curCSS (line 6576) | function curCSS( elem, name, computed ) {
function addGetHookIf (line 6629) | function addGetHookIf( conditionFn, hookFn ) {
function vendorPropName (line 6654) | function vendorPropName( name ) {
function finalPropName (line 6669) | function finalPropName( name ) {
function setPositiveNumber (line 6695) | function setPositiveNumber( _elem, value, subtract ) {
function boxModelAdjustment (line 6707) | function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, ...
function getWidthOrHeight (line 6775) | function getWidthOrHeight( elem, dimension, extra ) {
function Tween (line 7151) | function Tween( elem, options, prop, end, easing ) {
function schedule (line 7274) | function schedule() {
function createFxNow (line 7287) | function createFxNow() {
function genFx (line 7295) | function genFx( type, includeWidth ) {
function createTween (line 7315) | function createTween( value, prop, animation ) {
function defaultPrefilter (line 7329) | function defaultPrefilter( elem, props, opts ) {
function propFilter (line 7501) | function propFilter( props, specialEasing ) {
function Animation (line 7538) | function Animation( elem, properties, options ) {
function stripAndCollapse (line 8254) | function stripAndCollapse( value ) {
function getClass (line 8260) | function getClass( elem ) {
function classesToArray (line 8264) | function classesToArray( value ) {
function buildParams (line 8894) | function buildParams( prefix, obj, traditional, add ) {
function addToPrefiltersOrTransports (line 9047) | function addToPrefiltersOrTransports( structure ) {
function inspectPrefiltersOrTransports (line 9081) | function inspectPrefiltersOrTransports( structure, options, originalOpti...
function ajaxExtend (line 9110) | function ajaxExtend( target, src ) {
function ajaxHandleResponses (line 9130) | function ajaxHandleResponses( s, jqXHR, responses ) {
function ajaxConvert (line 9188) | function ajaxConvert( s, response, jqXHR, isSuccess ) {
function done (line 9704) | function done( status, nativeStatusText, responses, headers ) {
FILE: docs/html/_static/jquery.js
function b (line 2) | function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e...
function w (line 2) | function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof...
function p (line 2) | function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e...
function se (line 2) | function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeTy...
function ue (line 2) | function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cac...
function le (line 2) | function le(e){return e[S]=!0,e}
function ce (line 2) | function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(...
function fe (line 2) | function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[...
function pe (line 2) | function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourc...
function de (line 2) | function de(t){return function(e){return"input"===e.nodeName.toLowerCase...
function he (line 2) | function he(n){return function(e){var t=e.nodeName.toLowerCase();return(...
function ge (line 2) | function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e....
function ve (line 2) | function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,...
function ye (line 2) | function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}
function me (line 2) | function me(){}
function xe (line 2) | function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}
function be (line 2) | function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r...
function we (line 2) | function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r-...
function Te (line 2) | function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(...
function Ce (line 2) | function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)...
function Ee (line 2) | function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.r...
function A (line 2) | function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerC...
function j (line 2) | function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,...
function O (line 2) | function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}
function R (line 2) | function R(e){return e}
function M (line 2) | function M(e){throw e}
function I (line 2) | function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n...
function l (line 2) | function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(...
function B (line 2) | function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventLi...
function U (line 2) | function U(e,t){return t.toUpperCase()}
function X (line 2) | function X(e){return e.replace(_,"ms-").replace(z,U)}
function G (line 2) | function G(){this.expando=S.expando+G.uid++}
function Z (line 2) | function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.r...
function se (line 2) | function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:functio...
function le (line 2) | function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[...
function ve (line 2) | function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagNa...
function ye (line 2) | function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",...
function xe (line 2) | function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),...
function we (line 2) | function we(){return!0}
function Te (line 2) | function Te(){return!1}
function Ce (line 2) | function Ce(e,t){return e===function(){try{return E.activeElement}catch(...
function Ee (line 2) | function Ee(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"...
function Se (line 2) | function Se(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handle...
function je (line 2) | function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"...
function De (line 2) | function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}
function qe (line 2) | function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.sli...
function Le (line 2) | function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=...
function He (line 2) | function He(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],...
function Oe (line 2) | function Oe(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)...
function We (line 2) | function We(e,t,n){var r,i,o,a,s=e.style;return(n=n||Re(e))&&(""!==(a=n....
function Fe (line 2) | function Fe(e,t){return{get:function(){if(!e())return(this.get=t).apply(...
function e (line 2) | function e(){if(l){u.style.cssText="position:absolute;left:-11111px;widt...
function t (line 2) | function t(e){return Math.round(parseFloat(e))}
function ze (line 2) | function ze(e){var t=S.cssProps[e]||_e[e];return t||(e in $e?e:_e[e]=fun...
function Ye (line 2) | function Ye(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[...
function Qe (line 2) | function Qe(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border...
function Je (line 2) | function Je(e,t,n){var r=Re(e),i=(!y.boxSizingReliable()||n)&&"border-bo...
function Ke (line 2) | function Ke(e,t,n,r,i){return new Ke.prototype.init(e,t,n,r,i)}
function ot (line 2) | function ot(){et&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnima...
function at (line 2) | function at(){return C.setTimeout(function(){Ze=void 0}),Ze=Date.now()}
function st (line 2) | function st(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin...
function ut (line 2) | function ut(e,t,n){for(var r,i=(lt.tweeners[t]||[]).concat(lt.tweeners["...
function lt (line 2) | function lt(o,e,t){var n,a,r=0,i=lt.prefilters.length,s=S.Deferred().alw...
function ht (line 2) | function ht(e){return(e.match(P)||[]).join(" ")}
function gt (line 2) | function gt(e){return e.getAttribute&&e.getAttribute("class")||""}
function vt (line 2) | function vt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)|...
function At (line 2) | function At(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r|...
function It (line 2) | function It(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var ...
function Wt (line 2) | function Wt(t,i,o,a){var s={},u=t===Pt;function l(e){var r;return s[e]=!...
function Ft (line 2) | function Ft(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)voi...
function l (line 2) | function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=vo...
FILE: docs/html/_static/js/badge_only.js
function r (line 1) | function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{...
FILE: docs/html/_static/js/theme.js
function t (line 1) | function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{...
FILE: docs/html/_static/sphinx_highlight.js
constant SPHINX_HIGHLIGHT_ENABLED (line 4) | const SPHINX_HIGHLIGHT_ENABLED = true
FILE: docs/html/_static/underscore-1.12.0.js
function restArguments (line 64) | function restArguments(func, startIndex) {
function isObject (line 88) | function isObject(obj) {
function isNull (line 94) | function isNull(obj) {
function isUndefined (line 99) | function isUndefined(obj) {
function isBoolean (line 104) | function isBoolean(obj) {
function isElement (line 109) | function isElement(obj) {
function tagTester (line 114) | function tagTester(name) {
function ie10IsDataView (line 162) | function ie10IsDataView(obj) {
function has (line 173) | function has(obj, key) {
function isFinite$1 (line 192) | function isFinite$1(obj) {
function isNaN$1 (line 197) | function isNaN$1(obj) {
function constant (line 202) | function constant(value) {
function createSizePropertyCheck (line 209) | function createSizePropertyCheck(getSizeProperty) {
function shallowProperty (line 217) | function shallowProperty(key) {
function isTypedArray (line 232) | function isTypedArray(obj) {
function emulatedSet (line 248) | function emulatedSet(keys) {
function collectNonEnumProps (line 263) | function collectNonEnumProps(obj, keys) {
function keys (line 283) | function keys(obj) {
function isEmpty (line 295) | function isEmpty(obj) {
function isMatch (line 307) | function isMatch(object, attrs) {
function _ (line 321) | function _(obj) {
function toBufferView (line 344) | function toBufferView(bufferSource) {
function eq (line 356) | function eq(a, b, aStack, bStack) {
function deepEq (line 371) | function deepEq(a, b, aStack, bStack) {
function isEqual (line 476) | function isEqual(a, b) {
function allKeys (line 481) | function allKeys(obj) {
function ie11fingerprint (line 494) | function ie11fingerprint(methods) {
function values (line 533) | function values(obj) {
function pairs (line 545) | function pairs(obj) {
function invert (line 556) | function invert(obj) {
function functions (line 566) | function functions(obj) {
function createAssigner (line 575) | function createAssigner(keysFunc, defaults) {
function ctor (line 605) | function ctor() {
function baseCreate (line 610) | function baseCreate(prototype) {
function create (line 623) | function create(prototype, props) {
function clone (line 630) | function clone(obj) {
function tap (line 638) | function tap(obj, interceptor) {
function toPath (line 645) | function toPath(path) {
function toPath$1 (line 652) | function toPath$1(path) {
function deepGet (line 657) | function deepGet(obj, path) {
function get (line 670) | function get(object, path, defaultValue) {
function has$1 (line 678) | function has$1(obj, path) {
function identity (line 690) | function identity(value) {
function matcher (line 696) | function matcher(attrs) {
function property (line 705) | function property(path) {
function optimizeCb (line 715) | function optimizeCb(func, context, argCount) {
function baseIteratee (line 737) | function baseIteratee(value, context, argCount) {
function iteratee (line 747) | function iteratee(value, context) {
function cb (line 754) | function cb(value, context, argCount) {
function mapObject (line 761) | function mapObject(obj, iteratee, context) {
function noop (line 774) | function noop(){}
function propertyOf (line 777) | function propertyOf(obj) {
function times (line 785) | function times(n, iteratee, context) {
function random (line 793) | function random(min, max) {
function createEscaper (line 808) | function createEscaper(map) {
function escapeChar (line 867) | function escapeChar(match) {
function template (line 875) | function template(text, settings, oldSettings) {
function result (line 935) | function result(obj, path, fallback) {
function uniqueId (line 955) | function uniqueId(prefix) {
function chain (line 961) | function chain(obj) {
function executeBound (line 970) | function executeBound(sourceFunc, boundFunc, context, callingContext, ar...
function flatten (line 1015) | function flatten(input, depth, strict, output) {
function memoize (line 1056) | function memoize(func, hasher) {
function throttle (line 1084) | function throttle(func, wait, options) {
function debounce (line 1129) | function debounce(func, wait, immediate) {
function wrap (line 1166) | function wrap(func, wrapper) {
function negate (line 1171) | function negate(predicate) {
function compose (line 1179) | function compose() {
function after (line 1191) | function after(times, func) {
function before (line 1201) | function before(times, func) {
function findKey (line 1217) | function findKey(obj, predicate, context) {
function createPredicateIndexFinder (line 1227) | function createPredicateIndexFinder(dir) {
function sortedIndex (line 1247) | function sortedIndex(array, obj, iteratee, context) {
function createIndexFinder (line 1259) | function createIndexFinder(dir, predicateFind, sortedIndex) {
function find (line 1294) | function find(obj, predicate, context) {
function findWhere (line 1302) | function findWhere(obj, attrs) {
function each (line 1310) | function each(obj, iteratee, context) {
function map (line 1327) | function map(obj, iteratee, context) {
function createReduce (line 1340) | function createReduce(dir) {
function filter (line 1372) | function filter(obj, predicate, context) {
function reject (line 1382) | function reject(obj, predicate, context) {
function every (line 1387) | function every(obj, predicate, context) {
function some (line 1399) | function some(obj, predicate, context) {
function contains (line 1411) | function contains(obj, item, fromIndex, guard) {
function pluck (line 1441) | function pluck(obj, key) {
function where (line 1447) | function where(obj, attrs) {
function max (line 1452) | function max(obj, iteratee, context) {
function min (line 1477) | function min(obj, iteratee, context) {
function sample (line 1505) | function sample(obj, n, guard) {
function shuffle (line 1524) | function shuffle(obj) {
function sortBy (line 1529) | function sortBy(obj, iteratee, context) {
function group (line 1550) | function group(behavior, partition) {
function toArray (line 1589) | function toArray(obj) {
function size (line 1601) | function size(obj) {
function keyInObj (line 1608) | function keyInObj(value, key, obj) {
function initial (line 1650) | function initial(array, n, guard) {
function first (line 1656) | function first(array, n, guard) {
function rest (line 1665) | function rest(array, n, guard) {
function last (line 1671) | function last(array, n, guard) {
function compact (line 1678) | function compact(array) {
function flatten$1 (line 1684) | function flatten$1(array, depth) {
function uniq (line 1707) | function uniq(array, isSorted, iteratee, context) {
function intersection (line 1742) | function intersection(array) {
function unzip (line 1759) | function unzip(array) {
function object (line 1776) | function object(list, values) {
function range (line 1791) | function range(start, stop, step) {
function chunk (line 1812) | function chunk(array, count) {
function chainResult (line 1823) | function chainResult(instance, obj) {
function mixin (line 1828) | function mixin(obj) {
FILE: docs/html/_static/underscore-1.13.1.js
function restArguments (line 64) | function restArguments(func, startIndex) {
function isObject (line 88) | function isObject(obj) {
function isNull (line 94) | function isNull(obj) {
function isUndefined (line 99) | function isUndefined(obj) {
function isBoolean (line 104) | function isBoolean(obj) {
function isElement (line 109) | function isElement(obj) {
function tagTester (line 114) | function tagTester(name) {
function ie10IsDataView (line 162) | function ie10IsDataView(obj) {
function has$1 (line 173) | function has$1(obj, key) {
function isFinite$1 (line 192) | function isFinite$1(obj) {
function isNaN$1 (line 197) | function isNaN$1(obj) {
function constant (line 202) | function constant(value) {
function createSizePropertyCheck (line 209) | function createSizePropertyCheck(getSizeProperty) {
function shallowProperty (line 217) | function shallowProperty(key) {
function isTypedArray (line 232) | function isTypedArray(obj) {
function emulatedSet (line 248) | function emulatedSet(keys) {
function collectNonEnumProps (line 263) | function collectNonEnumProps(obj, keys) {
function keys (line 283) | function keys(obj) {
function isEmpty (line 295) | function isEmpty(obj) {
function isMatch (line 307) | function isMatch(object, attrs) {
function _$1 (line 321) | function _$1(obj) {
function toBufferView (line 344) | function toBufferView(bufferSource) {
function eq (line 356) | function eq(a, b, aStack, bStack) {
function deepEq (line 371) | function deepEq(a, b, aStack, bStack) {
function isEqual (line 476) | function isEqual(a, b) {
function allKeys (line 481) | function allKeys(obj) {
function ie11fingerprint (line 494) | function ie11fingerprint(methods) {
function values (line 533) | function values(obj) {
function pairs (line 545) | function pairs(obj) {
function invert (line 556) | function invert(obj) {
function functions (line 566) | function functions(obj) {
function createAssigner (line 575) | function createAssigner(keysFunc, defaults) {
function ctor (line 605) | function ctor() {
function baseCreate (line 610) | function baseCreate(prototype) {
function create (line 623) | function create(prototype, props) {
function clone (line 630) | function clone(obj) {
function tap (line 638) | function tap(obj, interceptor) {
function toPath$1 (line 645) | function toPath$1(path) {
function toPath (line 652) | function toPath(path) {
function deepGet (line 657) | function deepGet(obj, path) {
function get (line 670) | function get(object, path, defaultValue) {
function has (line 678) | function has(obj, path) {
function identity (line 690) | function identity(value) {
function matcher (line 696) | function matcher(attrs) {
function property (line 705) | function property(path) {
function optimizeCb (line 715) | function optimizeCb(func, context, argCount) {
function baseIteratee (line 737) | function baseIteratee(value, context, argCount) {
function iteratee (line 747) | function iteratee(value, context) {
function cb (line 754) | function cb(value, context, argCount) {
function mapObject (line 761) | function mapObject(obj, iteratee, context) {
function noop (line 774) | function noop(){}
function propertyOf (line 777) | function propertyOf(obj) {
function times (line 785) | function times(n, iteratee, context) {
function random (line 793) | function random(min, max) {
function createEscaper (line 808) | function createEscaper(map) {
function escapeChar (line 867) | function escapeChar(match) {
function template (line 882) | function template(text, settings, oldSettings) {
function result (line 950) | function result(obj, path, fallback) {
function uniqueId (line 970) | function uniqueId(prefix) {
function chain (line 976) | function chain(obj) {
function executeBound (line 985) | function executeBound(sourceFunc, boundFunc, context, callingContext, ar...
function flatten$1 (line 1030) | function flatten$1(input, depth, strict, output) {
function memoize (line 1071) | function memoize(func, hasher) {
function throttle (line 1099) | function throttle(func, wait, options) {
function debounce (line 1144) | function debounce(func, wait, immediate) {
function wrap (line 1181) | function wrap(func, wrapper) {
function negate (line 1186) | function negate(predicate) {
function compose (line 1194) | function compose() {
function after (line 1206) | function after(times, func) {
function before (line 1216) | function before(times, func) {
function findKey (line 1232) | function findKey(obj, predicate, context) {
function createPredicateIndexFinder (line 1242) | function createPredicateIndexFinder(dir) {
function sortedIndex (line 1262) | function sortedIndex(array, obj, iteratee, context) {
function createIndexFinder (line 1274) | function createIndexFinder(dir, predicateFind, sortedIndex) {
function find (line 1309) | function find(obj, predicate, context) {
function findWhere (line 1317) | function findWhere(obj, attrs) {
function each (line 1325) | function each(obj, iteratee, context) {
function map (line 1342) | function map(obj, iteratee, context) {
function createReduce (line 1355) | function createReduce(dir) {
function filter (line 1387) | function filter(obj, predicate, context) {
function reject (line 1397) | function reject(obj, predicate, context) {
function every (line 1402) | function every(obj, predicate, context) {
function some (line 1414) | function some(obj, predicate, context) {
function contains (line 1426) | function contains(obj, item, fromIndex, guard) {
function pluck (line 1456) | function pluck(obj, key) {
function where (line 1462) | function where(obj, attrs) {
function max (line 1467) | function max(obj, iteratee, context) {
function min (line 1492) | function min(obj, iteratee, context) {
function sample (line 1520) | function sample(obj, n, guard) {
function shuffle (line 1539) | function shuffle(obj) {
function sortBy (line 1544) | function sortBy(obj, iteratee, context) {
function group (line 1565) | function group(behavior, partition) {
function toArray (line 1604) | function toArray(obj) {
function size (line 1616) | function size(obj) {
function keyInObj (line 1623) | function keyInObj(value, key, obj) {
function initial (line 1665) | function initial(array, n, guard) {
function first (line 1671) | function first(array, n, guard) {
function rest (line 1680) | function rest(array, n, guard) {
function last (line 1686) | function last(array, n, guard) {
function compact (line 1693) | function compact(array) {
function flatten (line 1699) | function flatten(array, depth) {
function uniq (line 1722) | function uniq(array, isSorted, iteratee, context) {
function intersection (line 1757) | function intersection(array) {
function unzip (line 1774) | function unzip(array) {
function object (line 1791) | function object(list, values) {
function range (line 1806) | function range(start, stop, step) {
function chunk (line 1827) | function chunk(array, count) {
function chainResult (line 1838) | function chainResult(instance, obj) {
function mixin (line 1843) | function mixin(obj) {
FILE: docs/html/_static/underscore-1.3.1.js
function eq (line 669) | function eq(a, b, stack) {
FILE: docs/html/_static/underscore.js
function j (line 6) | function j(n,r){return r=null==r?n.length-1:+r,function(){for(var t=Math...
function _ (line 6) | function _(n){var r=typeof n;return"function"===r||"object"===r&&!!n}
function w (line 6) | function w(n){return void 0===n}
function A (line 6) | function A(n){return!0===n||!1===n||"[object Boolean]"===a.call(n)}
function x (line 6) | function x(n){var r="[object "+n+"]";return function(n){return a.call(n)...
function W (line 6) | function W(n,r){return null!=n&&f.call(n,r)}
function $ (line 6) | function $(n){return O(n)&&y(n)}
function C (line 6) | function C(n){return function(){return n}}
function K (line 6) | function K(n){return function(r){var t=n(r);return"number"==typeof t&&t>...
function J (line 6) | function J(n){return function(r){return null==r?void 0:r[n]}}
function Z (line 6) | function Z(n,r){r=function(n){for(var r={},t=n.length,e=0;e<t;++e)r[n[e]...
function nn (line 6) | function nn(n){if(!_(n))return[];if(p)return p(n);var r=[];for(var t in ...
function rn (line 6) | function rn(n,r){var t=nn(r),e=t.length;if(null==n)return!e;for(var u=Ob...
function tn (line 6) | function tn(n){return n instanceof tn?n:this instanceof tn?void(this._wr...
function en (line 6) | function en(n){return new Uint8Array(n.buffer||n,n.byteOffset||0,G(n))}
function on (line 6) | function on(n,r,t,e){if(n===r)return 0!==n||1/n==1/r;if(null==n||null==r...
function an (line 6) | function an(n){if(!_(n))return[];var r=[];for(var t in n)r.push(t);retur...
function fn (line 6) | function fn(n){var r=Y(n);return function(t){if(null==t)return!1;var e=a...
function jn (line 6) | function jn(n){for(var r=nn(n),t=r.length,e=Array(t),u=0;u<t;u++)e[u]=n[...
function _n (line 6) | function _n(n){for(var r={},t=nn(n),e=0,u=t.length;e<u;e++)r[n[t[e]]]=t[...
function wn (line 6) | function wn(n){var r=[];for(var t in n)D(n[t])&&r.push(t);return r.sort()}
function An (line 6) | function An(n,r){return function(t){var e=arguments.length;if(r&&(t=Obje...
function Mn (line 6) | function Mn(n){if(!_(n))return{};if(v)return v(n);var r=function(){};r.p...
function En (line 6) | function En(n){return _(n)?U(n)?n.slice():xn({},n):n}
function Bn (line 6) | function Bn(n){return U(n)?n:[n]}
function Nn (line 6) | function Nn(n){return tn.toPath(n)}
function In (line 6) | function In(n,r){for(var t=r.length,e=0;e<t;e++){if(null==n)return;n=n[r...
function Tn (line 6) | function Tn(n,r,t){var e=In(n,Nn(r));return w(e)?t:e}
function kn (line 6) | function kn(n){return n}
function Dn (line 6) | function Dn(n){return n=Sn({},n),function(r){return rn(r,n)}}
function Rn (line 6) | function Rn(n){return n=Nn(n),function(r){return In(r,n)}}
function Fn (line 6) | function Fn(n,r,t){if(void 0===r)return n;switch(null==t?3:t){case 1:ret...
function Vn (line 6) | function Vn(n,r,t){return null==n?kn:D(n)?Fn(n,r,t):_(n)&&!U(n)?Dn(n):Rn...
function Pn (line 6) | function Pn(n,r){return Vn(n,r,1/0)}
function qn (line 6) | function qn(n,r,t){return tn.iteratee!==Pn?tn.iteratee(n,r):Vn(n,r,t)}
function Un (line 6) | function Un(){}
function Wn (line 6) | function Wn(n,r){return null==r&&(r=n,n=0),n+Math.floor(Math.random()*(r...
function Ln (line 6) | function Ln(n){var r=function(r){return n[r]},t="(?:"+nn(n).join("|")+")...
function Xn (line 6) | function Xn(n){return"\\"+Hn[n]}
function nr (line 6) | function nr(n,r,t,e,u){if(!(e instanceof r))return n.apply(t,u);var o=Mn...
function ur (line 6) | function ur(n,r,t,e){if(e=e||[],r||0===r){if(r<=0)return e.concat(n)}els...
function fr (line 6) | function fr(n){return function(){return!n.apply(this,arguments)}}
function cr (line 6) | function cr(n,r){var t;return function(){return--n>0&&(t=r.apply(this,ar...
function sr (line 6) | function sr(n,r,t){r=qn(r,t);for(var e,u=nn(n),o=0,i=u.length;o<i;o++)if...
function pr (line 6) | function pr(n){return function(r,t,e){t=qn(t,e);for(var u=Y(r),o=n>0?0:u...
function yr (line 6) | function yr(n,r,t,e){for(var u=(t=qn(t,e,1))(r),o=0,i=Y(n);o<i;){var a=M...
function dr (line 6) | function dr(n,r,t){return function(e,u,o){var a=0,f=Y(e);if("number"==ty...
function mr (line 6) | function mr(n,r,t){var e=(er(n)?vr:sr)(n,r,t);if(void 0!==e&&-1!==e)retu...
function jr (line 6) | function jr(n,r,t){var e,u;if(r=Fn(r,t),er(n))for(e=0,u=n.length;e<u;e++...
function _r (line 6) | function _r(n,r,t){r=qn(r,t);for(var e=!er(n)&&nn(n),u=(e||n).length,o=A...
function wr (line 6) | function wr(n){var r=function(r,t,e,u){var o=!er(r)&&nn(r),i=(o||r).leng...
function Sr (line 6) | function Sr(n,r,t){var e=[];return r=qn(r,t),jr(n,(function(n,t,u){r(n,t...
function Or (line 6) | function Or(n,r,t){r=qn(r,t);for(var e=!er(n)&&nn(n),u=(e||n).length,o=0...
function Mr (line 6) | function Mr(n,r,t){r=qn(r,t);for(var e=!er(n)&&nn(n),u=(e||n).length,o=0...
function Er (line 6) | function Er(n,r,t,e){return er(n)||(n=jn(n)),("number"!=typeof t||e)&&(t...
function Nr (line 6) | function Nr(n,r){return _r(n,Rn(r))}
function Ir (line 6) | function Ir(n,r,t){var e,u,o=-1/0,i=-1/0;if(null==r||"number"==typeof r&...
function Tr (line 6) | function Tr(n,r,t){if(null==r||t)return er(n)||(n=jn(n)),n[Wn(n.length-1...
function kr (line 6) | function kr(n,r){return function(t,e,u){var o=r?[[],[]]:{};return e=qn(e...
function qr (line 6) | function qr(n,r,t){return r in t}
function zr (line 6) | function zr(n,r,t){return i.call(n,0,Math.max(0,n.length-(null==r||t?1:r...
function Lr (line 6) | function Lr(n,r,t){return null==n||n.length<1?null==r||t?void 0:[]:null=...
function $r (line 6) | function $r(n,r,t){return i.call(n,null==r||t?1:r)}
function Jr (line 6) | function Jr(n,r,t,e){A(r)||(e=t,t=r,r=!1),null!=t&&(t=qn(t,e));for(var u...
function Hr (line 6) | function Hr(n){for(var r=n&&Ir(n,Y).length||0,t=Array(r),e=0;e<r;e++)t[e...
function Xr (line 6) | function Xr(n,r){return n._chain?tn(r).chain():r}
function Yr (line 6) | function Yr(n){return jr(wn(n),(function(r){var t=tn[r]=n[r];tn.prototyp...
FILE: docs/html/_static/websupport.js
function init (line 47) | function init() {
function initEvents (line 52) | function initEvents() {
function setComparator (line 107) | function setComparator() {
function initComparator (line 127) | function initComparator() {
function show (line 147) | function show(id) {
function hide (line 168) | function hide(id) {
function getComments (line 181) | function getComments(id) {
function addComment (line 216) | function addComment(form) {
function appendComments (line 275) | function appendComments(comments, ul) {
function insertComment (line 290) | function insertComment(comment) {
function acceptComment (line 320) | function acceptComment(id) {
function deleteComment (line 335) | function deleteComment(id) {
function showProposal (line 369) | function showProposal(id) {
function hideProposal (line 375) | function hideProposal(id) {
function showProposeChange (line 381) | function showProposeChange(id) {
function hideProposeChange (line 390) | function hideProposeChange(id) {
function toggleCommentMarkupBox (line 398) | function toggleCommentMarkupBox(id) {
function handleReSort (line 403) | function handleReSort(link) {
function handleVote (line 426) | function handleVote(link) {
function openReply (line 488) | function openReply(id) {
function closeReply (line 516) | function closeReply(id) {
function sortComments (line 530) | function sortComments(comments) {
function getChildren (line 542) | function getChildren(ul, recursive) {
function createCommentDiv (line 555) | function createCommentDiv(comment) {
function renderTemplate (line 593) | function renderTemplate(template, context) {
function showError (line 610) | function showError(message) {
FILE: eventkit/event.py
class Event (line 12) | class Event:
method __init__ (line 37) | def __init__(self, name: str = '', _with_error_done_events: bool = True):
method name (line 57) | def name(self) -> str:
method done (line 63) | def done(self) -> bool:
method set_done (line 70) | def set_done(self):
method value (line 79) | def value(self):
method connect (line 87) | def connect(self, listener, error=None, done=None,
method disconnect (line 142) | def disconnect(self, listener, error=None, done=None):
method disconnect_obj (line 168) | def disconnect_obj(self, obj):
method emit (line 186) | def emit(self, *args):
method emit_threadsafe (line 220) | def emit_threadsafe(self, *args):
method clear (line 227) | def clear(self):
method run (line 235) | def run(self) -> List:
method pipe (line 259) | def pipe(self, *targets: "Event"):
method fork (line 284) | def fork(self, *targets: "Event") -> "Fork":
method set_source (line 309) | def set_source(self, source):
method _onFinalize (line 312) | def _onFinalize(self, ref):
method _split (line 319) | def _split(c):
method aiter (line 339) | async def aiter(self, skip_to_last: bool = False, tuples: bool = False):
method __repr__ (line 396) | def __repr__(self):
method __len__ (line 399) | def __len__(self):
method __bool__ (line 402) | def __bool__(self):
method __getitem__ (line 405) | def __getitem__(self, fork_targets) -> "Fork":
method __await__ (line 410) | def __await__(self):
method __contains__ (line 453) | def __contains__(self, c):
method __reduce__ (line 462) | def __reduce__(self):
method init (line 471) | def init(obj, event_names: Iterable):
method create (line 485) | def create(obj):
method wait (line 509) | def wait(future: Awaitable) -> "Wait":
method aiterate (line 522) | def aiterate(ait: AsyncIterable) -> "Aiterate":
method sequence (line 541) | def sequence(
method repeat (line 557) | def repeat(
method range (line 573) | def range(
method timerange (line 588) | def timerange(start=0, end=None, step=1) -> "Timerange":
method timer (line 611) | def timer(interval: float, count: Union[int, None] = None) -> "Timer":
method marble (line 623) | def marble(
method filter (line 640) | def filter(self, predicate=bool) -> "Filter":
method skip (line 650) | def skip(self, count: int = 1) -> "Skip":
method take (line 660) | def take(self, count: int = 1) -> "Take":
method takewhile (line 669) | def takewhile(self, predicate=bool) -> "TakeWhile":
method dropwhile (line 680) | def dropwhile(self, predicate=lambda x: not x) -> "DropWhile":
method takeuntil (line 691) | def takeuntil(self, notifier: "Event") -> "TakeUntil":
method constant (line 702) | def constant(self, constant) -> "Constant":
method iterate (line 713) | def iterate(self, it) -> "Iterate":
method count (line 728) | def count(self, start=0, step=1) -> "Count":
method enumerate (line 740) | def enumerate(self, start=0, step=1) -> "Enumerate":
method timestamp (line 752) | def timestamp(self) -> "Timestamp":
method partial (line 763) | def partial(self, *left_args) -> "Partial":
method partial_right (line 774) | def partial_right(self, *right_args) -> "PartialRight":
method star (line 785) | def star(self) -> "Star":
method pack (line 796) | def pack(self) -> "Pack":
method pluck (line 806) | def pluck(self, *selections: Union[int, str]) -> "Pluck":
method map (line 836) | def map(
method emap (line 865) | def emap(self, constr, joiner: "AddableJoinOp") -> "Emap":
method mergemap (line 881) | def mergemap(self, constr) -> "Mergemap":
method concatmap (line 896) | def concatmap(self, constr) -> "Concatmap":
method chainmap (line 911) | def chainmap(self, constr) -> "Chainmap":
method switchmap (line 926) | def switchmap(self, constr) -> "Switchmap":
method reduce (line 941) | def reduce(self, func, initializer=NO_VALUE) -> "Reduce":
method min (line 960) | def min(self) -> "Min":
method max (line 966) | def max(self) -> "Max":
method sum (line 972) | def sum(self, start=0) -> "Sum":
method product (line 981) | def product(self, start=1) -> "Product":
method mean (line 990) | def mean(self) -> "Mean":
method any (line 996) | def any(self) -> "Any":
method all (line 1002) | def all(self) -> "All":
method ema (line 1008) | def ema(self, n: Union[int, None] = None,
method previous (line 1022) | def previous(self, count: int = 1) -> "Previous":
method pairwise (line 1036) | def pairwise(self) -> "Pairwise":
method changes (line 1046) | def changes(self) -> "Changes":
method unique (line 1052) | def unique(self, key=None) -> "Unique":
method last (line 1064) | def last(self) -> "Last":
method list (line 1070) | def list(self) -> "ListOp":
method deque (line 1076) | def deque(self, count=0) -> "Deque":
method array (line 1086) | def array(self, count=0) -> "Array":
method chunk (line 1096) | def chunk(self, size: int) -> "Chunk":
method chunkwith (line 1105) | def chunkwith(
method chain (line 1116) | def chain(self, *sources: "Event") -> "Chain":
method merge (line 1133) | def merge(self, *sources) -> "Merge":
method concat (line 1147) | def concat(self, *sources) -> "Concat":
method switch (line 1162) | def switch(self, *sources) -> "Switch":
method zip (line 1177) | def zip(self, *sources) -> "Zip":
method ziplatest (line 1193) | def ziplatest(self, *sources, partial: bool = True) -> "Ziplatest":
method delay (line 1210) | def delay(self, delay) -> "Delay":
method timeout (line 1224) | def timeout(self, timeout) -> "Timeout":
method throttle (line 1234) | def throttle(
method debounce (line 1256) | def debounce(self, delay, on_first: bool = False) -> "Debounce":
method copy (line 1278) | def copy(self) -> "Copy":
method deepcopy (line 1284) | def deepcopy(self) -> "Deepcopy":
method sample (line 1290) | def sample(self, timer: "Event") -> "Sample":
method errors (line 1300) | def errors(self) -> "Errors":
method end_on_error (line 1306) | def end_on_error(self) -> "EndOnError":
FILE: eventkit/ops/aggregate.py
class Count (line 10) | class Count(Iterate):
method __init__ (line 13) | def __init__(self, start=0, step=1, source=None):
class Reduce (line 18) | class Reduce(Op):
method __init__ (line 21) | def __init__(self, func, initializer=NO_VALUE, source=None):
method on_source (line 27) | def on_source(self, arg):
class Min (line 39) | class Min(Reduce):
method __init__ (line 42) | def __init__(self, source=None):
class Max (line 46) | class Max(Reduce):
method __init__ (line 49) | def __init__(self, source=None):
class Sum (line 53) | class Sum(Reduce):
method __init__ (line 56) | def __init__(self, start=0, source=None):
class Product (line 60) | class Product(Reduce):
method __init__ (line 63) | def __init__(self, start=1, source=None):
class Mean (line 67) | class Mean(Op):
method __init__ (line 70) | def __init__(self, source=None):
method on_source (line 75) | def on_source(self, arg):
class Any (line 81) | class Any(Reduce):
method __init__ (line 84) | def __init__(self, source=None):
class All (line 88) | class All(Reduce):
method __init__ (line 91) | def __init__(self, source=None):
class Ema (line 95) | class Ema(Op):
method __init__ (line 98) | def __init__(self, n=None, weight=None, source=None):
method on_source (line 104) | def on_source(self, *args):
class Pairwise (line 114) | class Pairwise(Op):
method __init__ (line 117) | def __init__(self, source=None):
method on_source (line 121) | def on_source(self, *args):
class List (line 130) | class List(Op):
method __init__ (line 133) | def __init__(self, source=None):
method on_source (line 137) | def on_source(self, *args):
method on_source_done (line 141) | def on_source_done(self, source):
class Deque (line 146) | class Deque(Op):
method __init__ (line 149) | def __init__(self, count, source=None):
method on_source (line 154) | def on_source(self, *args):
FILE: eventkit/ops/array.py
class Array (line 9) | class Array(Op):
method __init__ (line 12) | def __init__(self, count, source=None):
method on_source (line 17) | def on_source(self, *args):
method min (line 24) | def min(self) -> "ArrayMin": # type: ignore
method max (line 30) | def max(self) -> "ArrayMax": # type: ignore
method sum (line 36) | def sum(self) -> "ArraySum": # type: ignore
method prod (line 42) | def prod(self) -> "ArrayProd":
method mean (line 48) | def mean(self) -> "ArrayMean": # type: ignore
method std (line 54) | def std(self) -> "ArrayStd": # type: ignore
method any (line 60) | def any(self) -> "ArrayAny": # type: ignore
method all (line 66) | def all(self) -> "ArrayAll": # type: ignore
class ArrayMin (line 73) | class ArrayMin(Op):
method on_source (line 76) | def on_source(self, arg):
class ArrayMax (line 80) | class ArrayMax(Op):
method on_source (line 83) | def on_source(self, arg):
class ArraySum (line 87) | class ArraySum(Op):
method on_source (line 90) | def on_source(self, arg):
class ArrayProd (line 94) | class ArrayProd(Op):
method on_source (line 97) | def on_source(self, arg):
class ArrayMean (line 101) | class ArrayMean(Op):
method on_source (line 104) | def on_source(self, arg):
class ArrayStd (line 108) | class ArrayStd(Op):
method on_source (line 111) | def on_source(self, arg):
class ArrayAny (line 115) | class ArrayAny(Op):
method on_source (line 118) | def on_source(self, arg):
class ArrayAll (line 122) | class ArrayAll(Op):
method on_source (line 125) | def on_source(self, arg):
FILE: eventkit/ops/combine.py
class Fork (line 10) | class Fork(list):
method __init__ (line 13) | def __init__(self):
method join (line 16) | def join(self, joiner: "JoinOp"):
method concat (line 21) | def concat(self) -> "Concat":
method merge (line 24) | def merge(self) -> "Merge":
method switch (line 27) | def switch(self) -> "Switch":
method zip (line 30) | def zip(self) -> "Zip":
method ziplatest (line 33) | def ziplatest(self) -> "Ziplatest":
method chain (line 36) | def chain(self) -> "Chain":
class JoinOp (line 40) | class JoinOp(Op):
method _set_sources (line 50) | def _set_sources(self, sources):
class AddableJoinOp (line 54) | class AddableJoinOp(JoinOp):
method __init__ (line 64) | def __init__(self, *sources: Event):
method _set_sources (line 70) | def _set_sources(self, *sources):
method add_source (line 75) | def add_source(self, source):
method set_parent (line 79) | def set_parent(self, parent: Event):
method on_source_done (line 84) | def on_source_done(self, source):
method _on_parent_done (line 90) | def _on_parent_done(self, parent):
class Merge (line 97) | class Merge(AddableJoinOp):
method add_source (line 100) | def add_source(self, source):
class Switch (line 105) | class Switch(AddableJoinOp):
method __init__ (line 108) | def __init__(self, *sources):
method add_source (line 114) | def add_source(self, source):
method _remove_source (line 122) | def _remove_source(self, source):
method on_source_s (line 129) | def on_source_s(self, source, *args):
method on_source_done (line 135) | def on_source_done(self, source):
class Concat (line 142) | class Concat(AddableJoinOp):
method __init__ (line 145) | def __init__(self, *sources):
method add_source (line 150) | def add_source(self, source):
method _on_source_s (line 160) | def _on_source_s(self, source, *args):
method on_source_done (line 168) | def on_source_done(self, source):
class Chain (line 177) | class Chain(AddableJoinOp):
method __init__ (line 180) | def __init__(self, *sources):
method add_source (line 186) | def add_source(self, source):
method on_source_done (line 198) | def on_source_done(self, source):
class Zip (line 219) | class Zip(JoinOp):
method __init__ (line 222) | def __init__(self, *sources):
method _set_sources (line 229) | def _set_sources(self, *sources):
method _on_source_i (line 240) | def _on_source_i(self, i, *args):
method on_source_done (line 253) | def on_source_done(self, source):
class Ziplatest (line 264) | class Ziplatest(JoinOp):
method __init__ (line 267) | def __init__(self, *sources, partial=True):
method _set_sources (line 274) | def _set_sources(self, *sources):
method _on_source_i (line 286) | def _on_source_i(self, i, *args):
method on_source_done (line 294) | def on_source_done(self, source):
FILE: eventkit/ops/create.py
class Wait (line 10) | class Wait(Event):
method __init__ (line 13) | def __init__(self, future, name='wait'):
method _on_task_done (line 23) | def _on_task_done(self, task):
method __del__ (line 33) | def __del__(self):
class Aiterate (line 38) | class Aiterate(Event):
method __init__ (line 41) | def __init__(self, ait):
method _looper (line 46) | async def _looper(self, ait):
method __del__ (line 55) | def __del__(self):
class Sequence (line 60) | class Sequence(Aiterate):
method __init__ (line 63) | def __init__(self, values, interval=0, times=None):
class Repeat (line 79) | class Repeat(Sequence):
method __init__ (line 82) | def __init__(self, value, count, interval=0, times=None):
class Range (line 86) | class Range(Sequence):
method __init__ (line 89) | def __init__(self, *args, interval=0, times=None):
class Timerange (line 93) | class Timerange(Aiterate):
method __init__ (line 96) | def __init__(self, start=0, end=None, step=1):
class Timer (line 100) | class Timer(Aiterate):
method __init__ (line 103) | def __init__(self, interval, count=None):
class Marble (line 115) | class Marble(Op):
method __init__ (line 118) | def __init__(self, s, interval=0, times=None):
FILE: eventkit/ops/misc.py
class Errors (line 5) | class Errors(Event):
method __init__ (line 8) | def __init__(self, source=None):
class EndOnError (line 17) | class EndOnError(Op):
method __init__ (line 20) | def __init__(self, source=None):
method on_source_error (line 23) | def on_source_error(self, error):
FILE: eventkit/ops/op.py
class Op (line 6) | class Op(Event):
method __init__ (line 22) | def __init__(self, source: Union[Event, None] = None):
method on_source_error (line 29) | def on_source_error(self, source, error):
method on_source_done (line 35) | def on_source_done(self, _source):
method set_source (line 41) | def set_source(self, source):
method _connect_from (line 49) | def _connect_from(self, source: Event):
method _disconnect_from (line 59) | def _disconnect_from(self, source: Event):
FILE: eventkit/ops/select.py
class Filter (line 5) | class Filter(Op):
method __init__ (line 8) | def __init__(self, predicate=bool, source=None):
method on_source (line 12) | def on_source(self, *args):
class Skip (line 17) | class Skip(Op):
method __init__ (line 20) | def __init__(self, count=1, source=None):
method on_source (line 25) | def on_source(self, *args):
class Take (line 32) | class Take(Op):
method __init__ (line 35) | def __init__(self, count=1, source=None):
method on_source (line 40) | def on_source(self, *args):
class TakeWhile (line 49) | class TakeWhile(Op):
method __init__ (line 52) | def __init__(self, predicate=bool, source=None):
method on_source (line 56) | def on_source(self, *args):
class DropWhile (line 64) | class DropWhile(Op):
method __init__ (line 67) | def __init__(self, predicate=lambda x: not x, source=None):
method on_source (line 72) | def on_source(self, *args):
class TakeUntil (line 79) | class TakeUntil(Op):
method __init__ (line 82) | def __init__(self, notifier, source=None):
method _on_notifier (line 90) | def _on_notifier(self, *args):
method on_source_done (line 93) | def on_source_done(self, source):
class Changes (line 102) | class Changes(Op):
method __init__ (line 105) | def __init__(self, source=None):
method on_source (line 109) | def on_source(self, *args):
class Unique (line 115) | class Unique(Op):
method __init__ (line 118) | def __init__(self, key, source=None):
method on_source (line 123) | def on_source(self, *args):
class Last (line 133) | class Last(Op):
method __init__ (line 136) | def __init__(self, source=None):
method on_source (line 140) | def on_source(self, *args):
method on_source_done (line 143) | def on_source_done(self, source):
FILE: eventkit/ops/timing.py
class Delay (line 8) | class Delay(Op):
method __init__ (line 11) | def __init__(self, delay, source=None):
method on_source (line 15) | def on_source(self, *args):
method on_source_error (line 19) | def on_source_error(self, error):
method on_source_done (line 23) | def on_source_done(self, source):
class Timeout (line 31) | class Timeout(Op):
method __init__ (line 34) | def __init__(self, timeout, source=None):
method on_source (line 44) | def on_source(self, *args):
method on_source_done (line 48) | def on_source_done(self, source):
method _schedule (line 53) | def _schedule(self):
method _on_timer (line 58) | def _on_timer(self):
class Debounce (line 67) | class Debounce(Op):
method __init__ (line 70) | def __init__(self, interval, on_first=False, source=None):
method on_source (line 77) | def on_source(self, *args):
method _delayed_emit (line 91) | def _delayed_emit(self, *args):
method on_source_done (line 97) | def on_source_done(self, source):
class Throttle (line 104) | class Throttle(Op):
method __init__ (line 109) | def __init__(self, maximum, interval, cost_func=None, source=None):
method set_limit (line 124) | def set_limit(self, maximum, interval):
method on_source (line 131) | def on_source(self, *args):
method on_source_done (line 138) | def on_source_done(self, source):
method _try_emit (line 145) | def _try_emit(self):
class Sample (line 187) | class Sample(Op):
method __init__ (line 190) | def __init__(self, timer, source=None):
method on_source (line 198) | def on_source(self, *args):
method _on_timer (line 201) | def _on_timer(self, *args):
method on_source_done (line 205) | def on_source_done(self, source):
FILE: eventkit/ops/transform.py
class Constant (line 11) | class Constant(Op):
method __init__ (line 14) | def __init__(self, constant, source=None):
method on_source (line 18) | def on_source(self, *args):
class Iterate (line 22) | class Iterate(Op):
method __init__ (line 25) | def __init__(self, it, source=None):
method on_source (line 29) | def on_source(self, *args):
class Enumerate (line 38) | class Enumerate(Op):
method __init__ (line 41) | def __init__(self, start=0, step=1, source=None):
method on_source (line 46) | def on_source(self, *args):
class Timestamp (line 53) | class Timestamp(Op):
method on_source (line 56) | def on_source(self, *args):
class Partial (line 62) | class Partial(Op):
method __init__ (line 65) | def __init__(self, *left_args, source=None):
method on_source (line 69) | def on_source(self, *args):
class PartialRight (line 73) | class PartialRight(Op):
method __init__ (line 76) | def __init__(self, *right_args, source=None):
method on_source (line 80) | def on_source(self, *args):
class Star (line 84) | class Star(Op):
method on_source (line 87) | def on_source(self, arg):
class Pack (line 91) | class Pack(Op):
method on_source (line 94) | def on_source(self, *args):
class Pluck (line 98) | class Pluck(Op):
method __init__ (line 101) | def __init__(self, *selections, source=None):
method on_source (line 117) | def on_source(self, *args):
class Previous (line 130) | class Previous(Op):
method __init__ (line 133) | def __init__(self, count=1, source=None):
method on_source (line 138) | def on_source(self, *args):
class Copy (line 144) | class Copy(Op):
method on_source (line 147) | def on_source(self, *args):
class Deepcopy (line 151) | class Deepcopy(Op):
method on_source (line 154) | def on_source(self, *args):
class Chunk (line 158) | class Chunk(Op):
method __init__ (line 161) | def __init__(self, size, source=None):
method on_source (line 166) | def on_source(self, *args):
method on_source_done (line 173) | def on_source_done(self, source):
class ChunkWith (line 179) | class ChunkWith(Op):
method __init__ (line 182) | def __init__(self, timer, emit_empty, source=None):
method on_source (line 192) | def on_source(self, *args):
method _on_timer (line 196) | def _on_timer(self, *args):
method on_source_done (line 201) | def on_source_done(self, source):
class Map (line 214) | class Map(Op):
method __init__ (line 218) | def __init__(
method on_source (line 230) | def on_source(self, *args):
method on_source_done (line 244) | def on_source_done(self, source):
method _create_task (line 250) | def _create_task(self, coro):
method _on_task_done (line 259) | def _on_task_done(self, task):
method _emit_task (line 282) | def _emit_task(self, task):
class Emap (line 291) | class Emap(Op):
method __init__ (line 294) | def __init__(self, constr, joiner, source=None):
method on_source (line 304) | def on_source(self, *args):
method on_source_done (line 309) | def on_source_done(self, source):
method _on_joiner_done (line 312) | def _on_joiner_done(self, joiner):
class Mergemap (line 321) | class Mergemap(Emap):
method __init__ (line 324) | def __init__(self, constr, source=None):
class Chainmap (line 328) | class Chainmap(Emap):
method __init__ (line 331) | def __init__(self, constr, source=None):
class Concatmap (line 335) | class Concatmap(Emap):
method __init__ (line 338) | def __init__(self, constr, source=None):
class Switchmap (line 342) | class Switchmap(Emap):
method __init__ (line 345) | def __init__(self, constr, source=None):
FILE: eventkit/util.py
class _NoValue (line 6) | class _NoValue:
method __bool__ (line 7) | def __bool__(self):
method __repr__ (line 10) | def __repr__(self):
function get_event_loop (line 19) | def get_event_loop():
function timerange (line 27) | async def timerange(start=0, end=None, step: float = 1) \
FILE: tests/aggregate_test.py
class AggregateTest (line 8) | class AggregateTest(unittest.TestCase):
method test_min (line 10) | def test_min(self):
method test_max (line 14) | def test_max(self):
method test_sum (line 18) | def test_sum(self):
method test_product (line 23) | def test_product(self):
method test_any (line 28) | def test_any(self):
method test_all (line 33) | def test_all(self):
method test_pairwaise (line 38) | def test_pairwaise(self):
method test_chunk (line 42) | def test_chunk(self):
method test_chunkwith (line 46) | def test_chunkwith(self):
method test_array (line 51) | def test_array(self):
FILE: tests/combine_test.py
class CombineTest (line 10) | class CombineTest(unittest.TestCase):
method test_merge (line 12) | def test_merge(self):
method test_switch (line 19) | def test_switch(self):
method test_concat (line 26) | def test_concat(self):
method test_chain (line 33) | def test_chain(self):
method test_zip (line 39) | def test_zip(self):
method test_zip_self (line 45) | def test_zip_self(self):
method test_ziplatest (line 50) | def test_ziplatest(self):
FILE: tests/create_test.py
class CreateTest (line 12) | class CreateTest(unittest.TestCase):
method test_wait (line 14) | def test_wait(self):
method test_aiterate (line 20) | def test_aiterate(self):
method test_marble (line 28) | def test_marble(self):
FILE: tests/event_test.py
class Object (line 11) | class Object:
method __init__ (line 13) | def __init__(self):
method method (line 16) | def method(self, x, y):
method __call__ (line 19) | def __call__(self, x, y):
function ait (line 23) | async def ait(it):
class EventTest (line 29) | class EventTest(unittest.TestCase):
method test_functor (line 31) | def test_functor(self):
method test_method (line 49) | def test_method(self):
method test_function (line 73) | def test_function(self):
method test_cmethod (line 97) | def test_cmethod(self):
method test_keep_ref (line 103) | def test_keep_ref(self):
method test_coro_func (line 119) | def test_coro_func(self):
method test_aiter (line 139) | def test_aiter(self):
method test_fork (line 148) | def test_fork(self):
method test_operator_connect (line 154) | def test_operator_connect(self):
FILE: tests/select_test.py
class SelectTest (line 8) | class SelectTest(unittest.TestCase):
method test_select (line 10) | def test_select(self):
method test_skip (line 14) | def test_skip(self):
method test_take (line 18) | def test_take(self):
method test_takewhile (line 22) | def test_takewhile(self):
method test_dropwhile (line 26) | def test_dropwhile(self):
method test_changes (line 30) | def test_changes(self):
method test_unique (line 35) | def test_unique(self):
method test_last (line 40) | def test_last(self):
FILE: tests/timing_test.py
class TimingTest (line 11) | class TimingTest(unittest.TestCase):
method test_delay (line 13) | def test_delay(self):
method test_sample (line 21) | def test_sample(self):
method test_timeout (line 26) | def test_timeout(self):
method test_debounce (line 31) | def test_debounce(self):
method test_debounce_on_first (line 37) | def test_debounce_on_first(self):
method test_throttle (line 43) | def test_throttle(self):
FILE: tests/transform_test.py
class TransformTest (line 15) | class TransformTest(unittest.TestCase):
method test_constant (line 17) | def test_constant(self):
method test_previous (line 21) | def test_previous(self):
method test_iterate (line 25) | def test_iterate(self):
method test_count (line 29) | def test_count(self):
method test_enumerate (line 34) | def test_enumerate(self):
method test_timestamp (line 39) | def test_timestamp(self):
method test_partial (line 46) | def test_partial(self):
method test_partial_right (line 50) | def test_partial_right(self):
method test_star (line 54) | def test_star(self):
method test_pack (line 62) | def test_pack(self):
method test_pluck (line 66) | def test_pluck(self):
method test_sync_map (line 81) | def test_sync_map(self):
method test_sync_star_map (line 85) | def test_sync_star_map(self):
method test_async_map (line 92) | def test_async_map(self):
method test_async_map_unordered (line 100) | def test_async_map_unordered(self):
method test_mergemap (line 117) | def test_mergemap(self):
method test_mergemap2 (line 128) | def test_mergemap2(self):
method test_concatmap (line 135) | def test_concatmap(self):
method test_chainmap (line 146) | def test_chainmap(self):
method test_switchmap (line 157) | def test_switchmap(self):
Condensed preview — 83 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,889K chars).
[
{
"path": ".gitattributes",
"chars": 35,
"preview": "notebooks/* linguist-documentation\n"
},
{
"path": ".github/workflows/test.yml",
"chars": 841,
"preview": "name: eventkit\n\non: [ push, pull_request ]\n\njobs:\n build:\n runs-on: ubuntu-latest\n strategy:\n matrix:\n "
},
{
"path": ".gitignore",
"chars": 178,
"preview": "dist.sh\n**/__pycache__\ndist\nbuild\n.vscode\n.idea\n.settings\n.spyproject\n.project\n.pydevproject\n.mypy_cache\ndocs/html/.buil"
},
{
"path": ".readthedocs.yml",
"chars": 252,
"preview": "# .readthedocs.yml\n\nversion: 2\n\nbuild:\n os: ubuntu-22.04\n tools:\n python: \"3.12\"\n\n\npython:\n install:\n - method:"
},
{
"path": "LICENSE",
"chars": 1317,
"preview": "BSD 2-Clause License\n\nCopyright (c) 2023, Ewald de Wit\nAll rights reserved.\n\nRedistribution and use in source and binary"
},
{
"path": "README.rst",
"chars": 4537,
"preview": "|Build| |PyVersion| |Status| |PyPiVersion| |License| |Docs|\n\nIntroduction\n------------\n\nThe primary use cases of eventki"
},
{
"path": "docs/Makefile",
"chars": 603,
"preview": "# Minimal makefile for Sphinx documentation\n#\n\n# You can set these variables from the command line.\nSPHINXOPTS =\nSPHI"
},
{
"path": "docs/api.rst",
"chars": 732,
"preview": ".. _api:\n\n\neventkit\n========\n\nRelease |release|.\n\n.. toctree::\n :maxdepth: 3\n :caption: Modules:\n\nEvent\n-----\n.. aut"
},
{
"path": "docs/conf.py",
"chars": 1134,
"preview": "extensions = [\n 'sphinx.ext.autodoc',\n 'sphinx.ext.viewcode',\n 'sphinx.ext.napoleon',\n 'sphinx_autodoc_typeh"
},
{
"path": "docs/html/_modules/asyncio/unix_events.html",
"chars": 161820,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"en\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html class=\""
},
{
"path": "docs/html/_modules/eventkit/event.html",
"chars": 151926,
"preview": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content"
},
{
"path": "docs/html/_modules/eventkit/ops/aggregate.html",
"chars": 31671,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"en\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html class=\""
},
{
"path": "docs/html/_modules/eventkit/ops/array.html",
"chars": 21235,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"en\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html class=\""
},
{
"path": "docs/html/_modules/eventkit/ops/combine.html",
"chars": 57031,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"en\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html class=\""
},
{
"path": "docs/html/_modules/eventkit/ops/create.html",
"chars": 23215,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"en\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html class=\""
},
{
"path": "docs/html/_modules/eventkit/ops/misc.html",
"chars": 7817,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"en\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html class=\""
},
{
"path": "docs/html/_modules/eventkit/ops/op.html",
"chars": 11799,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"en\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html class=\""
},
{
"path": "docs/html/_modules/eventkit/ops/select.html",
"chars": 27338,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"en\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html class=\""
},
{
"path": "docs/html/_modules/eventkit/ops/timing.html",
"chars": 36490,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"en\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html class=\""
},
{
"path": "docs/html/_modules/eventkit/ops/transform.html",
"chars": 60233,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"en\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html class=\""
},
{
"path": "docs/html/_modules/eventkit/util.html",
"chars": 12827,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"en\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html class=\""
},
{
"path": "docs/html/_modules/index.html",
"chars": 3489,
"preview": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content"
},
{
"path": "docs/html/_modules/logging.html",
"chars": 247344,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"en\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html class=\""
},
{
"path": "docs/html/_sources/api.rst.txt",
"chars": 732,
"preview": ".. _api:\n\n\neventkit\n========\n\nRelease |release|.\n\n.. toctree::\n :maxdepth: 3\n :caption: Modules:\n\nEvent\n-----\n.. aut"
},
{
"path": "docs/html/_sources/index.rst.txt",
"chars": 67,
"preview": "\n.. include:: ../README.rst\n\n.. toctree::\n :maxdepth: 3\n\n api\n\n"
},
{
"path": "docs/html/_static/_sphinx_javascript_frameworks_compat.js",
"chars": 4418,
"preview": "/*\n * _sphinx_javascript_frameworks_compat.js\n * ~~~~~~~~~~\n *\n * Compatability shim for jQuery and underscores.js.\n *\n "
},
{
"path": "docs/html/_static/basic.css",
"chars": 14810,
"preview": "/*\n * basic.css\n * ~~~~~~~~~\n *\n * Sphinx stylesheet -- basic theme.\n *\n * :copyright: Copyright 2007-2022 by the Sphinx"
},
{
"path": "docs/html/_static/css/badge_only.css",
"chars": 2876,
"preview": ".clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:\"\"}.clearfix:after{clear:both}@font-face{font-f"
},
{
"path": "docs/html/_static/css/theme.css",
"chars": 129481,
"preview": "html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgr"
},
{
"path": "docs/html/_static/doctools.js",
"chars": 4472,
"preview": "/*\n * doctools.js\n * ~~~~~~~~~~~\n *\n * Base JavaScript utilities for all Sphinx HTML documentation.\n *\n * :copyright: Co"
},
{
"path": "docs/html/_static/documentation_options.js",
"chars": 420,
"preview": "var DOCUMENTATION_OPTIONS = {\n URL_ROOT: document.getElementById(\"documentation_options\").getAttribute('data-url_root"
},
{
"path": "docs/html/_static/jquery-3.2.1.js",
"chars": 268039,
"preview": "/*!\n * jQuery JavaScript Library v3.2.1\n * https://jquery.com/\n *\n * Includes Sizzle.js\n * https://sizzlejs.com/\n *\n * C"
},
{
"path": "docs/html/_static/jquery-3.5.1.js",
"chars": 287630,
"preview": "/*!\n * jQuery JavaScript Library v3.5.1\n * https://jquery.com/\n *\n * Includes Sizzle.js\n * https://sizzlejs.com/\n *\n * C"
},
{
"path": "docs/html/_static/jquery-3.6.0.js",
"chars": 288580,
"preview": "/*!\n * jQuery JavaScript Library v3.6.0\n * https://jquery.com/\n *\n * Includes Sizzle.js\n * https://sizzlejs.com/\n *\n * C"
},
{
"path": "docs/html/_static/jquery.js",
"chars": 89501,
"preview": "/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */\n!function(e,t){\"use strict\";\"ob"
},
{
"path": "docs/html/_static/js/badge_only.js",
"chars": 934,
"preview": "!function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.expo"
},
{
"path": "docs/html/_static/js/theme.js",
"chars": 5023,
"preview": "!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.expo"
},
{
"path": "docs/html/_static/language_data.js",
"chars": 4758,
"preview": "/*\n * language_data.js\n * ~~~~~~~~~~~~~~~~\n *\n * This script contains the language-specific data used by searchtools.js,"
},
{
"path": "docs/html/_static/pygments.css",
"chars": 4846,
"preview": "pre { line-height: 125%; }\ntd.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; paddin"
},
{
"path": "docs/html/_static/searchtools.js",
"chars": 18215,
"preview": "/*\n * searchtools.js\n * ~~~~~~~~~~~~~~~~\n *\n * Sphinx JavaScript utilities for the full-text search.\n *\n * :copyright: C"
},
{
"path": "docs/html/_static/sphinx_highlight.js",
"chars": 4712,
"preview": "/* Highlighting utilities for Sphinx HTML documentation. */\n\"use strict\";\n\nconst SPHINX_HIGHLIGHT_ENABLED = true\n\n/**\n *"
},
{
"path": "docs/html/_static/underscore-1.12.0.js",
"chars": 67680,
"preview": "(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory("
},
{
"path": "docs/html/_static/underscore-1.13.1.js",
"chars": 68408,
"preview": "(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory("
},
{
"path": "docs/html/_static/underscore-1.3.1.js",
"chars": 35168,
"preview": "// Underscore.js 1.3.1\n// (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc.\n// Underscore is freely distribu"
},
{
"path": "docs/html/_static/underscore.js",
"chars": 19530,
"preview": "!function(n,r){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=r():\"function\"==typeof define&&define"
},
{
"path": "docs/html/_static/websupport.js",
"chars": 25355,
"preview": "/*\n * websupport.js\n * ~~~~~~~~~~~~~\n *\n * sphinx.websupport utilities for all documentation.\n *\n * :copyright: Copyrigh"
},
{
"path": "docs/html/api.html",
"chars": 171848,
"preview": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n <meta charset=\"utf-8\" /><meta name=\"generator\" content=\""
},
{
"path": "docs/html/genindex.html",
"chars": 19254,
"preview": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content"
},
{
"path": "docs/html/index.html",
"chars": 20186,
"preview": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n <meta charset=\"utf-8\" /><meta name=\"generator\" content=\""
},
{
"path": "docs/html/py-modindex.html",
"chars": 5948,
"preview": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content"
},
{
"path": "docs/html/search.html",
"chars": 3737,
"preview": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content"
},
{
"path": "docs/html/searchindex.js",
"chars": 19220,
"preview": "Search.setIndex({\"docnames\": [\"api\", \"index\"], \"filenames\": [\"api.rst\", \"index.rst\"], \"titles\": [\"eventkit\", \"Introducti"
},
{
"path": "docs/index.rst",
"chars": 67,
"preview": "\n.. include:: ../README.rst\n\n.. toctree::\n :maxdepth: 3\n\n api\n\n"
},
{
"path": "docs/make.bat",
"chars": 805,
"preview": "@ECHO OFF\r\n\r\npushd %~dp0\r\n\r\nREM Command file for Sphinx documentation\r\n\r\nif \"%SPHINXBUILD%\" == \"\" (\r\n\tset SPHINXBUILD=py"
},
{
"path": "docs/requirements.txt",
"chars": 65,
"preview": "sphinxcontrib-napoleon\nsphinx-autodoc-typehints\nsphinx-rtd-theme\n"
},
{
"path": "eventkit/__init__.py",
"chars": 998,
"preview": "\"\"\"Event-driven data pipelines.\"\"\"\n\nfrom .event import Event\nfrom .ops.aggregate import (\n All, Any, Count, Deque, Em"
},
{
"path": "eventkit/event.py",
"chars": 41870,
"preview": "import asyncio\nimport logging\nimport types\nimport weakref\nfrom typing import (\n Any as AnyType, AsyncIterable, Awaita"
},
{
"path": "eventkit/ops/__init__.py",
"chars": 23,
"preview": "\"\"\"Event operators.\"\"\"\n"
},
{
"path": "eventkit/ops/aggregate.py",
"chars": 3875,
"preview": "import itertools\nimport operator\nfrom collections import deque\n\nfrom .op import Op\nfrom .transform import Iterate\nfrom ."
},
{
"path": "eventkit/ops/array.py",
"chars": 2424,
"preview": "from collections import deque\n\nimport numpy as np\n\nfrom .op import Op\nfrom ..util import NO_VALUE\n\n\nclass Array(Op):\n "
},
{
"path": "eventkit/ops/combine.py",
"chars": 9242,
"preview": "import functools\nfrom collections import defaultdict, deque\nfrom typing import Deque, Optional\n\nfrom .op import Op\nfrom "
},
{
"path": "eventkit/ops/create.py",
"chars": 3302,
"preview": "import asyncio\nimport itertools\nimport time\n\nfrom .op import Op\nfrom ..event import Event\nfrom ..util import NO_VALUE, g"
},
{
"path": "eventkit/ops/misc.py",
"chars": 587,
"preview": "from .op import Op\nfrom ..event import Event\n\n\nclass Errors(Event):\n __slots__ = ('_source',)\n\n def __init__(self,"
},
{
"path": "eventkit/ops/op.py",
"chars": 1711,
"preview": "from typing import Union\n\nfrom ..event import Event\n\n\nclass Op(Event):\n \"\"\"\n Base functionality for operators.\n\n "
},
{
"path": "eventkit/ops/select.py",
"chars": 3461,
"preview": "from .op import Op\nfrom ..util import NO_VALUE\n\n\nclass Filter(Op):\n __slots__ = ('_predicate',)\n\n def __init__(sel"
},
{
"path": "eventkit/ops/timing.py",
"chars": 6159,
"preview": "from collections import deque\n\nfrom .op import Op\nfrom ..event import Event\nfrom ..util import NO_VALUE, get_event_loop\n"
},
{
"path": "eventkit/ops/transform.py",
"chars": 8994,
"preview": "import asyncio\nimport copy\nimport time\nfrom collections import deque\n\nfrom .combine import Chain, Concat, Merge, Switch\n"
},
{
"path": "eventkit/util.py",
"chars": 2134,
"preview": "import asyncio\nimport datetime as dt\nfrom typing import AsyncIterator\n\n\nclass _NoValue:\n def __bool__(self):\n "
},
{
"path": "eventkit/version.py",
"chars": 86,
"preview": "__version_info__ = (1, 0, 3)\n__version__ = '.'.join(str(v) for v in __version_info__)\n"
},
{
"path": "notebooks/eventkit_introduction.ipynb",
"chars": 119752,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# eventkit introduction\\n\",\n \"\\n"
},
{
"path": "requirements.txt",
"chars": 7,
"preview": "numpy\n\n"
},
{
"path": "setup.cfg",
"chars": 98,
"preview": "[flake8]\nignore = D100,D101,D102,D105,D107,D200,D205,D400,D401,D402,E402,F401,I100,I102,I202,W503\n"
},
{
"path": "setup.py",
"chars": 1346,
"preview": "import os\nimport codecs\nfrom setuptools import setup, find_packages\n\nhere = os.path.abspath(os.path.dirname(__file__))\nw"
},
{
"path": "tests/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "tests/aggregate_test.py",
"chars": 1654,
"preview": "import unittest\n\nfrom eventkit import Event\n\narray = list(range(10))\n\n\nclass AggregateTest(unittest.TestCase):\n\n def "
},
{
"path": "tests/combine_test.py",
"chars": 1904,
"preview": "import unittest\n\nfrom eventkit import Event\n\narray1 = list(range(10))\narray2 = list(range(100, 110))\narray3 = list(range"
},
{
"path": "tests/create_test.py",
"chars": 800,
"preview": "import asyncio\nimport unittest\n\nfrom eventkit import Event\n\narray1 = list(range(10))\narray2 = list(range(100, 110))\n\nloo"
},
{
"path": "tests/event_test.py",
"chars": 4059,
"preview": "import asyncio\nimport unittest\n\nfrom eventkit import Event\nimport eventkit as ev\n\nloop = asyncio.get_event_loop_policy()"
},
{
"path": "tests/select_test.py",
"chars": 1276,
"preview": "import unittest\n\nfrom eventkit import Event\n\narray = list(range(10))\n\n\nclass SelectTest(unittest.TestCase):\n\n def tes"
},
{
"path": "tests/timing_test.py",
"chars": 1609,
"preview": "import unittest\nimport time\n\nfrom eventkit import Event\n\narray1 = list(range(10))\narray2 = list(range(100, 110))\narray3 "
},
{
"path": "tests/transform_test.py",
"chars": 5375,
"preview": "import unittest\nimport asyncio\nfrom collections import namedtuple\n\nimport numpy as np\n\nfrom eventkit import Event\n\nloop "
}
]
// ... and 2 more files (download for full content)
About this extraction
This page contains the full source code of the erdewit/eventkit GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 83 files (2.5 MB), approximately 672.2k tokens, and a symbol index with 1055 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.