circuits-2.1.0/0000755000014400001440000000000012113366740013073 5ustar prologicuserscircuits-2.1.0/circuits.egg-info/0000755000014400001440000000000012113366740016412 5ustar prologicuserscircuits-2.1.0/circuits.egg-info/entry_points.txt0000644000014400001440000000010512113366737021712 0ustar prologicusers [console_scripts] circuits.web = circuits.web.main:main circuits-2.1.0/circuits.egg-info/PKG-INFO0000644000014400001440000001674712113366737017534 0ustar prologicusersMetadata-Version: 1.0 Name: circuits Version: 2.1.0 Summary: Asynchronous Component based Event Application Framework Home-page: http://bitbucket.org/prologic/circuits/ Author: James Mills Author-email: James Mills, prologic at shortcircuit dot net dot au License: MIT Download-URL: http://bitbucket.org/prologic/circuits/downloads/ Description: .. _Python Programming Language: http://www.python.org/ .. _#circuits IRC Channel: http://webchat.freenode.net/?randomnick=1&channels=circuits&uio=d4 .. _FreeNode IRC Network: http://freenode.net .. _Python Standard Library: http://docs.python.org/library/ .. _Website: https://bitbucket.org/prologic/circuits/ .. _PyPi Page: http://pypi.python.org/pypi/circuits .. _Read the Docs: http://circuits.readthedocs.org/ .. _MIT License: http://www.opensource.org/licenses/mit-license.php .. _Create an Issue: https://bitbucket.org/prologic/circuits/issue/new .. _Mailing List: http://groups.google.com/group/circuits-users .. _Downloads page: https://bitbucket.org/prologic/circuits/downloads Overview -------- circuits is a **Lightweight** **Event** driven and **Asynchronous** **Application Framework** for the `Python Programming Language`_ with a strong **Component** Architecture. circuits also includes a lightweight, high performance and scalable HTTP/WSGI compliant web server as well as various I/O and Networking components. To take full advantage of circuits and its architecture, circuits encourages you to design your application in terms of loosely coupled components. Circuits has a very powerful message passing system that enables components to interact with each other via events. Applications written this way tend to be more maintainable, easier to develop and scale to complex systems. circuits' **Loosely Coupled** **Component Architecture** allows for a high level of **Reuse** and **Scalability**. Simpler components can be combined together to form Complex Components and provide higher level functionality and abstraction. Much of the circuits component library is designed and built this way. - **Documentation**: http://packages.python.org/circuits or `Read the Docs`_. - **Project website**: https://bitbucket.org/prologic/circuits/ - **PyPI page**: http://pypi.python.org/pypi/circuits Features -------- - event driven - concurrency support - component architecture - asynchronous I/O components - no required external dependencies - full featured web framework (circuits.web) - coroutine based synchronization primitives Requirements ------------ - circuits has no dependencies beyond the `Python Standard Library`_. Supported Platforms ------------------- - Linux, FreeBSD, Mac OS X - Python 2.6, 2.7, 3.2, 3.3 - pypy 2.0 **Windows**: We acknowledge that Windows exists and make reasonable efforts to maintain compatibility. Unfortunately we cannot guarantee support at this time. **NB**: We are working toward getting Windows supported. Installation ------------ The simplest and recommended way to install circuits is with pip. You may install the latest stable release from PyPI with pip:: > pip install circuits If you do not have pip, you may use easy_install:: > easy_install circuits Alternatively, you may download the source package from the `PyPi Page`_ or the `Downloads page`_ on the `Website`_; extract it and install using:: > python setup.py install License ------- circuits is licensed under the `MIT License`_. Feedback -------- We welcome any questions or feedback about bugs and suggestions on how to improve circuits. Let us know what you think about circuits. `@pythoncircuits `_. Do you have suggestions for improvement? Then please `Create an Issue`_ with details of what you would like to see. I'll take a look at it and work with you to either incorporate the idea or find a better solution. Community --------- There is also a small community of circuits enthusiasts that you may find on the `#circuits IRC Channel`_ on the `FreeNode IRC Network`_ and the `Mailing List`_. .. raw:: html Release Notes - circuits-2.1.0 () ------------------------------------------ This release adds the following new features to circuits: - Python 3 support. - Windows support. - PyPy support. - IPv6 support. - Better WSGI support. - Fully documented examples. - Component Interface querying. And many bug fixes! Keywords: event framework distributed concurrent component asynchronous Platform: POSIX Classifier: Development Status :: 5 - Production/Stable Classifier: Environment :: Console Classifier: Environment :: No Input/Output (Daemon) Classifier: Environment :: Other Environment Classifier: Environment :: Plugins Classifier: Environment :: Web Environment Classifier: Intended Audience :: Developers Classifier: Intended Audience :: Information Technology Classifier: Intended Audience :: Science/Research Classifier: Intended Audience :: System Administrators Classifier: Intended Audience :: Telecommunications Industry Classifier: License :: OSI Approved :: MIT License Classifier: Natural Language :: English Classifier: Operating System :: POSIX :: BSD Classifier: Operating System :: POSIX :: Linux Classifier: Operating System :: MacOS :: MacOS X Classifier: Operating System :: Microsoft :: Windows Classifier: Programming Language :: Python :: 2.6 Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3.1 Classifier: Programming Language :: Python :: 3.2 Classifier: Programming Language :: Python :: 3.3 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Classifier: Topic :: Adaptive Technologies Classifier: Topic :: Communications :: Chat :: Internet Relay Chat Classifier: Topic :: Communications :: Email :: Mail Transport Agents Classifier: Topic :: Database Classifier: Topic :: Internet :: WWW/HTTP :: HTTP Servers Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Middleware Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Server Classifier: Topic :: Software Development :: Libraries :: Application Frameworks Classifier: Topic :: Software Development :: Libraries :: Python Modules Classifier: Topic :: System :: Clustering Classifier: Topic :: System :: Distributed Computing circuits-2.1.0/circuits.egg-info/dependency_links.txt0000644000014400001440000000000112113366737022466 0ustar prologicusers circuits-2.1.0/circuits.egg-info/SOURCES.txt0000644000014400001440000006672612113366740020317 0ustar prologicusers.coveragerc .hgchurn .hgignore .hgtags CHANGES.rst LICENSE MANIFEST.in Makefile README.rst RELEASE.rst setup.cfg setup.py tox.ini circuits/__init__.py circuits/six.py circuits.egg-info/PKG-INFO circuits.egg-info/SOURCES.txt circuits.egg-info/dependency_links.txt circuits.egg-info/entry_points.txt circuits.egg-info/not-zip-safe circuits.egg-info/top_level.txt circuits/app/__init__.py circuits/app/config.py circuits/app/daemon.py circuits/app/env.py circuits/app/log.py circuits/app/startup.py circuits/core/__init__.py circuits/core/bridge.py circuits/core/components.py circuits/core/debugger.py circuits/core/events.py circuits/core/handlers.py circuits/core/helpers.py circuits/core/loader.py circuits/core/manager.py circuits/core/pollers.py circuits/core/timers.py circuits/core/utils.py circuits/core/values.py circuits/core/workers.py circuits/io/__init__.py circuits/io/events.py circuits/io/file.py circuits/io/notify.py circuits/io/process.py circuits/io/serial.py circuits/net/__init__.py circuits/net/sockets.py circuits/net/protocols/__init__.py circuits/net/protocols/http.py circuits/net/protocols/irc.py circuits/net/protocols/line.py circuits/net/protocols/websocket.py circuits/node/__init__.py circuits/node/client.py circuits/node/events.py circuits/node/node.py circuits/node/server.py circuits/node/utils.py circuits/tools/__init__.py circuits/web/__init__.py circuits/web/_httpauth.py circuits/web/client.py circuits/web/constants.py circuits/web/controllers.py circuits/web/errors.py circuits/web/events.py circuits/web/exceptions.py circuits/web/headers.py circuits/web/http.py circuits/web/loggers.py circuits/web/main.py circuits/web/servers.py circuits/web/sessions.py circuits/web/tools.py circuits/web/utils.py circuits/web/websocket.py circuits/web/wrappers.py circuits/web/wsgi.py circuits/web/apps/__init__.py circuits/web/apps/memorymonitor/__init__.py circuits/web/apps/memorymonitor/reftree.py circuits/web/apps/memorymonitor/htdocs/graphs.html circuits/web/apps/memorymonitor/htdocs/main.css circuits/web/apps/memorymonitor/htdocs/trace.html circuits/web/apps/memorymonitor/htdocs/tree.html circuits/web/apps/webconsole/__init__.py circuits/web/apps/webconsole/htdocs/index.html circuits/web/dispatchers/__init__.py circuits/web/dispatchers/dispatcher.py circuits/web/dispatchers/jsonrpc.py circuits/web/dispatchers/static.py circuits/web/dispatchers/virtualhosts.py circuits/web/dispatchers/websockets.py circuits/web/dispatchers/xmlrpc.py docs/Makefile docs/check_docs.py docs/circuits-docs.xml docs/make.bat docs/build/doctrees/changes.doctree docs/build/doctrees/contributors.doctree docs/build/doctrees/environment.pickle docs/build/doctrees/faq.doctree docs/build/doctrees/glossary.doctree docs/build/doctrees/index.doctree docs/build/doctrees/pypitest.doctree docs/build/doctrees/todo.doctree docs/build/doctrees/users.doctree docs/build/doctrees/api/circuits_app.doctree docs/build/doctrees/api/circuits_app_config.doctree docs/build/doctrees/api/circuits_app_daemon.doctree docs/build/doctrees/api/circuits_app_env.doctree docs/build/doctrees/api/circuits_app_log.doctree docs/build/doctrees/api/circuits_core.doctree docs/build/doctrees/api/circuits_core_components.doctree docs/build/doctrees/api/circuits_core_debugger.doctree docs/build/doctrees/api/circuits_core_events.doctree docs/build/doctrees/api/circuits_core_handlers.doctree docs/build/doctrees/api/circuits_core_loader.doctree docs/build/doctrees/api/circuits_core_manager.doctree docs/build/doctrees/api/circuits_core_pollers.doctree docs/build/doctrees/api/circuits_core_timers.doctree docs/build/doctrees/api/circuits_core_utils.doctree docs/build/doctrees/api/circuits_core_values.doctree docs/build/doctrees/api/circuits_core_workers.doctree docs/build/doctrees/api/circuits_io.doctree docs/build/doctrees/api/circuits_io_events.doctree docs/build/doctrees/api/circuits_io_file.doctree docs/build/doctrees/api/circuits_io_notify.doctree docs/build/doctrees/api/circuits_io_serial.doctree docs/build/doctrees/api/circuits_net.doctree docs/build/doctrees/api/circuits_net_protocols.doctree docs/build/doctrees/api/circuits_net_protocols_http.doctree docs/build/doctrees/api/circuits_net_protocols_irc.doctree docs/build/doctrees/api/circuits_net_protocols_line.doctree docs/build/doctrees/api/circuits_net_sockets.doctree docs/build/doctrees/api/circuits_node.doctree docs/build/doctrees/api/circuits_node_client.doctree docs/build/doctrees/api/circuits_node_events.doctree docs/build/doctrees/api/circuits_node_node.doctree docs/build/doctrees/api/circuits_node_server.doctree docs/build/doctrees/api/circuits_node_utils.doctree docs/build/doctrees/api/circuits_tools.doctree docs/build/doctrees/api/circuits_web.doctree docs/build/doctrees/api/circuits_web_client.doctree docs/build/doctrees/api/circuits_web_constants.doctree docs/build/doctrees/api/circuits_web_controllers.doctree docs/build/doctrees/api/circuits_web_dispatchers_dispatcher.doctree docs/build/doctrees/api/circuits_web_dispatchers_jsonrpc.doctree docs/build/doctrees/api/circuits_web_dispatchers_static.doctree docs/build/doctrees/api/circuits_web_dispatchers_virtualhosts.doctree docs/build/doctrees/api/circuits_web_dispatchers_websockets.doctree docs/build/doctrees/api/circuits_web_dispatchers_xmlrpc.doctree docs/build/doctrees/api/circuits_web_errors.doctree docs/build/doctrees/api/circuits_web_events.doctree docs/build/doctrees/api/circuits_web_exceptions.doctree docs/build/doctrees/api/circuits_web_headers.doctree docs/build/doctrees/api/circuits_web_http.doctree docs/build/doctrees/api/circuits_web_loggers.doctree docs/build/doctrees/api/circuits_web_main.doctree docs/build/doctrees/api/circuits_web_servers.doctree docs/build/doctrees/api/circuits_web_sessions.doctree docs/build/doctrees/api/circuits_web_tools.doctree docs/build/doctrees/api/circuits_web_utils.doctree docs/build/doctrees/api/circuits_web_websocket.doctree docs/build/doctrees/api/circuits_web_wrappers.doctree docs/build/doctrees/api/circuits_web_wsgi.doctree docs/build/doctrees/api/index.doctree docs/build/doctrees/dev/contributing.doctree docs/build/doctrees/dev/index.doctree docs/build/doctrees/dev/introduction.doctree docs/build/doctrees/dev/processes.doctree docs/build/doctrees/howtos/index.doctree docs/build/doctrees/howtos/simple_server.doctree docs/build/doctrees/man/components.doctree docs/build/doctrees/man/debugging.doctree docs/build/doctrees/man/events.doctree docs/build/doctrees/man/handlers.doctree docs/build/doctrees/man/index.doctree docs/build/doctrees/man/manager.doctree docs/build/doctrees/man/tools.doctree docs/build/doctrees/man/values.doctree docs/build/doctrees/start/downloading.doctree docs/build/doctrees/start/index.doctree docs/build/doctrees/start/installing.doctree docs/build/doctrees/start/quick.doctree docs/build/doctrees/start/requirements.doctree docs/build/doctrees/tutorial/index.doctree docs/build/doctrees/web/basics.doctree docs/build/doctrees/web/gettingstarted.doctree docs/build/doctrees/web/index.doctree docs/build/doctrees/web/introduction.doctree docs/build/html/.buildinfo docs/build/html/changes.html docs/build/html/contributors.html docs/build/html/faq.html docs/build/html/genindex.html docs/build/html/glossary.html docs/build/html/index.html docs/build/html/objects.inv docs/build/html/py-modindex.html docs/build/html/pypitest.html docs/build/html/search.html docs/build/html/searchindex.js docs/build/html/todo.html docs/build/html/users.html docs/build/html/_downloads/001.py docs/build/html/_downloads/002.py docs/build/html/_downloads/003.py docs/build/html/_downloads/004.py docs/build/html/_downloads/005.py docs/build/html/_downloads/006.py docs/build/html/_downloads/007.py docs/build/html/_downloads/008.py docs/build/html/_downloads/009.py docs/build/html/_downloads/handler_annotation.py docs/build/html/_downloads/handler_returns.py docs/build/html/_downloads/simple_server.py docs/build/html/_images/graphviz-fa9bbccfbcc0c44bc0636e85a3c610dc406600cf.png docs/build/html/_images/graphviz-fa9bbccfbcc0c44bc0636e85a3c610dc406600cf.png.map docs/build/html/_images/web.png docs/build/html/_sources/changes.txt docs/build/html/_sources/contributors.txt docs/build/html/_sources/faq.txt docs/build/html/_sources/glossary.txt docs/build/html/_sources/index.txt docs/build/html/_sources/pypitest.txt docs/build/html/_sources/todo.txt docs/build/html/_sources/users.txt docs/build/html/_sources/api/circuits_app.txt docs/build/html/_sources/api/circuits_app_config.txt docs/build/html/_sources/api/circuits_app_daemon.txt docs/build/html/_sources/api/circuits_app_env.txt docs/build/html/_sources/api/circuits_app_log.txt docs/build/html/_sources/api/circuits_core.txt docs/build/html/_sources/api/circuits_core_components.txt docs/build/html/_sources/api/circuits_core_debugger.txt docs/build/html/_sources/api/circuits_core_events.txt docs/build/html/_sources/api/circuits_core_handlers.txt docs/build/html/_sources/api/circuits_core_loader.txt docs/build/html/_sources/api/circuits_core_manager.txt docs/build/html/_sources/api/circuits_core_pollers.txt docs/build/html/_sources/api/circuits_core_timers.txt docs/build/html/_sources/api/circuits_core_utils.txt docs/build/html/_sources/api/circuits_core_values.txt docs/build/html/_sources/api/circuits_core_workers.txt docs/build/html/_sources/api/circuits_io.txt docs/build/html/_sources/api/circuits_io_events.txt docs/build/html/_sources/api/circuits_io_file.txt docs/build/html/_sources/api/circuits_io_notify.txt docs/build/html/_sources/api/circuits_io_serial.txt docs/build/html/_sources/api/circuits_net.txt docs/build/html/_sources/api/circuits_net_protocols.txt docs/build/html/_sources/api/circuits_net_protocols_http.txt docs/build/html/_sources/api/circuits_net_protocols_irc.txt docs/build/html/_sources/api/circuits_net_protocols_line.txt docs/build/html/_sources/api/circuits_net_sockets.txt docs/build/html/_sources/api/circuits_node.txt docs/build/html/_sources/api/circuits_node_client.txt docs/build/html/_sources/api/circuits_node_events.txt docs/build/html/_sources/api/circuits_node_node.txt docs/build/html/_sources/api/circuits_node_server.txt docs/build/html/_sources/api/circuits_node_utils.txt docs/build/html/_sources/api/circuits_tools.txt docs/build/html/_sources/api/circuits_web.txt docs/build/html/_sources/api/circuits_web_client.txt docs/build/html/_sources/api/circuits_web_constants.txt docs/build/html/_sources/api/circuits_web_controllers.txt docs/build/html/_sources/api/circuits_web_dispatchers_dispatcher.txt docs/build/html/_sources/api/circuits_web_dispatchers_jsonrpc.txt docs/build/html/_sources/api/circuits_web_dispatchers_static.txt docs/build/html/_sources/api/circuits_web_dispatchers_virtualhosts.txt docs/build/html/_sources/api/circuits_web_dispatchers_websockets.txt docs/build/html/_sources/api/circuits_web_dispatchers_xmlrpc.txt docs/build/html/_sources/api/circuits_web_errors.txt docs/build/html/_sources/api/circuits_web_events.txt docs/build/html/_sources/api/circuits_web_exceptions.txt docs/build/html/_sources/api/circuits_web_headers.txt docs/build/html/_sources/api/circuits_web_http.txt docs/build/html/_sources/api/circuits_web_loggers.txt docs/build/html/_sources/api/circuits_web_main.txt docs/build/html/_sources/api/circuits_web_servers.txt docs/build/html/_sources/api/circuits_web_sessions.txt docs/build/html/_sources/api/circuits_web_tools.txt docs/build/html/_sources/api/circuits_web_utils.txt docs/build/html/_sources/api/circuits_web_websocket.txt docs/build/html/_sources/api/circuits_web_wrappers.txt docs/build/html/_sources/api/circuits_web_wsgi.txt docs/build/html/_sources/api/index.txt docs/build/html/_sources/dev/contributing.txt docs/build/html/_sources/dev/index.txt docs/build/html/_sources/dev/introduction.txt docs/build/html/_sources/dev/processes.txt docs/build/html/_sources/howtos/index.txt docs/build/html/_sources/howtos/simple_server.txt docs/build/html/_sources/man/components.txt docs/build/html/_sources/man/debugging.txt docs/build/html/_sources/man/events.txt docs/build/html/_sources/man/handlers.txt docs/build/html/_sources/man/index.txt docs/build/html/_sources/man/manager.txt docs/build/html/_sources/man/tools.txt docs/build/html/_sources/man/values.txt docs/build/html/_sources/start/downloading.txt docs/build/html/_sources/start/index.txt docs/build/html/_sources/start/installing.txt docs/build/html/_sources/start/quick.txt docs/build/html/_sources/start/requirements.txt docs/build/html/_sources/tutorial/index.txt docs/build/html/_sources/web/basics.txt docs/build/html/_sources/web/gettingstarted.txt docs/build/html/_sources/web/index.txt docs/build/html/_sources/web/introduction.txt docs/build/html/_static/ajax-loader.gif docs/build/html/_static/basic.css docs/build/html/_static/comment-bright.png docs/build/html/_static/comment-close.png docs/build/html/_static/comment.png docs/build/html/_static/default.css docs/build/html/_static/djangodocs.css docs/build/html/_static/docicons-behindscenes.png docs/build/html/_static/docicons-note.png docs/build/html/_static/docicons-philosophy.png docs/build/html/_static/doctools.js docs/build/html/_static/down-pressed.png docs/build/html/_static/down.png docs/build/html/_static/file.png docs/build/html/_static/homepage.css docs/build/html/_static/jquery.js docs/build/html/_static/logo.png docs/build/html/_static/minus.png docs/build/html/_static/plus.png docs/build/html/_static/pygments.css docs/build/html/_static/reset-fonts-grids.css docs/build/html/_static/searchtools.js docs/build/html/_static/tracsphinx.css docs/build/html/_static/underscore.js docs/build/html/_static/up-pressed.png docs/build/html/_static/up.png docs/build/html/_static/websupport.js docs/build/html/api/circuits_app.html docs/build/html/api/circuits_app_config.html docs/build/html/api/circuits_app_daemon.html docs/build/html/api/circuits_app_env.html docs/build/html/api/circuits_app_log.html docs/build/html/api/circuits_core.html docs/build/html/api/circuits_core_components.html docs/build/html/api/circuits_core_debugger.html docs/build/html/api/circuits_core_events.html docs/build/html/api/circuits_core_handlers.html docs/build/html/api/circuits_core_loader.html docs/build/html/api/circuits_core_manager.html docs/build/html/api/circuits_core_pollers.html docs/build/html/api/circuits_core_timers.html docs/build/html/api/circuits_core_utils.html docs/build/html/api/circuits_core_values.html docs/build/html/api/circuits_core_workers.html docs/build/html/api/circuits_io.html docs/build/html/api/circuits_io_events.html docs/build/html/api/circuits_io_file.html docs/build/html/api/circuits_io_notify.html docs/build/html/api/circuits_io_serial.html docs/build/html/api/circuits_net.html docs/build/html/api/circuits_net_protocols.html docs/build/html/api/circuits_net_protocols_http.html docs/build/html/api/circuits_net_protocols_irc.html docs/build/html/api/circuits_net_protocols_line.html docs/build/html/api/circuits_net_sockets.html docs/build/html/api/circuits_node.html docs/build/html/api/circuits_node_client.html docs/build/html/api/circuits_node_events.html docs/build/html/api/circuits_node_node.html docs/build/html/api/circuits_node_server.html docs/build/html/api/circuits_node_utils.html docs/build/html/api/circuits_tools.html docs/build/html/api/circuits_web.html docs/build/html/api/circuits_web_client.html docs/build/html/api/circuits_web_constants.html docs/build/html/api/circuits_web_controllers.html docs/build/html/api/circuits_web_dispatchers_dispatcher.html docs/build/html/api/circuits_web_dispatchers_jsonrpc.html docs/build/html/api/circuits_web_dispatchers_static.html docs/build/html/api/circuits_web_dispatchers_virtualhosts.html docs/build/html/api/circuits_web_dispatchers_websockets.html docs/build/html/api/circuits_web_dispatchers_xmlrpc.html docs/build/html/api/circuits_web_errors.html docs/build/html/api/circuits_web_events.html docs/build/html/api/circuits_web_exceptions.html docs/build/html/api/circuits_web_headers.html docs/build/html/api/circuits_web_http.html docs/build/html/api/circuits_web_loggers.html docs/build/html/api/circuits_web_main.html docs/build/html/api/circuits_web_servers.html docs/build/html/api/circuits_web_sessions.html docs/build/html/api/circuits_web_tools.html docs/build/html/api/circuits_web_utils.html docs/build/html/api/circuits_web_websocket.html docs/build/html/api/circuits_web_wrappers.html docs/build/html/api/circuits_web_wsgi.html docs/build/html/api/index.html docs/build/html/dev/contributing.html docs/build/html/dev/index.html docs/build/html/dev/introduction.html docs/build/html/dev/processes.html docs/build/html/howtos/index.html docs/build/html/howtos/simple_server.html docs/build/html/man/components.html docs/build/html/man/debugging.html docs/build/html/man/events.html docs/build/html/man/handlers.html docs/build/html/man/index.html docs/build/html/man/manager.html docs/build/html/man/tools.html docs/build/html/man/values.html docs/build/html/start/downloading.html docs/build/html/start/index.html docs/build/html/start/installing.html docs/build/html/start/quick.html docs/build/html/start/requirements.html docs/build/html/tutorial/index.html docs/build/html/web/basics.html docs/build/html/web/gettingstarted.html docs/build/html/web/index.html docs/build/html/web/introduction.html docs/source/changes.rst docs/source/conf.py docs/source/contributors.rst docs/source/faq.rst docs/source/glossary.rst docs/source/index.rst docs/source/pypitest.rst docs/source/requirements.txt docs/source/todo.rst docs/source/users.rst docs/source/_static/logo.png docs/source/_static/tracsphinx.css docs/source/_themes/om/genindex.html docs/source/_themes/om/layout.html docs/source/_themes/om/modindex.html docs/source/_themes/om/search.html docs/source/_themes/om/theme.conf docs/source/_themes/om/static/default.css docs/source/_themes/om/static/djangodocs.css docs/source/_themes/om/static/docicons-behindscenes.png docs/source/_themes/om/static/docicons-note.png docs/source/_themes/om/static/docicons-philosophy.png docs/source/_themes/om/static/homepage.css docs/source/_themes/om/static/reset-fonts-grids.css docs/source/api/circuits_app.rst docs/source/api/circuits_app_config.rst docs/source/api/circuits_app_daemon.rst docs/source/api/circuits_app_env.rst docs/source/api/circuits_app_log.rst docs/source/api/circuits_core.rst docs/source/api/circuits_core_components.rst docs/source/api/circuits_core_debugger.rst docs/source/api/circuits_core_events.rst docs/source/api/circuits_core_handlers.rst docs/source/api/circuits_core_loader.rst docs/source/api/circuits_core_manager.rst docs/source/api/circuits_core_pollers.rst docs/source/api/circuits_core_timers.rst docs/source/api/circuits_core_utils.rst docs/source/api/circuits_core_values.rst docs/source/api/circuits_core_workers.rst docs/source/api/circuits_io.rst docs/source/api/circuits_io_events.rst docs/source/api/circuits_io_file.rst docs/source/api/circuits_io_notify.rst docs/source/api/circuits_io_serial.rst docs/source/api/circuits_net.rst docs/source/api/circuits_net_protocols.rst docs/source/api/circuits_net_protocols_http.rst docs/source/api/circuits_net_protocols_irc.rst docs/source/api/circuits_net_protocols_line.rst docs/source/api/circuits_net_sockets.rst docs/source/api/circuits_node.rst docs/source/api/circuits_node_client.rst docs/source/api/circuits_node_events.rst docs/source/api/circuits_node_node.rst docs/source/api/circuits_node_server.rst docs/source/api/circuits_node_utils.rst docs/source/api/circuits_tools.rst docs/source/api/circuits_web.rst docs/source/api/circuits_web_client.rst docs/source/api/circuits_web_constants.rst docs/source/api/circuits_web_controllers.rst docs/source/api/circuits_web_dispatchers_dispatcher.rst docs/source/api/circuits_web_dispatchers_jsonrpc.rst docs/source/api/circuits_web_dispatchers_static.rst docs/source/api/circuits_web_dispatchers_virtualhosts.rst docs/source/api/circuits_web_dispatchers_websockets.rst docs/source/api/circuits_web_dispatchers_xmlrpc.rst docs/source/api/circuits_web_errors.rst docs/source/api/circuits_web_events.rst docs/source/api/circuits_web_exceptions.rst docs/source/api/circuits_web_headers.rst docs/source/api/circuits_web_http.rst docs/source/api/circuits_web_loggers.rst docs/source/api/circuits_web_main.rst docs/source/api/circuits_web_servers.rst docs/source/api/circuits_web_sessions.rst docs/source/api/circuits_web_tools.rst docs/source/api/circuits_web_utils.rst docs/source/api/circuits_web_websocket.rst docs/source/api/circuits_web_wrappers.rst docs/source/api/circuits_web_wsgi.rst docs/source/api/index.rst docs/source/dev/contributing.rst docs/source/dev/index.rst docs/source/dev/introduction.rst docs/source/dev/processes.rst docs/source/howtos/index.rst docs/source/howtos/simple_server.py docs/source/howtos/simple_server.rst docs/source/images/web.png docs/source/man/components.rst docs/source/man/debugging.rst docs/source/man/events.rst docs/source/man/handlers.rst docs/source/man/index.rst docs/source/man/manager.rst docs/source/man/tools.rst docs/source/man/values.rst docs/source/man/examples/handler_annotation.py docs/source/man/examples/handler_returns.py docs/source/start/downloading.rst docs/source/start/index.rst docs/source/start/installing.rst docs/source/start/quick.rst docs/source/start/requirements.rst docs/source/tutorial/001.py docs/source/tutorial/002.py docs/source/tutorial/003.py docs/source/tutorial/004.py docs/source/tutorial/005.py docs/source/tutorial/006.py docs/source/tutorial/007.py docs/source/tutorial/008.py docs/source/tutorial/009.py docs/source/tutorial/index.rst docs/source/web/basics.rst docs/source/web/gettingstarted.rst docs/source/web/index.rst docs/source/web/introduction.rst examples/99bottles.py examples/cat.py examples/chatserver.py examples/circ.py examples/dirwatch.py examples/echoserver.py examples/hello.py examples/hello_bridge.py examples/ircbot.py examples/ircclient.py examples/portforward.py examples/tail.py examples/telnet.py examples/test_memory_leaks.py examples/test_worker.py examples/timers.py examples/primitives/call.py examples/primitives/fire.py examples/primitives/wait.py examples/web/acldemo.py examples/web/authdemo.py examples/web/basecontrollers.py examples/web/baseservers.py examples/web/ca-chain.pem examples/web/cert.pem examples/web/controllers.py examples/web/counter.py examples/web/counter.txt examples/web/fileupload.py examples/web/filtering.py examples/web/forms.py examples/web/httpauth.py examples/web/jsoncontroller.py examples/web/jsonrpc.py examples/web/jsonserializer.py examples/web/jsontool.py examples/web/makotemplates.py examples/web/server-cert.pem examples/web/server-key.pem examples/web/sessions.py examples/web/shadowauth.py examples/web/singleclickandrun.py examples/web/ssl-forward-cert.py examples/web/sslserver.py examples/web/virtualhosts.py examples/web/websocket.html examples/web/websockets.py examples/web/wiki.zip examples/web/wsgi.py examples/web/wsgiapp.py examples/web/xmlrpc.py examples/web/static/css/base.css examples/web/static/img/rss.gif examples/web/static/img/valid-xhtml10.png examples/web/static/img/vcss.gif examples/web/terminal/terminal.py examples/web/terminal/static/favicon.ico examples/web/terminal/static/index.xhtml examples/web/terminal/static/css/base.css examples/web/terminal/static/js/jquery.js examples/web/terminal/static/js/jquery.terminal.js examples/web/terminal/static/js/main.js examples/web/tpl/base.html examples/web/tpl/index.html examples/web/wiki/wiki.py examples/web/wiki/defaultpages/BulletList examples/web/wiki/defaultpages/CheatSheet examples/web/wiki/defaultpages/DefinitionList examples/web/wiki/defaultpages/FrontPage examples/web/wiki/defaultpages/HeadingsPage examples/web/wiki/defaultpages/HorizontalLine examples/web/wiki/defaultpages/Indented examples/web/wiki/defaultpages/Macros examples/web/wiki/defaultpages/MixedList examples/web/wiki/defaultpages/NoLineBreak examples/web/wiki/defaultpages/NumberedList examples/web/wiki/defaultpages/RenderedPre examples/web/wiki/defaultpages/RenderedTable examples/web/wiki/defaultpages/SandBox examples/web/wiki/defaultpages/SiteMenu examples/web/wiki/macros/__init__.py examples/web/wiki/macros/html.py examples/web/wiki/macros/include.py examples/web/wiki/macros/utils.py examples/web/wiki/macros/wiki.py examples/web/wiki/static/Image.jpg examples/web/wiki/static/favicon.ico examples/web/wiki/static/css/pygments.css examples/web/wiki/static/css/screen.css examples/web/wiki/static/images/header_bg.png examples/web/wiki/tpl/edit.html examples/web/wiki/tpl/view.html man/circuits.bench.1 man/circuits.web.1 scripts/circuits.bench scripts/circuits.web tests/__init__.py tests/conftest.py tests/main.py tests/app/__init__.py tests/app/app.py tests/app/test_config.py tests/app/test_daemon.py tests/app/test_env.py tests/app/test_logger.py tests/core/__init__.py tests/core/app.py tests/core/signalapp.py tests/core/test_bridge.py tests/core/test_call_wait.py tests/core/test_channel_selection.py tests/core/test_complete.py tests/core/test_component_repr.py tests/core/test_component_setup.py tests/core/test_component_targeting.py tests/core/test_core.py tests/core/test_debugger.py tests/core/test_dynamic_handlers.py tests/core/test_errors.py tests/core/test_event.py tests/core/test_feedback.py tests/core/test_filter_order.py tests/core/test_filters.py tests/core/test_generate_events.py tests/core/test_generator_value.py tests/core/test_globals.py tests/core/test_imports.py tests/core/test_inheritence.py tests/core/test_interface_query.py tests/core/test_loader.py tests/core/test_manager_repr.py tests/core/test_priority.py tests/core/test_signals.py tests/core/test_singleton.py tests/core/test_timers.py tests/core/test_utils.py tests/core/test_value.py tests/core/test_worker_process.py tests/core/test_worker_thread.py tests/io/__init__.py tests/io/test_file.py tests/io/test_notify.py tests/io/test_process.py tests/net/__init__.py tests/net/client.py tests/net/server.py tests/net/test_client.py tests/net/test_pipe.py tests/net/test_poller_reuse.py tests/net/test_tcp.py tests/net/test_udp.py tests/net/test_unix.py tests/net/protocols/__init__.py tests/net/protocols/test_irc.py tests/net/protocols/test_line.py tests/node/test_node.py tests/node/test_utils.py tests/tools/__init__.py tests/tools/test_tools.py tests/web/__init__.py tests/web/cert.pem tests/web/conftest.py tests/web/helpers.py tests/web/jsonrpclib.py tests/web/multipartform.py tests/web/test_100_continue.py tests/web/test_basicauth.py tests/web/test_client.py tests/web/test_conn.py tests/web/test_cookies.py tests/web/test_core.py tests/web/test_digestauth.py tests/web/test_dispatcher.py tests/web/test_dispatcher2.py tests/web/test_dispatcher3.py tests/web/test_disps.py tests/web/test_encodings.py tests/web/test_exceptions.py tests/web/test_expires.py tests/web/test_expose.py tests/web/test_generator.py tests/web/test_gzip.py tests/web/test_headers.py tests/web/test_http.py tests/web/test_json.py tests/web/test_jsonrpc.py tests/web/test_large_post.py tests/web/test_logger.py tests/web/test_multipartformdata.py tests/web/test_null_response.py tests/web/test_request_failure.py tests/web/test_serve_download.py tests/web/test_serve_file.py tests/web/test_servers.py tests/web/test_sessions.py tests/web/test_static.py tests/web/test_unicode.py tests/web/test_utils.py tests/web/test_value.py tests/web/test_vpath_args.py tests/web/test_websockets.py tests/web/test_wsgi_application.py tests/web/test_wsgi_application_generator.py tests/web/test_wsgi_application_yield.py tests/web/test_wsgi_gateway.py tests/web/test_wsgi_gateway_errors.py tests/web/test_wsgi_gateway_generator.py tests/web/test_wsgi_gateway_multiple_apps.py tests/web/test_wsgi_gateway_null_response.py tests/web/test_wsgi_gateway_write.py tests/web/test_wsgi_gateway_yield.py tests/web/test_xmlrpc.py tests/web/test_yield.py tests/web/websocket.py tests/web/static/#foobar.txt tests/web/static/helloworld.txt tests/web/static/test.css tests/web/static/unicode.txt tools/mkpkgscircuits-2.1.0/circuits.egg-info/top_level.txt0000644000014400001440000000001712113366737021150 0ustar prologicuserscircuits tests circuits-2.1.0/circuits.egg-info/not-zip-safe0000644000014400001440000000000112113365112020630 0ustar prologicusers circuits-2.1.0/man/0000755000014400001440000000000012113366740013646 5ustar prologicuserscircuits-2.1.0/man/circuits.bench.10000644000014400001440000000274612072034467016646 0ustar prologicusers.TH circuits.bench 1 "Jun 2011" "circuits 2.0.2" "User Commands" .SH NAME circuits.bench \- simple benchmaking of the circuits library .SH SYNOPSIS .B circuits.bench [\fIoptions\fR] .SH DESCRIPTION circuits.bench does some simple benchmaking of the circuits library. .SH OPTIONS .TP \fB-b\fR \fIaddress:[port]\fR Bind to address:[port] (UDP) to test remote events. Default address is 0.0.0.0. .TP \fB-c\fR \fIinteger\fR Set concurrency level to \fIinteger\fR. Default is 1. .TP \fB-d\fR Enable debug mode. .TP \fB-e\fR \fInumber\fR Stop after specified \fInumber\fR of events. Default is 0. .TP \fB-f\fR \fInumber\fR \fInumber\fR of dummy events to fill queue with. Default is 0. .TP \fB-l\fR Listen on 0.0.0.0:8000 (UDP) to test remote events. .TP \fB-m\fR \fImode\fR Set operation mode. \fImode\fR can be \fIlatency\fR, \fIspeed\fR or \fIsync\fR. Default \fImode\fR is \fIspeed\fR. .TP \fB-o\fR \fIformat\fR Specify output format. For example \fIformat\fR can be:"cicuits.bench: events:%s, speed:%s, time:%s" .TP \fB-p\fR Enable execution profiling support. .TP \fB-q\fR Suppress output. .TP \fB-s\fR Enable psyco (circuits on speed!) if it is available. .TP \fB-t\fR \fIseconds\fR Stop after specified elapsed \fIseconds\fR. .TP \fB-w\fR Wait for remote nodes to connect. .TP \fB--version\fR Output version information and exit. .SH AUTHOR James Mills .PP This manual page was written by Daniele Tricoli , for the Debian project (but may be used by others). circuits-2.1.0/man/circuits.web.10000644000014400001440000000234012072034467016332 0ustar prologicusers.TH circuits.web 1 "Jun 2011" "circuits 2.0.2" "User Commands" .SH NAME circuits.web \- Web Server and testing tool .SH SYNOPSIS .B circuits.web [\fIoptions\fR] [\fIdocroot\fR] .SH DESCRIPTION circuits.web is a component based, event-driven light weight and high performance HTTP/WSGI framework. circuits.web applications are stand-alone applications with a high performance, multi-process web server with great concurrent scalability with full support for WSGI and deployment with other web servers. .SH OPTIONS .TP \fB-b\fR \fIaddress:[port]\fR Bind to address:[port]. Default address is 0.0.0.0:8000. .TP \fB-d\fR Enable debug mode. .TP \fB-j\fR Use python JIT (psyco) if it is available. .TP \fB-m\fR \fInumber\fR Specify \fInumber\fR of processes to start (multiprocessing). .TP \fB-p\fR Enable execution profiling support. .TP \fB-s\fR \fIserver\fR Specify server to use. .TP \fB-t\fR \fItype\fR Specify type of poller to use. \fItype\fR can be \fIepoll\fR, \fIpoll\fR or \fIselect\fR. Default \fItype\fR is \fIselect\fR. .TP \fB-v\fR Enable WSGI validation mode. .SH AUTHOR James Mills .PP This manual page was written by Daniele Tricoli , for the Debian project (but may be used by others). circuits-2.1.0/docs/0000755000014400001440000000000012113366740014023 5ustar prologicuserscircuits-2.1.0/docs/circuits-docs.xml0000644000014400001440000000043012113343751017312 0ustar prologicuserscircuits-2.1.0/docs/check_docs.py0000644000014400001440000000132412113343751016457 0ustar prologicusers#!/usr/bin/env python from subprocess import Popen, PIPE, STDOUT def test_linkcheck(tmpdir): doctrees = tmpdir.join("doctrees") htmldir = tmpdir.join("html") p = Popen([ "sphinx-build", "-W", "-blinkcheck", "-d", str(doctrees), "source", str(htmldir) ], stdout=PIPE, stderr=STDOUT) stdout, _ = p.communicate() if not p.wait() == 0: print(stdout) def test_build_docs(tmpdir): doctrees = tmpdir.join("doctrees") htmldir = tmpdir.join("html") p = Popen([ "sphinx-build", "-W", "-bhtml", "-d", str(doctrees), "source", str(htmldir) ], stdout=PIPE, stderr=STDOUT) stdout, _ = p.communicate() if not p.wait() == 0: print(stdout) circuits-2.1.0/docs/Makefile0000644000014400001440000000607612072034467015476 0ustar prologicusers# Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = BUILDDIR = build # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source .PHONY: help clean html dirhtml pickle json htmlhelp qthelp latex changes linkcheck doctest help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @echo " dirhtml to make HTML files named index.html in directories" @echo " pickle to make pickle files" @echo " json to make JSON files" @echo " htmlhelp to make HTML files and a HTML help project" @echo " qthelp to make HTML files and a qthelp project" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " changes to make an overview of all changed/added/deprecated items" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" clean: -rm -rf $(BUILDDIR)/* html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." pickle: $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle @echo @echo "Build finished; now you can process the pickle files." json: $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json @echo @echo "Build finished; now you can process the JSON files." htmlhelp: $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ ".hhp project file in $(BUILDDIR)/htmlhelp." qthelp: $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp @echo @echo "Build finished; now you can run "qcollectiongenerator" with the" \ ".qhcp project file in $(BUILDDIR)/qthelp, like this:" @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/circuits.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/circuits.qhc" latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." @echo "Run \`make all-pdf' or \`make all-ps' in that directory to" \ "run these through (pdf)latex." changes: $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes @echo @echo "The overview file is in $(BUILDDIR)/changes." linkcheck: $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck @echo @echo "Link check complete; look for any errors in the above output " \ "or in $(BUILDDIR)/linkcheck/output.txt." doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest @echo "Testing of doctests in the sources finished, look at the " \ "results in $(BUILDDIR)/doctest/output.txt." circuits-2.1.0/docs/build/0000755000014400001440000000000012113366740015122 5ustar prologicuserscircuits-2.1.0/docs/build/html/0000755000014400001440000000000012113366740016066 5ustar prologicuserscircuits-2.1.0/docs/build/html/api/0000755000014400001440000000000012113366740016637 5ustar prologicuserscircuits-2.1.0/docs/build/html/api/circuits_web_dispatchers_websockets.html0000644000014400001440000003030312113366677027041 0ustar prologicusers circuits.web.dispatchers.websockets – WebSockets — circuits 2.1.0 documentation

circuits.web.dispatchers.websockets – WebSockets

Events

Components

class circuits.web.dispatchers.websockets.WebSockets(path=None, wschannel='ws', *args, **kwargs)

Bases: circuits.core.components.BaseComponent

This class implements an RFC 6455 compliant WebSockets dispatcher that handles the WebSockets handshake and upgrades the connection.

The dispatcher listens on its channel for Request events and tries to match them with a given path. Upon a match, the request is checked for the proper Opening Handshake information. If successful, the dispatcher confirms the establishment of the connection to the client. Any subsequent data from the client is handled as a WebSocket data frame, decoded and fired as a Read event on the wschannel passed to the constructor. The data from Write events on that channel is encoded as data frames and forwarded to the client.

Firing a Close event on the wschannel closes the connection in an orderly fashion (i.e. as specified by the WebSocket protocol).

Parameters:
  • path – the path to handle. Requests that start with this path are considered to be WebSocket Opening Handshakes.
  • wschannel – the channel on which Read events from the client will be delivered and where Write events to the client will be sent to.

Functions

none

circuits-2.1.0/docs/build/html/api/circuits_core_values.html0000644000014400001440000002474612113366674023764 0ustar prologicusers circuits.core.values – Value — circuits 2.1.0 documentation

circuits.core.values – Value

This defines the Value object used by components and events.

Classes

class circuits.core.values.Value(event=None, manager=None)

Bases: object

Create a new future Value Object

Creates a new future Value Object which is used by Event Objects and the Manager to store the result(s) of an Event Handler’s exeuction of some Event in the system.

Parameters:
  • event (Event instance) – The Event this Value is associated with.
  • manager (A Manager/Component instance.) – The Manager/Component used to trigger notifications.
Variables:
  • result – True if this value has been changed.
  • errors – True if while setting this value an exception occured.
  • notify – True or an event name to notify of changes to this value

This is a Future/Promise implementation.

Components

none

Events

none

Functions

none

circuits-2.1.0/docs/build/html/api/circuits_node_server.html0000644000014400001440000002174112113366676023762 0ustar prologicusers circuits.node.server – Server — circuits 2.1.0 documentation

circuits.node.server – Server

Server

...

Events

none

Components

class circuits.node.server.Server(bind, channel='node')

Bases: circuits.core.components.BaseComponent

Server

...

Functions

none

circuits-2.1.0/docs/build/html/api/circuits_core_handlers.html0000644000014400001440000003505112113366674024254 0ustar prologicusers circuits.core.handlers – Handlers — circuits 2.1.0 documentation

circuits.core.handlers – Handlers

This module define the @handler decorator/function and the HandlesType type.

Classes

class circuits.core.handlers.HandlerMetaClass(name, bases, ns)

Bases: type

Components

none

Events

none

Functions

circuits.core.handlers.handler(*names, **kwargs)

Creates an Event Handler

This decorator can be applied to methods of classes derived from circuits.core.components.BaseComponent. It marks the method as a handler for the events passed as arguments to the @handler decorator. The events are specified by their name.

The decorated method’s arguments must match the arguments passed to the circuits.core.events.Event on creation. Optionally, the method may have an additional first argument named event. If declared, the event object that caused the handler to be invoked is assigned to it.

By default, the handler is invoked by the component’s root Manager for events that are propagated on the channel determined by the BaseComponent’s channel attribute. This may be overridden by specifying a different channel as a keyword parameter of the decorator (channel=...).

Keyword argument priority influences the order in which handlers for a specific event are invoked. The higher the priority, the earlier the handler is executed.

A handler may also be specified as a filter by adding the keyword argument filter=True to the decorator. If such a handler returns a value different from None, no more handlers are invoked for the handled event. Filtering handlers are invoked before normal handlers with the same priority (but after any handlers with higher priority).

If you want to override a handler defined in a base class of your component, you must specify override=True, else your method becomes an additional handler for the event.

Return value

Normally, the results returned by the handlers for an event are simply collected in the circuits.core.events.Event‘s value attribute. As a special case, a handler may return a types.GeneratorType. This signals to the dispatcher that the handler isn’t ready to deliver a result yet. Rather, it has interrupted it’s execution with a yield None statement, thus preserving its current execution state.

The dispatcher saves the returned generator object as a task. All tasks are reexamined (i.e. their next() method is invoked) when the pending events have been executed.

This feature avoids an unnecessarily complicated chaining of event handlers. Imagine a handler A that needs the results from firing an event E in order to complete. Then without this feature, the final action of A would be to fire event E, and another handler for an event SuccessE would be required to complete handler A’s operation, now having the result from invoking E available (actually it’s even a bit more complicated).

Using this “suspend” feature, the handler simply fires event E and then yields None until e.g. it finds a result in E’s value attribute. For the simplest scenario, there even is a utility method circuits.core.manager.Manager.callEvent() that combines firing and waiting.

circuits.core.handlers.reprhandler(handler)
circuits-2.1.0/docs/build/html/api/circuits_web_websocket.html0000644000014400001440000003161112113366700024253 0ustar prologicusers circuits.web.websocket – WebSocket Client — circuits 2.1.0 documentation

circuits.web.websocket – WebSocket Client

Events

Components

class circuits.web.websocket.WebSocketClient(url, channel='wsclient', wschannel='ws', headers={})

Bases: circuits.core.components.BaseComponent

An RFC 6455 compliant WebSocket client component. Upon receiving a circuits.web.client.Connect event, the component tries to establish the connection to the server in a two stage process. First, a circuits.net.sockets.Connect event is sent to a child TCPClient. When the TCP connection has been established, the HTTP request for opening the WebSocket is sent to the server. A failure in this setup process is signaled by a NotConnected event.

When the server accepts the request, the WebSocket connection is established and can be used very much like an ordinary socket by handling Read events on and sending Write events to the channel specified as the wschannel parameter of the constructor. Firing a Close event on that channel closes the connection in an orderly fashion (i.e. as specified by the WebSocket protocol).

Parameters:
  • url – the URL to connect to.
  • channel – the channel used by this component
  • wschannel – the channel used for the actual WebSocket communication (read, write, close events)
  • headers – additional headers to be passed with the WebSocket setup HTTP request
channel = 'wsclient'
close()
connected

Functions

circuits-2.1.0/docs/build/html/api/circuits_web_client.html0000644000014400001440000002747712113366676023576 0ustar prologicusers circuits.web.client – Client — circuits 2.1.0 documentation

circuits.web.client – Client

Events

class circuits.web.client.Request(method, path, body=None, headers={})

Bases: circuits.core.events.Event

Request Event

This Event is used to initiate a new request.

Parameters:
  • method (str) – HTTP Method (PUT, GET, POST, DELETE)
  • path (str) – Path to resource

Components

class circuits.web.client.Client(url, channel='client')

Bases: circuits.core.components.BaseComponent

channel = 'client'
write(data)
close()
connect(host=None, port=None, secure=None)
request(method, path, body=None, headers={})
connected
response

Functions

circuits-2.1.0/docs/build/html/api/circuits_web_events.html0000644000014400001440000006025212113366677023611 0ustar prologicusers circuits.web.events – Events — circuits 2.1.0 documentation

circuits.web.events – Events

Events

class circuits.web.events.WebEvent(*args, **kwargs)

Bases: circuits.core.events.Event

WebEvents have both their success and failure attributes set to True. So event processing generates the derived events ...Success or ...Failure events.

An Event is a message send to one or more channels. It is eventually dispatched to all components that have handlers for one of the channels and the event type.

All normal arguments and keyword arguments passed to the constructor of an event are passed on to the handler. When declaring a handler, its argument list must therefore match the arguments used for creating the event.

Every event has a name attribute that is used for matching the event with the handlers. By default, the name is the uncameled class name of the event.

Variables:
  • channels

    an optional attribute that may be set before firing the event. If defined (usually as a class variable), the attribute specifies the channels that the event should be delivered to as a tuple. This overrides the default behavior of sending the event to the firing component’s channel.

    When an event is fired, the value in this attribute is replaced for the instance with the channels that the event is actually sent to. This information may be used e.g. when the event is passed as a parameter to a handler.

  • value – this is a circuits.core.values.Value object that holds the results returned by the handlers invoked for the event.
  • success – if this optional attribute is set to True, an associated event EventSuccess (original name with “Success” appended) will automatically be fired when all handlers for the event have been invoked successfully.
  • success_channels – the success event is, by default, delivered to same channels as the successfully dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.
  • complete – if this optional attribute is set to True, an associated event EventComplete (original name with “Complete” appended) will automatically be fired when all handlers for the event and all events fired by these handlers (recursively) have been invoked successfully.
  • success_channels – the complete event is, by default, delivered to same channels as the initially dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.
class circuits.web.events.Request(*args, **kwargs)

Bases: circuits.web.events.WebEvent

Request(WebEvent) -> Request WebEvent

args: request, response

An Event is a message send to one or more channels. It is eventually dispatched to all components that have handlers for one of the channels and the event type.

All normal arguments and keyword arguments passed to the constructor of an event are passed on to the handler. When declaring a handler, its argument list must therefore match the arguments used for creating the event.

Every event has a name attribute that is used for matching the event with the handlers. By default, the name is the uncameled class name of the event.

Variables:
  • channels

    an optional attribute that may be set before firing the event. If defined (usually as a class variable), the attribute specifies the channels that the event should be delivered to as a tuple. This overrides the default behavior of sending the event to the firing component’s channel.

    When an event is fired, the value in this attribute is replaced for the instance with the channels that the event is actually sent to. This information may be used e.g. when the event is passed as a parameter to a handler.

  • value – this is a circuits.core.values.Value object that holds the results returned by the handlers invoked for the event.
  • success – if this optional attribute is set to True, an associated event EventSuccess (original name with “Success” appended) will automatically be fired when all handlers for the event have been invoked successfully.
  • success_channels – the success event is, by default, delivered to same channels as the successfully dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.
  • complete – if this optional attribute is set to True, an associated event EventComplete (original name with “Complete” appended) will automatically be fired when all handlers for the event and all events fired by these handlers (recursively) have been invoked successfully.
  • success_channels – the complete event is, by default, delivered to same channels as the initially dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.
classmethod create(name, *args, **kwargs)

All classes derived dynamically from Request are LiteralEvents.

class circuits.web.events.Response(*args, **kwargs)

Bases: circuits.web.events.WebEvent

Response(WebEvent) -> Response WebEvent

args: request, response

An Event is a message send to one or more channels. It is eventually dispatched to all components that have handlers for one of the channels and the event type.

All normal arguments and keyword arguments passed to the constructor of an event are passed on to the handler. When declaring a handler, its argument list must therefore match the arguments used for creating the event.

Every event has a name attribute that is used for matching the event with the handlers. By default, the name is the uncameled class name of the event.

Variables:
  • channels

    an optional attribute that may be set before firing the event. If defined (usually as a class variable), the attribute specifies the channels that the event should be delivered to as a tuple. This overrides the default behavior of sending the event to the firing component’s channel.

    When an event is fired, the value in this attribute is replaced for the instance with the channels that the event is actually sent to. This information may be used e.g. when the event is passed as a parameter to a handler.

  • value – this is a circuits.core.values.Value object that holds the results returned by the handlers invoked for the event.
  • success – if this optional attribute is set to True, an associated event EventSuccess (original name with “Success” appended) will automatically be fired when all handlers for the event have been invoked successfully.
  • success_channels – the success event is, by default, delivered to same channels as the successfully dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.
  • complete – if this optional attribute is set to True, an associated event EventComplete (original name with “Complete” appended) will automatically be fired when all handlers for the event and all events fired by these handlers (recursively) have been invoked successfully.
  • success_channels – the complete event is, by default, delivered to same channels as the initially dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.
class circuits.web.events.Stream(*args, **kwargs)

Bases: circuits.web.events.WebEvent

Stream(WebEvent) -> Stream WebEvent

args: request, response

An Event is a message send to one or more channels. It is eventually dispatched to all components that have handlers for one of the channels and the event type.

All normal arguments and keyword arguments passed to the constructor of an event are passed on to the handler. When declaring a handler, its argument list must therefore match the arguments used for creating the event.

Every event has a name attribute that is used for matching the event with the handlers. By default, the name is the uncameled class name of the event.

Variables:
  • channels

    an optional attribute that may be set before firing the event. If defined (usually as a class variable), the attribute specifies the channels that the event should be delivered to as a tuple. This overrides the default behavior of sending the event to the firing component’s channel.

    When an event is fired, the value in this attribute is replaced for the instance with the channels that the event is actually sent to. This information may be used e.g. when the event is passed as a parameter to a handler.

  • value – this is a circuits.core.values.Value object that holds the results returned by the handlers invoked for the event.
  • success – if this optional attribute is set to True, an associated event EventSuccess (original name with “Success” appended) will automatically be fired when all handlers for the event have been invoked successfully.
  • success_channels – the success event is, by default, delivered to same channels as the successfully dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.
  • complete – if this optional attribute is set to True, an associated event EventComplete (original name with “Complete” appended) will automatically be fired when all handlers for the event and all events fired by these handlers (recursively) have been invoked successfully.
  • success_channels – the complete event is, by default, delivered to same channels as the initially dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.

Components

none

Functions

none

circuits-2.1.0/docs/build/html/api/circuits_core_workers.html0000644000014400001440000002747512113366674024163 0ustar prologicusers circuits.core.workers – Workers — circuits 2.1.0 documentation

circuits.core.workers – Workers

Workers

Worker components used to perform “work” in independent threads or processes. Worker(s) are typically used by a Pool (circuits.core.pools) to create a pool of workers. Worker(s) are not registered with a Manager or another Component - instead they are managed by the Pool. If a Worker is used independently it should not be registered as it causes its main event handler _on_task to execute in the other thread blocking it.

Classes

none

Components

class circuits.core.workers.Worker(*args, **kwargs)

Bases: circuits.core.components.BaseComponent

A thread/process Worker Component

This Component creates a Worker (either a thread or process) which when given a Task, will execute the given function in the task in the background in its thread/process.

Parameters:process (bool) – True to start this Worker as a process (Thread otherwise)

initializes x; see x.__class__.__doc__ for signature

Events

class circuits.core.workers.Task(f, *args, **kwargs)

Bases: circuits.core.events.Event

Task Event

This Event is used to initiate a new task to be performed by a Worker or a Pool of Worker(s).

Parameters:
  • f (function) – The function to be executed.
  • args (tuple) – Arguments to pass to the function
  • kwargs (dict) – Keyword Arguments to pass to the function

Functions

none

circuits-2.1.0/docs/build/html/api/circuits_web_utils.html0000644000014400001440000003073612113366700023434 0ustar prologicusers circuits.web.utils – Utilities — circuits 2.1.0 documentation

circuits.web.utils – Utilities

Utilities

This module implements utility functions.

Events

none

Components

none

Functions

circuits.web.utils.compress(body, compress_level)

Compress ‘body’ at the given compress_level.

circuits.web.utils.dictform(form)
circuits.web.utils.get_ranges(headervalue, content_length)

Return a list of (start, stop) indices from a Range header, or None.

Each (start, stop) tuple will be composed of two ints, which are suitable for use in a slicing operation. That is, the header “Range: bytes=3-6”, if applied against a Python string, is requesting resource[3:7]. This function will return the list [(3, 7)].

If this function returns an empty list, you should return HTTP 416.

circuits.web.utils.parse_body(request, response, params)
circuits.web.utils.parse_qs(query_string) → dict

Build a params dictionary from a query_string. If keep_blank_values is True (the default), keep values that are blank.

circuits.web.utils.url(request, path='', qs='', script_name=None, base=None, relative=None)

Create an absolute URL for the given path.

If ‘path’ starts with a slash (‘/’), this will return
  • (base + script_name + path + qs).
If it does not start with a slash, this returns
  • (base + script_name [+ request.path] + path + qs).

If script_name is None, request will be used to find a script_name, if available.

If base is None, request.base will be used (if available).

Finally, note that this function can be used to obtain an absolute URL for the current request path (minus the querystring) by passing no args. If you call url(qs=request.qs), you should get the original browser URL (assuming no internal redirections).

If relative is False the output will be an absolute URL (including the scheme, host, vhost, and script_name). If True, the output will instead be a URL that is relative to the current request path, perhaps including ‘..’ atoms. If relative is the string ‘server’, the output will instead be a URL that is relative to the server root; i.e., it will start with a slash.

circuits-2.1.0/docs/build/html/api/circuits_app.html0000644000014400001440000002061012113366672022215 0ustar prologicusers circuits.app – Application Support — circuits 2.1.0 documentation

circuits.app – Application Support

Application Components

Contains various components useful for application development and tasks common to applications.

copyright:CopyRight (C) 2004-2012 by James Mills
license:MIT (See: LICENSE)
circuits-2.1.0/docs/build/html/api/circuits_io_notify.html0000644000014400001440000011470712113366675023452 0ustar prologicusers circuits.io.notify – File System Notification — circuits 2.1.0 documentation

circuits.io.notify – File System Notification

Events

class circuits.io.notify.Accessed(*args, **kwargs)

Bases: circuits.core.events.Event

Accessed Event

An Event is a message send to one or more channels. It is eventually dispatched to all components that have handlers for one of the channels and the event type.

All normal arguments and keyword arguments passed to the constructor of an event are passed on to the handler. When declaring a handler, its argument list must therefore match the arguments used for creating the event.

Every event has a name attribute that is used for matching the event with the handlers. By default, the name is the uncameled class name of the event.

Variables:
  • channels

    an optional attribute that may be set before firing the event. If defined (usually as a class variable), the attribute specifies the channels that the event should be delivered to as a tuple. This overrides the default behavior of sending the event to the firing component’s channel.

    When an event is fired, the value in this attribute is replaced for the instance with the channels that the event is actually sent to. This information may be used e.g. when the event is passed as a parameter to a handler.

  • value – this is a circuits.core.values.Value object that holds the results returned by the handlers invoked for the event.
  • success – if this optional attribute is set to True, an associated event EventSuccess (original name with “Success” appended) will automatically be fired when all handlers for the event have been invoked successfully.
  • success_channels – the success event is, by default, delivered to same channels as the successfully dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.
  • complete – if this optional attribute is set to True, an associated event EventComplete (original name with “Complete” appended) will automatically be fired when all handlers for the event and all events fired by these handlers (recursively) have been invoked successfully.
  • success_channels – the complete event is, by default, delivered to same channels as the initially dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.
class circuits.io.notify.Closed(*args, **kwargs)

Bases: circuits.core.events.Event

Closed Event

An Event is a message send to one or more channels. It is eventually dispatched to all components that have handlers for one of the channels and the event type.

All normal arguments and keyword arguments passed to the constructor of an event are passed on to the handler. When declaring a handler, its argument list must therefore match the arguments used for creating the event.

Every event has a name attribute that is used for matching the event with the handlers. By default, the name is the uncameled class name of the event.

Variables:
  • channels

    an optional attribute that may be set before firing the event. If defined (usually as a class variable), the attribute specifies the channels that the event should be delivered to as a tuple. This overrides the default behavior of sending the event to the firing component’s channel.

    When an event is fired, the value in this attribute is replaced for the instance with the channels that the event is actually sent to. This information may be used e.g. when the event is passed as a parameter to a handler.

  • value – this is a circuits.core.values.Value object that holds the results returned by the handlers invoked for the event.
  • success – if this optional attribute is set to True, an associated event EventSuccess (original name with “Success” appended) will automatically be fired when all handlers for the event have been invoked successfully.
  • success_channels – the success event is, by default, delivered to same channels as the successfully dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.
  • complete – if this optional attribute is set to True, an associated event EventComplete (original name with “Complete” appended) will automatically be fired when all handlers for the event and all events fired by these handlers (recursively) have been invoked successfully.
  • success_channels – the complete event is, by default, delivered to same channels as the initially dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.
class circuits.io.notify.Created(*args, **kwargs)

Bases: circuits.core.events.Event

Created Event

An Event is a message send to one or more channels. It is eventually dispatched to all components that have handlers for one of the channels and the event type.

All normal arguments and keyword arguments passed to the constructor of an event are passed on to the handler. When declaring a handler, its argument list must therefore match the arguments used for creating the event.

Every event has a name attribute that is used for matching the event with the handlers. By default, the name is the uncameled class name of the event.

Variables:
  • channels

    an optional attribute that may be set before firing the event. If defined (usually as a class variable), the attribute specifies the channels that the event should be delivered to as a tuple. This overrides the default behavior of sending the event to the firing component’s channel.

    When an event is fired, the value in this attribute is replaced for the instance with the channels that the event is actually sent to. This information may be used e.g. when the event is passed as a parameter to a handler.

  • value – this is a circuits.core.values.Value object that holds the results returned by the handlers invoked for the event.
  • success – if this optional attribute is set to True, an associated event EventSuccess (original name with “Success” appended) will automatically be fired when all handlers for the event have been invoked successfully.
  • success_channels – the success event is, by default, delivered to same channels as the successfully dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.
  • complete – if this optional attribute is set to True, an associated event EventComplete (original name with “Complete” appended) will automatically be fired when all handlers for the event and all events fired by these handlers (recursively) have been invoked successfully.
  • success_channels – the complete event is, by default, delivered to same channels as the initially dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.
class circuits.io.notify.Deleted(*args, **kwargs)

Bases: circuits.core.events.Event

Deleted Event

An Event is a message send to one or more channels. It is eventually dispatched to all components that have handlers for one of the channels and the event type.

All normal arguments and keyword arguments passed to the constructor of an event are passed on to the handler. When declaring a handler, its argument list must therefore match the arguments used for creating the event.

Every event has a name attribute that is used for matching the event with the handlers. By default, the name is the uncameled class name of the event.

Variables:
  • channels

    an optional attribute that may be set before firing the event. If defined (usually as a class variable), the attribute specifies the channels that the event should be delivered to as a tuple. This overrides the default behavior of sending the event to the firing component’s channel.

    When an event is fired, the value in this attribute is replaced for the instance with the channels that the event is actually sent to. This information may be used e.g. when the event is passed as a parameter to a handler.

  • value – this is a circuits.core.values.Value object that holds the results returned by the handlers invoked for the event.
  • success – if this optional attribute is set to True, an associated event EventSuccess (original name with “Success” appended) will automatically be fired when all handlers for the event have been invoked successfully.
  • success_channels – the success event is, by default, delivered to same channels as the successfully dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.
  • complete – if this optional attribute is set to True, an associated event EventComplete (original name with “Complete” appended) will automatically be fired when all handlers for the event and all events fired by these handlers (recursively) have been invoked successfully.
  • success_channels – the complete event is, by default, delivered to same channels as the initially dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.
class circuits.io.notify.Modified(*args, **kwargs)

Bases: circuits.core.events.Event

Modified Event

An Event is a message send to one or more channels. It is eventually dispatched to all components that have handlers for one of the channels and the event type.

All normal arguments and keyword arguments passed to the constructor of an event are passed on to the handler. When declaring a handler, its argument list must therefore match the arguments used for creating the event.

Every event has a name attribute that is used for matching the event with the handlers. By default, the name is the uncameled class name of the event.

Variables:
  • channels

    an optional attribute that may be set before firing the event. If defined (usually as a class variable), the attribute specifies the channels that the event should be delivered to as a tuple. This overrides the default behavior of sending the event to the firing component’s channel.

    When an event is fired, the value in this attribute is replaced for the instance with the channels that the event is actually sent to. This information may be used e.g. when the event is passed as a parameter to a handler.

  • value – this is a circuits.core.values.Value object that holds the results returned by the handlers invoked for the event.
  • success – if this optional attribute is set to True, an associated event EventSuccess (original name with “Success” appended) will automatically be fired when all handlers for the event have been invoked successfully.
  • success_channels – the success event is, by default, delivered to same channels as the successfully dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.
  • complete – if this optional attribute is set to True, an associated event EventComplete (original name with “Complete” appended) will automatically be fired when all handlers for the event and all events fired by these handlers (recursively) have been invoked successfully.
  • success_channels – the complete event is, by default, delivered to same channels as the initially dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.
class circuits.io.notify.Moved(*args, **kwargs)

Bases: circuits.core.events.Event

Moved Event

An Event is a message send to one or more channels. It is eventually dispatched to all components that have handlers for one of the channels and the event type.

All normal arguments and keyword arguments passed to the constructor of an event are passed on to the handler. When declaring a handler, its argument list must therefore match the arguments used for creating the event.

Every event has a name attribute that is used for matching the event with the handlers. By default, the name is the uncameled class name of the event.

Variables:
  • channels

    an optional attribute that may be set before firing the event. If defined (usually as a class variable), the attribute specifies the channels that the event should be delivered to as a tuple. This overrides the default behavior of sending the event to the firing component’s channel.

    When an event is fired, the value in this attribute is replaced for the instance with the channels that the event is actually sent to. This information may be used e.g. when the event is passed as a parameter to a handler.

  • value – this is a circuits.core.values.Value object that holds the results returned by the handlers invoked for the event.
  • success – if this optional attribute is set to True, an associated event EventSuccess (original name with “Success” appended) will automatically be fired when all handlers for the event have been invoked successfully.
  • success_channels – the success event is, by default, delivered to same channels as the successfully dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.
  • complete – if this optional attribute is set to True, an associated event EventComplete (original name with “Complete” appended) will automatically be fired when all handlers for the event and all events fired by these handlers (recursively) have been invoked successfully.
  • success_channels – the complete event is, by default, delivered to same channels as the initially dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.
class circuits.io.notify.Opened(*args, **kwargs)

Bases: circuits.core.events.Event

Opened Event

An Event is a message send to one or more channels. It is eventually dispatched to all components that have handlers for one of the channels and the event type.

All normal arguments and keyword arguments passed to the constructor of an event are passed on to the handler. When declaring a handler, its argument list must therefore match the arguments used for creating the event.

Every event has a name attribute that is used for matching the event with the handlers. By default, the name is the uncameled class name of the event.

Variables:
  • channels

    an optional attribute that may be set before firing the event. If defined (usually as a class variable), the attribute specifies the channels that the event should be delivered to as a tuple. This overrides the default behavior of sending the event to the firing component’s channel.

    When an event is fired, the value in this attribute is replaced for the instance with the channels that the event is actually sent to. This information may be used e.g. when the event is passed as a parameter to a handler.

  • value – this is a circuits.core.values.Value object that holds the results returned by the handlers invoked for the event.
  • success – if this optional attribute is set to True, an associated event EventSuccess (original name with “Success” appended) will automatically be fired when all handlers for the event have been invoked successfully.
  • success_channels – the success event is, by default, delivered to same channels as the successfully dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.
  • complete – if this optional attribute is set to True, an associated event EventComplete (original name with “Complete” appended) will automatically be fired when all handlers for the event and all events fired by these handlers (recursively) have been invoked successfully.
  • success_channels – the complete event is, by default, delivered to same channels as the initially dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.
class circuits.io.notify.Unmounted(*args, **kwargs)

Bases: circuits.core.events.Event

Unmounted Event

An Event is a message send to one or more channels. It is eventually dispatched to all components that have handlers for one of the channels and the event type.

All normal arguments and keyword arguments passed to the constructor of an event are passed on to the handler. When declaring a handler, its argument list must therefore match the arguments used for creating the event.

Every event has a name attribute that is used for matching the event with the handlers. By default, the name is the uncameled class name of the event.

Variables:
  • channels

    an optional attribute that may be set before firing the event. If defined (usually as a class variable), the attribute specifies the channels that the event should be delivered to as a tuple. This overrides the default behavior of sending the event to the firing component’s channel.

    When an event is fired, the value in this attribute is replaced for the instance with the channels that the event is actually sent to. This information may be used e.g. when the event is passed as a parameter to a handler.

  • value – this is a circuits.core.values.Value object that holds the results returned by the handlers invoked for the event.
  • success – if this optional attribute is set to True, an associated event EventSuccess (original name with “Success” appended) will automatically be fired when all handlers for the event have been invoked successfully.
  • success_channels – the success event is, by default, delivered to same channels as the successfully dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.
  • complete – if this optional attribute is set to True, an associated event EventComplete (original name with “Complete” appended) will automatically be fired when all handlers for the event and all events fired by these handlers (recursively) have been invoked successfully.
  • success_channels – the complete event is, by default, delivered to same channels as the initially dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.

Components

class circuits.io.notify.Notify(channel='notify')

Bases: circuits.core.components.Component

Functions

circuits-2.1.0/docs/build/html/api/circuits_net_protocols_irc.html0000644000014400001440000002521112113366675025171 0ustar prologicusers circuits.net.protocols.irc – IRC Protocol — circuits 2.1.0 documentation

circuits.net.protocols.irc – IRC Protocol

Events

class circuits.net.protocols.irc.RAW(*args, **kwargs)

Bases: circuits.net.protocols.irc.Command

RAW command

Components

class circuits.net.protocols.irc.IRC(*args, **kwargs)

Bases: circuits.core.components.Component

IRC Protocol Component

Creates a new IRC Component instance that implements the IRC Protocol. Incoming messages are handled by the “read” Event Handler, parsed and processed with appropriate Events created and exposed to the rest of te system to listen to and handle.

@note: This Component must be used in conjunction with a Component that
exposes Read Events on a “read” Channel.
line(line)

Line Event Handler

Process a line of text and generate the appropiate event. This must not be overridden by sub-classes, if it is, this must be explitetly called by the sub-class. Other Components may however listen to this event and process custom IRC events.

Functions

circuits-2.1.0/docs/build/html/api/circuits_net_protocols_http.html0000644000014400001440000004075112113366675025401 0ustar prologicusers circuits.net.protocols.http – HTTP Protocol — circuits 2.1.0 documentation

circuits.net.protocols.http – HTTP Protocol

Events

class circuits.net.protocols.http.Request(*args, **kwargs)

Bases: circuits.core.events.Event

Request Event

An Event is a message send to one or more channels. It is eventually dispatched to all components that have handlers for one of the channels and the event type.

All normal arguments and keyword arguments passed to the constructor of an event are passed on to the handler. When declaring a handler, its argument list must therefore match the arguments used for creating the event.

Every event has a name attribute that is used for matching the event with the handlers. By default, the name is the uncameled class name of the event.

Variables:
  • channels

    an optional attribute that may be set before firing the event. If defined (usually as a class variable), the attribute specifies the channels that the event should be delivered to as a tuple. This overrides the default behavior of sending the event to the firing component’s channel.

    When an event is fired, the value in this attribute is replaced for the instance with the channels that the event is actually sent to. This information may be used e.g. when the event is passed as a parameter to a handler.

  • value – this is a circuits.core.values.Value object that holds the results returned by the handlers invoked for the event.
  • success – if this optional attribute is set to True, an associated event EventSuccess (original name with “Success” appended) will automatically be fired when all handlers for the event have been invoked successfully.
  • success_channels – the success event is, by default, delivered to same channels as the successfully dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.
  • complete – if this optional attribute is set to True, an associated event EventComplete (original name with “Complete” appended) will automatically be fired when all handlers for the event and all events fired by these handlers (recursively) have been invoked successfully.
  • success_channels – the complete event is, by default, delivered to same channels as the initially dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.
class circuits.net.protocols.http.Response(*args, **kwargs)

Bases: circuits.core.events.Event

Response Event

An Event is a message send to one or more channels. It is eventually dispatched to all components that have handlers for one of the channels and the event type.

All normal arguments and keyword arguments passed to the constructor of an event are passed on to the handler. When declaring a handler, its argument list must therefore match the arguments used for creating the event.

Every event has a name attribute that is used for matching the event with the handlers. By default, the name is the uncameled class name of the event.

Variables:
  • channels

    an optional attribute that may be set before firing the event. If defined (usually as a class variable), the attribute specifies the channels that the event should be delivered to as a tuple. This overrides the default behavior of sending the event to the firing component’s channel.

    When an event is fired, the value in this attribute is replaced for the instance with the channels that the event is actually sent to. This information may be used e.g. when the event is passed as a parameter to a handler.

  • value – this is a circuits.core.values.Value object that holds the results returned by the handlers invoked for the event.
  • success – if this optional attribute is set to True, an associated event EventSuccess (original name with “Success” appended) will automatically be fired when all handlers for the event have been invoked successfully.
  • success_channels – the success event is, by default, delivered to same channels as the successfully dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.
  • complete – if this optional attribute is set to True, an associated event EventComplete (original name with “Complete” appended) will automatically be fired when all handlers for the event and all events fired by these handlers (recursively) have been invoked successfully.
  • success_channels – the complete event is, by default, delivered to same channels as the initially dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.

Components

class circuits.net.protocols.http.HTTP(encoding='utf-8', channel='web')

Bases: circuits.core.components.BaseComponent

Functions

circuits-2.1.0/docs/build/html/api/circuits_io_serial.html0000644000014400001440000002200212113366675023403 0ustar prologicusers circuits.io.serial – Serial I/O — circuits 2.1.0 documentation

circuits.io.serial – Serial I/O

Events

none

Components

class circuits.io.serial.Serial(port, baudrate=115200, bufsize=4096, timeout=0.20000000000000001, channel='serial')

Bases: circuits.core.components.Component

Functions

none

circuits-2.1.0/docs/build/html/api/circuits_tools.html0000644000014400001440000002035612113366676022610 0ustar prologicusers circuits.tools – Development Tools — circuits 2.1.0 documentation

circuits.tools – Development Tools

Often you will end up needing to do some debugging or inspection of your system. The circuits.tools package provides a set of development tools for debugging, inspection and analysis.

circuits.tools.graph(x, name=None)

Display a directed graph of the Component structure of x

Parameters:
  • x (Component or Manager) – A Component or Manager to graph
  • name (str) – A name for the graph (defaults to x’s name)

@return: A directed graph representing x’s Component sturcture. @rtype: str

circuits-2.1.0/docs/build/html/api/circuits_web_dispatchers_virtualhosts.html0000644000014400001440000002571012113366677027445 0ustar prologicusers circuits.web.dispatchers.virtualhosts – Virtual Hosts — circuits 2.1.0 documentation

circuits.web.dispatchers.virtualhosts – Virtual Hosts

VirtualHost

This module implements a virtual host dispatcher that sends requests for configured virtual hosts to different dispatchers.

Events

none

Components

class circuits.web.dispatchers.virtualhosts.VirtualHosts(domains)

Bases: circuits.core.components.BaseComponent

Forward to anotehr Dispatcher based on the Host header.

This can be useful when running multiple sites within one server. It allows several domains to point to different parts of a single website structure. For example: - http://www.domain.example -> / - http://www.domain2.example -> /domain2 - http://www.domain2.example:443 -> /secure

Parameters:domains (dict) – a dict of {host header value: virtual prefix} pairs.

The incoming “Host” request header is looked up in this dict, and, if a match is found, the corresponding “virtual prefix” value will be prepended to the URL path before passing the request onto the next dispatcher.

Note that you often need separate entries for “example.com” and “www.example.com”. In addition, “Host” headers may contain the port number.

Functions

none

circuits-2.1.0/docs/build/html/api/circuits_core_pollers.html0000644000014400001440000002743112113366674024137 0ustar prologicusers circuits.core.pollers – I/O Pollers — circuits 2.1.0 documentation

circuits.core.pollers – I/O Pollers

Poller Components for asynchronous file and socket I/O.

This module contains Poller components that enable polling of file or socket descriptors for read/write events. Pollers: - Select - Poll - EPoll

Classes

none

Components

class circuits.core.pollers.BasePoller(timeout=0.01, channel=None)

Bases: circuits.core.components.BaseComponent

class circuits.core.pollers.Select(timeout=0.01, channel='select')

Bases: circuits.core.pollers.BasePoller

Select(...) -> new Select Poller Component

Creates a new Select Poller Component that uses the select poller implementation. This poller is not recommended but is available for legacy reasons as most systems implement select-based polling for backwards compatibility.

class circuits.core.pollers.Poll(timeout=0.01, channel='poll')

Bases: circuits.core.pollers.BasePoller

Poll(...) -> new Poll Poller Component

Creates a new Poll Poller Component that uses the poll poller implementation.

class circuits.core.pollers.EPoll(timeout=0.01, channel='epoll')

Bases: circuits.core.pollers.BasePoller

EPoll(...) -> new EPoll Poller Component

Creates a new EPoll Poller Component that uses the epoll poller implementation.

Events

none

Functions

none

circuits-2.1.0/docs/build/html/api/circuits_core_timers.html0000644000014400001440000002547112113366674023764 0ustar prologicusers circuits.core.timers – Timers — circuits 2.1.0 documentation

circuits.core.timers – Timers

Timer component to facilitate timed events.

Classes

none

Components

class circuits.core.timers.Timer(interval, event, *channels, **kwargs)

Bases: circuits.core.components.BaseComponent

A timer is a component that fires an event once after a certain delay or periodically at a regular interval.

Parameters:
  • interval (datetime or float number) – the delay or interval to wait for until the event is fired. If interval is specified as datetime, the interval is recalculated as the time span from now to the given datetime.
  • event (Event) – the event to fire.

If the optional keyword argument persist is set to True, the event will be fired repeatedly. Else the timer fires the event once and then unregisters itself.

reset()

Reset the timer, i.e. clear the amount of time already waited for.

Events

none

Functions

none

circuits-2.1.0/docs/build/html/api/circuits_core.html0000644000014400001440000002155512113366673022377 0ustar prologicusers circuits.core – Core Functionality — circuits 2.1.0 documentation circuits-2.1.0/docs/build/html/api/circuits_net_protocols.html0000644000014400001440000002036612113366675024342 0ustar prologicusers circuits.net.protocols – Networking Protocols — circuits 2.1.0 documentation

circuits.net.protocols – Networking Protocols

Networking Protocols

This package contains components that implement various networking protocols.

circuits-2.1.0/docs/build/html/api/index.html0000644000014400001440000002030412113366700020627 0ustar prologicusers API Reference — circuits 2.1.0 documentation circuits-2.1.0/docs/build/html/api/circuits_web_dispatchers_jsonrpc.html0000644000014400001440000003235512113366677026357 0ustar prologicusers circuits.web.dispatchers.jsonrpc – JSON-RPC — circuits 2.1.0 documentation

circuits.web.dispatchers.jsonrpc – JSON-RPC

JSON RPC

This module implements a JSON RPC dispatcher that translates incoming RPC calls over JSON into RPC events.

Events

class circuits.web.dispatchers.jsonrpc.RPC(*args, **kwargs)

Bases: circuits.core.events.Event

RPC Event

An Event is a message send to one or more channels. It is eventually dispatched to all components that have handlers for one of the channels and the event type.

All normal arguments and keyword arguments passed to the constructor of an event are passed on to the handler. When declaring a handler, its argument list must therefore match the arguments used for creating the event.

Every event has a name attribute that is used for matching the event with the handlers. By default, the name is the uncameled class name of the event.

Variables:
  • channels

    an optional attribute that may be set before firing the event. If defined (usually as a class variable), the attribute specifies the channels that the event should be delivered to as a tuple. This overrides the default behavior of sending the event to the firing component’s channel.

    When an event is fired, the value in this attribute is replaced for the instance with the channels that the event is actually sent to. This information may be used e.g. when the event is passed as a parameter to a handler.

  • value – this is a circuits.core.values.Value object that holds the results returned by the handlers invoked for the event.
  • success – if this optional attribute is set to True, an associated event EventSuccess (original name with “Success” appended) will automatically be fired when all handlers for the event have been invoked successfully.
  • success_channels – the success event is, by default, delivered to same channels as the successfully dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.
  • complete – if this optional attribute is set to True, an associated event EventComplete (original name with “Complete” appended) will automatically be fired when all handlers for the event and all events fired by these handlers (recursively) have been invoked successfully.
  • success_channels – the complete event is, by default, delivered to same channels as the initially dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.

Components

class circuits.web.dispatchers.jsonrpc.JSONRPC(path=None, encoding='utf-8', rpc_channel='*')

Bases: circuits.core.components.BaseComponent

Functions

none

circuits-2.1.0/docs/build/html/api/circuits_core_debugger.html0000644000014400001440000002427612113366673024246 0ustar prologicusers circuits.core.debugger – Debugger — circuits 2.1.0 documentation

circuits.core.debugger – Debugger

Debugger component used to debug each event in a system by printing each event to sys.stderr or to a Logger Component instance.

Classes

none

Components

class circuits.core.debugger.Debugger(errors=True, events=True, file=None, logger=None, prefix=None, trim=None, **kwargs)

Bases: circuits.core.components.BaseComponent

Create a new Debugger Component

Creates a new Debugger Component that filters all events in the system printing each event to sys.stderr or a Logger Component.

Variables:
  • IgnoreEvents – list of events (str) to ignore
  • IgnoreChannels – list of channels (str) to ignore
  • enabled – Enabled/Disabled flag
Parameters:

log – Logger Component instance or None (default)

initializes x; see x.__class__.__doc__ for signature

Events

none

Functions

none

circuits-2.1.0/docs/build/html/api/circuits_net.html0000644000014400001440000002142512113366675022233 0ustar prologicusers circuits.net – Networking — circuits 2.1.0 documentation

circuits.net – Networking

Networking Components

This package contains components that implement network sockets and protocols for implementing client and server network applications.

copyright:CopyRight (C) 2004-2012 by James Mills
license:MIT (See: LICENSE)
circuits-2.1.0/docs/build/html/api/circuits_app_config.html0000644000014400001440000004003012113366672023540 0ustar prologicusers circuits.app.config – Application Config — circuits 2.1.0 documentation

circuits.app.config – Application Config

Events

class circuits.app.config.Load(*args, **kwargs)

Bases: circuits.app.config.ConfigEvent

Load Config Event

An Event is a message send to one or more channels. It is eventually dispatched to all components that have handlers for one of the channels and the event type.

All normal arguments and keyword arguments passed to the constructor of an event are passed on to the handler. When declaring a handler, its argument list must therefore match the arguments used for creating the event.

Every event has a name attribute that is used for matching the event with the handlers. By default, the name is the uncameled class name of the event.

Variables:
  • channels

    an optional attribute that may be set before firing the event. If defined (usually as a class variable), the attribute specifies the channels that the event should be delivered to as a tuple. This overrides the default behavior of sending the event to the firing component’s channel.

    When an event is fired, the value in this attribute is replaced for the instance with the channels that the event is actually sent to. This information may be used e.g. when the event is passed as a parameter to a handler.

  • value – this is a circuits.core.values.Value object that holds the results returned by the handlers invoked for the event.
  • success – if this optional attribute is set to True, an associated event EventSuccess (original name with “Success” appended) will automatically be fired when all handlers for the event have been invoked successfully.
  • success_channels – the success event is, by default, delivered to same channels as the successfully dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.
  • complete – if this optional attribute is set to True, an associated event EventComplete (original name with “Complete” appended) will automatically be fired when all handlers for the event and all events fired by these handlers (recursively) have been invoked successfully.
  • success_channels – the complete event is, by default, delivered to same channels as the initially dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.
class circuits.app.config.Save(*args, **kwargs)

Bases: circuits.app.config.ConfigEvent

Save Config Event

An Event is a message send to one or more channels. It is eventually dispatched to all components that have handlers for one of the channels and the event type.

All normal arguments and keyword arguments passed to the constructor of an event are passed on to the handler. When declaring a handler, its argument list must therefore match the arguments used for creating the event.

Every event has a name attribute that is used for matching the event with the handlers. By default, the name is the uncameled class name of the event.

Variables:
  • channels

    an optional attribute that may be set before firing the event. If defined (usually as a class variable), the attribute specifies the channels that the event should be delivered to as a tuple. This overrides the default behavior of sending the event to the firing component’s channel.

    When an event is fired, the value in this attribute is replaced for the instance with the channels that the event is actually sent to. This information may be used e.g. when the event is passed as a parameter to a handler.

  • value – this is a circuits.core.values.Value object that holds the results returned by the handlers invoked for the event.
  • success – if this optional attribute is set to True, an associated event EventSuccess (original name with “Success” appended) will automatically be fired when all handlers for the event have been invoked successfully.
  • success_channels – the success event is, by default, delivered to same channels as the successfully dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.
  • complete – if this optional attribute is set to True, an associated event EventComplete (original name with “Complete” appended) will automatically be fired when all handlers for the event and all events fired by these handlers (recursively) have been invoked successfully.
  • success_channels – the complete event is, by default, delivered to same channels as the initially dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.

Components

class circuits.app.config.Config(filename, defaults=None, channel='config')

Bases: circuits.core.components.BaseComponent

Functions

circuits-2.1.0/docs/build/html/api/circuits_web_constants.html0000644000014400001440000001707512113366676024325 0ustar prologicusers circuits.web.constants – Global Constants — circuits 2.1.0 documentation

circuits.web.constants – Global Constants

Global Constants

This module implements required shared global constants.

circuits-2.1.0/docs/build/html/api/circuits_net_sockets.html0000644000014400001440000007232012113366676023767 0ustar prologicusers circuits.net.sockets – Socket Components — circuits 2.1.0 documentation

circuits.net.sockets – Socket Components

Events

class circuits.net.sockets.Connect(*args, **kwargs)

Bases: circuits.core.events.Event

Connect Event

This Event is sent when a new client connection has arrived on a server. This event is also used for client’s to initiate a new connection to a remote host.

Note

This event is used for both Client and Server Components.

Parameters:
  • args (tuple) – Client: (host, port) Server: (sock, host, port)
  • kwargs (dict) – Client: (ssl)
class circuits.net.sockets.Connected(host, port)

Bases: circuits.core.events.Event

Connected Event

This Event is sent when a client has successfully connected.

@note: This event is for Client Components.

Parameters:
  • host – The hostname connected to.
  • port – The port connected to
class circuits.net.sockets.Close(*args)

Bases: circuits.core.events.Event

Close Event

This Event is used to notify a client, client connection or server that we want to close.

@note: This event is never sent, it is used to close. @note: This event is used for both Client and Server Components.

Parameters:args – Client: () Server: (sock)
class circuits.net.sockets.Closed

Bases: circuits.core.events.Event

Closed Event

This Event is sent when a server has closed its listening socket.

@note: This event is for Server components.

class circuits.net.sockets.Read(*args)

Bases: circuits.core.events.Event

Read Event

This Event is sent when a client or server connection has read any data.

@note: This event is used for both Client and Server Components.

Parameters:args – Client: (data) Server: (sock, data)
class circuits.net.sockets.Write(*args)

Bases: circuits.core.events.Event

Write Event

This Event is used to notify a client, client connection or server that we have data to be written.

@note: This event is never sent, it is used to send data. @note: This event is used for both Client and Server Components.

Parameters:args – Client: (data) Server: (sock, data)
class circuits.net.sockets.SocketError(*args)

Bases: circuits.core.events.Event

SocketError Event

This Event is sent when a client or server connection has an error.

@note: This event is used for both Client and Server Components.

Parameters:args – Client: (error) Server: (sock, error)
class circuits.net.sockets.Disconnect(*args)

Bases: circuits.core.events.Event

Disconnect Event

This Event is sent when a client connection has closed on a server. This event is also used for client’s to disconnect from a remote host.

@note: This event is used for both Client and Server Components.

Parameters:args – Client: () Server: (sock)
class circuits.net.sockets.Disconnected

Bases: circuits.core.events.Event

Disconnected Event

This Event is sent when a client has disconnected

@note: This event is for Client Components.

Components

class circuits.net.sockets.Client(bind=None, bufsize=4096, channel='client')

Bases: circuits.core.components.BaseComponent

channel = 'client'
parse_bind_parameter(bind_parameter)
connected
close()
write(data)
class circuits.net.sockets.TCPClient(bind=None, bufsize=4096, channel='client')

Bases: circuits.net.sockets.Client

socket_family = 2
connect(host, port, secure=False, **kwargs)
circuits.net.sockets.UDPClient

alias of UDPServer

class circuits.net.sockets.UNIXClient(bind=None, bufsize=4096, channel='client')

Bases: circuits.net.sockets.Client

ready(component)
connect(path, secure=False, **kwargs)
class circuits.net.sockets.Server(bind, secure=False, backlog=5000, bufsize=4096, channel='server', **kwargs)

Bases: circuits.core.components.BaseComponent

channel = 'server'
parse_bind_parameter(bind_parameter)
connected
host
port
close(sock=None)
write(sock, data)
class circuits.net.sockets.TCPServer(bind, secure=False, backlog=5000, bufsize=4096, channel='server', **kwargs)

Bases: circuits.net.sockets.Server

socket_family = 2
parse_bind_parameter(bind_parameter)
class circuits.net.sockets.UDPServer(bind, secure=False, backlog=5000, bufsize=4096, channel='server', **kwargs)

Bases: circuits.net.sockets.Server

socket_family = 2
close()
write(address, data)
broadcast(data, port)
class circuits.net.sockets.UNIXServer(bind, secure=False, backlog=5000, bufsize=4096, channel='server', **kwargs)

Bases: circuits.net.sockets.Server

Functions

circuits.net.sockets.Pipe(*channels, **kwargs)

Create a new full duplex Pipe

Returns a pair of UNIXClient instances connected on either side of the pipe.

circuits-2.1.0/docs/build/html/api/circuits_web_wrappers.html0000644000014400001440000003154112113366700024132 0ustar prologicusers circuits.web.wrappers – Request/Response Objects — circuits 2.1.0 documentation

circuits.web.wrappers – Request/Response Objects

Events

none

Classes

class circuits.web.wrappers.Body

Bases: object

Response Body

class circuits.web.wrappers.Host(ip, port, name=None)

Bases: object

An internet address.

name should be the client’s host name. If not available (because no DNS lookup is performed), the IP address should be used instead.

class circuits.web.wrappers.Request(sock, method, scheme, path, protocol, qs)

Bases: object

Creates a new Request object to hold information about a request.

Parameters:
  • sock (socket.socket) – The socket object of the request.
  • method (str) – The requsted method.
  • scheme (str) – The requsted scheme.
  • path (str) – The requsted path.
  • protocol (str) – The requsted protocol.
  • qs (str) – The query string of the request.

initializes x; see x.__class__.__doc__ for signature

server = None

@cvar: A reference to the underlying server

class circuits.web.wrappers.Response(request, encoding='utf-8', code=None, message=None)

Bases: object

Response(sock, request) -> new Response object

A Response object that holds the response to send back to the client. This ensure that the correct data is sent in the correct order.

initializes x; see x.__class__.__doc__ for signature

Components

none

Functions

circuits.web.wrappers.file_generator(input, chunkSize=4096)
circuits-2.1.0/docs/build/html/api/circuits_core_utils.html0000644000014400001440000002531112113366674023612 0ustar prologicusers circuits.core.utils – Utilities — circuits 2.1.0 documentation

circuits.core.utils – Utilities

Utils

This module defines utilities used by circuits.

Classes

none

Components

none

Events

none

Functions

circuits.core.utils.findchannel(root, channel, all=False)
circuits.core.utils.findcmp(root, component, all=False)
circuits.core.utils.findroot(component)
circuits.core.utils.findtype(root, component, all=False)
circuits.core.utils.flatten(root, visited=None)
circuits.core.utils.safeimport(name)
circuits-2.1.0/docs/build/html/api/circuits_web_tools.html0000644000014400001440000004241112113366700023425 0ustar prologicusers circuits.web.tools – Tools — circuits 2.1.0 documentation

circuits.web.tools – Tools

Tools

This module implements tools used throughout circuits.web. These tools can also be used within Controlelrs and request handlers.

Events

none

Components

none

Functions

circuits.web.tools.basic_auth(request, response, realm, users, encrypt=None)

Perform Basic Authentication

If auth fails, returns an Unauthorized error with a basic authentication header.

Parameters:
  • realm (str) – The authentication realm.
  • users (dict or callable) – A dict of the form: {username: password} or a callable returning a dict.
  • encrypt (callable) – Callable used to encrypt the password returned from the user-agent. if None it defaults to a md5 encryption.
circuits.web.tools.check_auth(request, response, realm, users, encrypt=None)

Check Authentication

If an authorization header contains credentials, return True, else False.

Parameters:
  • realm (str) – The authentication realm.
  • users (dict or callable) – A dict of the form: {username: password} or a callable returning a dict.
  • encrypt (callable) – Callable used to encrypt the password returned from the user-agent. if None it defaults to a md5 encryption.
circuits.web.tools.digest_auth(request, response, realm, users)

Perform Digest Authentication

If auth fails, raise 401 with a digest authentication header.

Parameters:
  • realm (str) – The authentication realm.
  • users (dict or callable) – A dict of the form: {username: password} or a callable returning a dict.
circuits.web.tools.expires(request, response, secs=0, force=False)

Tool for influencing cache mechanisms using the ‘Expires’ header.

‘secs’ must be either an int or a datetime.timedelta, and indicates the number of seconds between response.time and when the response should expire. The ‘Expires’ header will be set to (response.time + secs).

If ‘secs’ is zero, the ‘Expires’ header is set one year in the past, and the following “cache prevention” headers are also set: - ‘Pragma’: ‘no-cache’ - ‘Cache-Control’: ‘no-cache, must-revalidate’

If ‘force’ is False (the default), the following headers are checked: ‘Etag’, ‘Last-Modified’, ‘Age’, ‘Expires’. If any are already present, none of the above response headers are set.

circuits.web.tools.gzip(response, level=4, mime_types=['text/html', 'text/plain'])

Try to gzip the response body if Content-Type in mime_types.

response.headers[‘Content-Type’] must be set to one of the values in the mime_types arg before calling this function.

No compression is performed if any of the following hold:
  • The client sends no Accept-Encoding request header
  • No ‘gzip’ or ‘x-gzip’ is present in the Accept-Encoding header
  • No ‘gzip’ or ‘x-gzip’ with a qvalue > 0 is present
  • The ‘identity’ value is given with a qvalue > 0.
circuits.web.tools.serve_download(request, response, path, name=None)

Serve ‘path’ as an application/x-download attachment.

circuits.web.tools.serve_file(request, response, path, type=None, disposition=None, name=None)

Set status, headers, and body in order to serve the given file.

The Content-Type header will be set to the type arg, if provided. If not provided, the Content-Type will be guessed by the file extension of the ‘path’ argument.

If disposition is not None, the Content-Disposition header will be set to “<disposition>; filename=<name>”. If name is None, it will be set to the basename of path. If disposition is None, no Content-Disposition header will be written.

circuits.web.tools.validate_etags(request, response, autotags=False)

Validate the current ETag against If-Match, If-None-Match headers.

If autotags is True, an ETag response-header value will be provided from an MD5 hash of the response body (unless some other code has already provided an ETag header). If False (the default), the ETag will not be automatic.

WARNING: the autotags feature is not designed for URL’s which allow methods other than GET. For example, if a POST to the same URL returns no content, the automatic ETag will be incorrect, breaking a fundamental use for entity tags in a possibly destructive fashion. Likewise, if you raise 304 Not Modified, the response body will be empty, the ETag hash will be incorrect, and your application will break. See http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.24

circuits.web.tools.validate_since(request, response)

Validate the current Last-Modified against If-Modified-Since headers.

If no code has set the Last-Modified response header, then no validation will be performed.

circuits-2.1.0/docs/build/html/api/circuits_web_dispatchers_xmlrpc.html0000644000014400001440000003222512113366677026202 0ustar prologicusers circuits.web.dispatchers.xmlrpc – XML-RPC — circuits 2.1.0 documentation

circuits.web.dispatchers.xmlrpc – XML-RPC

XML RPC

This module implements a XML RPC dispatcher that translates incoming RPC calls over XML into RPC events.

Events

class circuits.web.dispatchers.xmlrpc.RPC(*args, **kwargs)

Bases: circuits.core.events.Event

RPC Event

An Event is a message send to one or more channels. It is eventually dispatched to all components that have handlers for one of the channels and the event type.

All normal arguments and keyword arguments passed to the constructor of an event are passed on to the handler. When declaring a handler, its argument list must therefore match the arguments used for creating the event.

Every event has a name attribute that is used for matching the event with the handlers. By default, the name is the uncameled class name of the event.

Variables:
  • channels

    an optional attribute that may be set before firing the event. If defined (usually as a class variable), the attribute specifies the channels that the event should be delivered to as a tuple. This overrides the default behavior of sending the event to the firing component’s channel.

    When an event is fired, the value in this attribute is replaced for the instance with the channels that the event is actually sent to. This information may be used e.g. when the event is passed as a parameter to a handler.

  • value – this is a circuits.core.values.Value object that holds the results returned by the handlers invoked for the event.
  • success – if this optional attribute is set to True, an associated event EventSuccess (original name with “Success” appended) will automatically be fired when all handlers for the event have been invoked successfully.
  • success_channels – the success event is, by default, delivered to same channels as the successfully dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.
  • complete – if this optional attribute is set to True, an associated event EventComplete (original name with “Complete” appended) will automatically be fired when all handlers for the event and all events fired by these handlers (recursively) have been invoked successfully.
  • success_channels – the complete event is, by default, delivered to same channels as the initially dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.

Components

class circuits.web.dispatchers.xmlrpc.XMLRPC(path=None, encoding='utf-8', rpc_channel='*')

Bases: circuits.core.components.BaseComponent

Functions

none

circuits-2.1.0/docs/build/html/api/circuits_io_file.html0000644000014400001440000002170212113366675023051 0ustar prologicusers circuits.io.file – File I/O — circuits 2.1.0 documentation

circuits.io.file – File I/O

Events

none

Components

class circuits.io.file.File(*args, **kwargs)

Bases: circuits.core.components.Component

initializes x; see x.__class__.__doc__ for signature

Functions

none

circuits-2.1.0/docs/build/html/api/circuits_node.html0000644000014400001440000002022412113366676022367 0ustar prologicusers circuits.node – Node — circuits 2.1.0 documentation
circuits-2.1.0/docs/build/html/api/circuits_web_dispatchers_static.html0000644000014400001440000002316212113366677026164 0ustar prologicusers circuits.web.dispatchers.static – Static — circuits 2.1.0 documentation

circuits.web.dispatchers.static – Static

Static

This modStatic implements a Static dispatcher used to serve up static resources and an optional apache-style directory listing.

Events

none

Components

class circuits.web.dispatchers.static.Static(path=None, docroot=None, defaults=('index.html', 'index.xhtml'), dirlisting=False)

Bases: circuits.core.components.BaseComponent

Functions

none

circuits-2.1.0/docs/build/html/api/circuits_web_main.html0000644000014400001440000001743712113366700023223 0ustar prologicusers circuits.web.main – circuits.web — circuits 2.1.0 documentation

circuits.web.main – circuits.web

Main

circutis.web Web Server and Testing Tool.

Shipped application with static and directory index support suitable for quickly serving up simple web pages.

circuits-2.1.0/docs/build/html/api/circuits_web_headers.html0000644000014400001440000004250712113366700023706 0ustar prologicusers circuits.web.headers – Headers — circuits 2.1.0 documentation

circuits.web.headers – Headers

Headers Support

This module implements support for parsing and handling headers.

Events

none

Classes

class circuits.web.headers.Headers(headers=[])

Bases: dict

Manage a collection of HTTP response headers

has_key(name)

Return true if the message contains the header.

get_all(name)

Return a list of all the values for the named field.

These will be sorted in the order they appeared in the original header list or were added to this instance, and may contain duplicates. Any fields deleted and re-inserted are always appended to the header list. If no fields exist with the given name, returns an empty list.

get(name, default=None)

Get the first header value for ‘name’, or return ‘default’

keys()

Return a list of all the header field names.

These will be sorted in the order they appeared in the original header list, or were added to this instance, and may contain duplicates. Any fields deleted and re-inserted are always appended to the header list.

values()

Return a list of all header values.

These will be sorted in the order they appeared in the original header list, or were added to this instance, and may contain duplicates. Any fields deleted and re-inserted are always appended to the header list.

items()

Get all the header fields and values.

These will be sorted in the order they were in the original header list, or were added to this instance, and may contain duplicates. Any fields deleted and re-inserted are always appended to the header list.

setdefault(name, value)

Return first matching header value for ‘name’, or ‘value’

If there is no header named ‘name’, add a new header with name ‘name’ and value ‘value’.

add_header(_name, _value, **_params)

Extended header setting.

_name is the header field to add. keyword arguments can be used to set additional parameters for the header field, with underscores converted to dashes. Normally the parameter will be added as key=”value” unless value is None, in which case only the key will be added.

Example:

h.add_header(‘content-disposition’, ‘attachment’, filename=’bud.gif’)

Note that unlike the corresponding ‘email.Message’ method, this does not handle ‘(charset, language, value)’ tuples: all values must be strings or None.

elements(key)

Return a list of HeaderElements for the given header (or None).

class circuits.web.headers.HeaderElement(value, params=None)

Bases: object

An element (with parameters) from an HTTP header’s element list.

static parse(elementstr)

Transform ‘token;key=val’ to (‘token’, {‘key’: ‘val’}).

classmethod from_str(elementstr)

Construct an instance from a string of the form ‘token;key=val’.

class circuits.web.headers.AcceptElement(value, params=None)

Bases: circuits.web.headers.HeaderElement

An element (with parameters) from an Accept* header’s element list.

AcceptElement objects are comparable; the more-preferred object will be “less than” the less-preferred object. They are also therefore sortable; if you sort a list of AcceptElement objects, they will be listed in priority order; the most preferred value will be first. Yes, it should have been the other way around, but it’s too late to fix now.

qvalue

The qvalue, or priority, of this value.

Components

none

Functions

circuits.web.headers.header_elements(fieldname, fieldvalue)

Return a HeaderElement list from a comma-separated header str.

circuits.web.headers.parse_headers(data)
circuits-2.1.0/docs/build/html/api/circuits_web_exceptions.html0000644000014400001440000006170312113366677024470 0ustar prologicusers circuits.web.exceptions – Exceptions — circuits 2.1.0 documentation

circuits.web.exceptions – Exceptions

Exceptions

This module implements a set of standard HTTP Errors as Python Exceptions.

Note: This code is mostly borrowed from werkzeug and adapted for circuits.web

Exceptions

exception circuits.web.exceptions.HTTPException(description=None, traceback=None)

Bases: exceptions.Exception

Baseclass for all HTTP exceptions. This exception can be called by WSGI applications to render a default error page or you can catch the subclasses of it independently and render nicer error messages.

exception circuits.web.exceptions.BadGateway(description=None, traceback=None)

Bases: circuits.web.exceptions.HTTPException

502 Bad Gateway

If you do proxying in your application you should return this status code if you received an invalid response from the upstream server it accessed in attempting to fulfill the request.

exception circuits.web.exceptions.BadRequest(description=None, traceback=None)

Bases: circuits.web.exceptions.HTTPException

400 Bad Request

Raise if the browser sends something to the application the application or server cannot handle.

exception circuits.web.exceptions.Forbidden(description=None, traceback=None)

Bases: circuits.web.exceptions.HTTPException

403 Forbidden

Raise if the user doesn’t have the permission for the requested resource but was authenticated.

exception circuits.web.exceptions.Gone(description=None, traceback=None)

Bases: circuits.web.exceptions.HTTPException

410 Gone

Raise if a resource existed previously and went away without new location.

exception circuits.web.exceptions.InternalServerError(description=None, traceback=None)

Bases: circuits.web.exceptions.HTTPException

500 Internal Server Error

Raise if an internal server error occurred. This is a good fallback if an unknown error occurred in the dispatcher.

exception circuits.web.exceptions.LengthRequired(description=None, traceback=None)

Bases: circuits.web.exceptions.HTTPException

411 Length Required

Raise if the browser submitted data but no Content-Length header which is required for the kind of processing the server does.

exception circuits.web.exceptions.MethodNotAllowed(method, description=None)

Bases: circuits.web.exceptions.HTTPException

405 Method Not Allowed

Raise if the server used a method the resource does not handle. For example POST if the resource is view only. Especially useful for REST.

The first argument for this exception should be a list of allowed methods. Strictly speaking the response would be invalid if you don’t provide valid methods in the header which you can do with that list.

exception circuits.web.exceptions.NotAcceptable(description=None, traceback=None)

Bases: circuits.web.exceptions.HTTPException

406 Not Acceptable

Raise if the server can’t return any content conforming to the Accept headers of the client.

exception circuits.web.exceptions.NotFound(description=None, traceback=None)

Bases: circuits.web.exceptions.HTTPException

404 Not Found

Raise if a resource does not exist and never existed.

exception circuits.web.exceptions.NotImplemented(description=None, traceback=None)

Bases: circuits.web.exceptions.HTTPException

501 Not Implemented

Raise if the application does not support the action requested by the browser.

exception circuits.web.exceptions.PreconditionFailed(description=None, traceback=None)

Bases: circuits.web.exceptions.HTTPException

412 Precondition Failed

Status code used in combination with If-Match, If-None-Match, or If-Unmodified-Since.

exception circuits.web.exceptions.Redirect(urls, status=None)

Bases: circuits.web.exceptions.HTTPException

exception circuits.web.exceptions.RequestEntityTooLarge(description=None, traceback=None)

Bases: circuits.web.exceptions.HTTPException

413 Request Entity Too Large

The status code one should return if the data submitted exceeded a given limit.

exception circuits.web.exceptions.RequestTimeout(description=None, traceback=None)

Bases: circuits.web.exceptions.HTTPException

408 Request Timeout

Raise to signalize a timeout.

exception circuits.web.exceptions.RequestURITooLarge(description=None, traceback=None)

Bases: circuits.web.exceptions.HTTPException

414 Request URI Too Large

Like 413 but for too long URLs.

exception circuits.web.exceptions.ServiceUnavailable(description=None, traceback=None)

Bases: circuits.web.exceptions.HTTPException

503 Service Unavailable

Status code you should return if a service is temporarily unavailable.

exception circuits.web.exceptions.Unauthorized(description=None, traceback=None)

Bases: circuits.web.exceptions.HTTPException

401 Unauthorized

Raise if the user is not authorized. Also used if you want to use HTTP basic auth.

exception circuits.web.exceptions.UnicodeError(description=None, traceback=None)

Bases: circuits.web.exceptions.HTTPException

raised by the request functions if they were unable to decode the incoming data properly.

exception circuits.web.exceptions.UnsupportedMediaType(description=None, traceback=None)

Bases: circuits.web.exceptions.HTTPException

415 Unsupported Media Type

The status code returned if the server is unable to handle the media type the client transmitted.

Events

none

Components

none

Functions

none

circuits-2.1.0/docs/build/html/api/circuits_web.html0000644000014400001440000002740712113366676022231 0ustar prologicusers circuits.web – Web Framework — circuits 2.1.0 documentation circuits-2.1.0/docs/build/html/api/circuits_web_loggers.html0000644000014400001440000002276112113366700023735 0ustar prologicusers circuits.web.loggers – Loggers — circuits 2.1.0 documentation

circuits.web.loggers – Loggers

Logger Component

This module implements Logger Components.

Events

none

Components

class circuits.web.loggers.Logger(file=None, logger=None, **kwargs)

Bases: circuits.core.components.BaseComponent

Functions

circuits.web.loggers.formattime()
circuits-2.1.0/docs/build/html/api/circuits_app_env.html0000644000014400001440000004056212113366673023076 0ustar prologicusers circuits.app.env – Application Environment — circuits 2.1.0 documentation

circuits.app.env – Application Environment

Events

class circuits.app.env.Create(*args, **kwargs)

Bases: circuits.app.env.EnvironmentEvent

Create Environment Event

An Event is a message send to one or more channels. It is eventually dispatched to all components that have handlers for one of the channels and the event type.

All normal arguments and keyword arguments passed to the constructor of an event are passed on to the handler. When declaring a handler, its argument list must therefore match the arguments used for creating the event.

Every event has a name attribute that is used for matching the event with the handlers. By default, the name is the uncameled class name of the event.

Variables:
  • channels

    an optional attribute that may be set before firing the event. If defined (usually as a class variable), the attribute specifies the channels that the event should be delivered to as a tuple. This overrides the default behavior of sending the event to the firing component’s channel.

    When an event is fired, the value in this attribute is replaced for the instance with the channels that the event is actually sent to. This information may be used e.g. when the event is passed as a parameter to a handler.

  • value – this is a circuits.core.values.Value object that holds the results returned by the handlers invoked for the event.
  • success – if this optional attribute is set to True, an associated event EventSuccess (original name with “Success” appended) will automatically be fired when all handlers for the event have been invoked successfully.
  • success_channels – the success event is, by default, delivered to same channels as the successfully dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.
  • complete – if this optional attribute is set to True, an associated event EventComplete (original name with “Complete” appended) will automatically be fired when all handlers for the event and all events fired by these handlers (recursively) have been invoked successfully.
  • success_channels – the complete event is, by default, delivered to same channels as the initially dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.
class circuits.app.env.Load(*args, **kwargs)

Bases: circuits.app.env.EnvironmentEvent

Load Environment Event

An Event is a message send to one or more channels. It is eventually dispatched to all components that have handlers for one of the channels and the event type.

All normal arguments and keyword arguments passed to the constructor of an event are passed on to the handler. When declaring a handler, its argument list must therefore match the arguments used for creating the event.

Every event has a name attribute that is used for matching the event with the handlers. By default, the name is the uncameled class name of the event.

Variables:
  • channels

    an optional attribute that may be set before firing the event. If defined (usually as a class variable), the attribute specifies the channels that the event should be delivered to as a tuple. This overrides the default behavior of sending the event to the firing component’s channel.

    When an event is fired, the value in this attribute is replaced for the instance with the channels that the event is actually sent to. This information may be used e.g. when the event is passed as a parameter to a handler.

  • value – this is a circuits.core.values.Value object that holds the results returned by the handlers invoked for the event.
  • success – if this optional attribute is set to True, an associated event EventSuccess (original name with “Success” appended) will automatically be fired when all handlers for the event have been invoked successfully.
  • success_channels – the success event is, by default, delivered to same channels as the successfully dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.
  • complete – if this optional attribute is set to True, an associated event EventComplete (original name with “Complete” appended) will automatically be fired when all handlers for the event and all events fired by these handlers (recursively) have been invoked successfully.
  • success_channels – the complete event is, by default, delivered to same channels as the initially dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.

Components

class circuits.app.env.Environment(path, envname, channel='env')

Bases: circuits.core.components.BaseComponent

Base Environment Component

Creates a new environment component that by default only holds configuration and logger components.

This component can be extended to provide more complex system and application environments.

Functions

circuits-2.1.0/docs/build/html/api/circuits_app_daemon.html0000644000014400001440000004371012113366673023547 0ustar prologicusers circuits.app.daemon – Application Daemon — circuits 2.1.0 documentation

circuits.app.daemon – Application Daemon

Events

class circuits.app.daemon.Daemonize(*args, **kwargs)

Bases: circuits.core.events.Event

Daemonize Event

This event can be fired to notify the Daemon Component to begin the “daemonization” process. This event is (by default) used automatically by the Daemon Component in its “started” Event Handler (This behavior can be overridden).

Arguments: None

An Event is a message send to one or more channels. It is eventually dispatched to all components that have handlers for one of the channels and the event type.

All normal arguments and keyword arguments passed to the constructor of an event are passed on to the handler. When declaring a handler, its argument list must therefore match the arguments used for creating the event.

Every event has a name attribute that is used for matching the event with the handlers. By default, the name is the uncameled class name of the event.

Variables:
  • channels

    an optional attribute that may be set before firing the event. If defined (usually as a class variable), the attribute specifies the channels that the event should be delivered to as a tuple. This overrides the default behavior of sending the event to the firing component’s channel.

    When an event is fired, the value in this attribute is replaced for the instance with the channels that the event is actually sent to. This information may be used e.g. when the event is passed as a parameter to a handler.

  • value – this is a circuits.core.values.Value object that holds the results returned by the handlers invoked for the event.
  • success – if this optional attribute is set to True, an associated event EventSuccess (original name with “Success” appended) will automatically be fired when all handlers for the event have been invoked successfully.
  • success_channels – the success event is, by default, delivered to same channels as the successfully dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.
  • complete – if this optional attribute is set to True, an associated event EventComplete (original name with “Complete” appended) will automatically be fired when all handlers for the event and all events fired by these handlers (recursively) have been invoked successfully.
  • success_channels – the complete event is, by default, delivered to same channels as the initially dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.
class circuits.app.daemon.WritePID(*args, **kwargs)

Bases: circuits.core.events.Event

“WritePID Event

This event can be fired to notify the Daemon Component that is should retrive the current process’s id (pid) and write it out to the configured path in the Daemon Component. This event (by default) is used automatically by the Daemon Component after the Daemonize.

An Event is a message send to one or more channels. It is eventually dispatched to all components that have handlers for one of the channels and the event type.

All normal arguments and keyword arguments passed to the constructor of an event are passed on to the handler. When declaring a handler, its argument list must therefore match the arguments used for creating the event.

Every event has a name attribute that is used for matching the event with the handlers. By default, the name is the uncameled class name of the event.

Variables:
  • channels

    an optional attribute that may be set before firing the event. If defined (usually as a class variable), the attribute specifies the channels that the event should be delivered to as a tuple. This overrides the default behavior of sending the event to the firing component’s channel.

    When an event is fired, the value in this attribute is replaced for the instance with the channels that the event is actually sent to. This information may be used e.g. when the event is passed as a parameter to a handler.

  • value – this is a circuits.core.values.Value object that holds the results returned by the handlers invoked for the event.
  • success – if this optional attribute is set to True, an associated event EventSuccess (original name with “Success” appended) will automatically be fired when all handlers for the event have been invoked successfully.
  • success_channels – the success event is, by default, delivered to same channels as the successfully dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.
  • complete – if this optional attribute is set to True, an associated event EventComplete (original name with “Complete” appended) will automatically be fired when all handlers for the event and all events fired by these handlers (recursively) have been invoked successfully.
  • success_channels – the complete event is, by default, delivered to same channels as the initially dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.

Components

class circuits.app.daemon.Daemon(pidfile, path='/', stdin=None, stdout=None, stderr=None, channel='daemon')

Bases: circuits.core.components.BaseComponent

Daemon Component

Parameters:
  • pidfile (str or unicode) – .pid filename
  • stdin (str or unicode) – filename to log stdin
  • stdout (str or unicode) – filename to log stdout
  • stderr (str or unicode) – filename to log stderr

Functions

circuits-2.1.0/docs/build/html/api/circuits_web_sessions.html0000644000014400001440000002252212113366700024134 0ustar prologicusers circuits.web.sessions – Sessions — circuits 2.1.0 documentation

circuits.web.sessions – Sessions

Session Components

This module implements Session Components that can be used to store and access persistent information.

Events

none

Components

class circuits.web.sessions.Sessions(name='circuits.session', *args, **kwargs)

Bases: circuits.core.components.Component

Functions

none

circuits-2.1.0/docs/build/html/api/circuits_core_manager.html0000644000014400001440000005767212113366674024103 0ustar prologicusers circuits.core.manager – Manager — circuits 2.1.0 documentation

circuits.core.manager – Manager

This module defines the Manager class.

Classes

class circuits.core.manager.Manager(*args, **kwargs)

Bases: object

The manager class has two roles. As a base class for component implementation, it provides methods for event and handler management. The method fireEvent() appends a new event at the end of the event queue for later execution. waitEvent() suspends the execution of a handler until all handlers for a given event have been invoked. callEvent() combines the last two methods in a single method.

The methods addHandler() and removeHandler() allow handlers for events to be added and removed dynamically. (The more common way to register a handler is to use the handler() decorator or derive the class from Component.)

In its second role, the Manager takes the role of the event executor. Every component hierarchy has a root component that maintains a queue of events. Firing an event effectively means appending it to the event queue maintained by the root manager. The flush() method removes all pending events from the queue and, for each event, invokes all the handlers. Usually, flush() is indirectly invoked by run().

The manager optionally provides information about the execution of events as automatically generated events. If an Event has its success attribute set to True, the manager fires a Success event if all handlers have been executed without error. Note that this event will be enqueued (and dispatched) immediately after the events that have been fired by the event’s handlers. So the success event indicates both the successful invocation of all handlers for the event and the processing of the immediate follow-up events fired by those handlers.

Sometimes it is not sufficient to know that an event and its immediate follow-up events have been processed. Rather, it is important to know when all state changes triggered by an event, directly or indirectly, have been performed. This also includes the processing of events that have been fired when invoking the handlers for the follow-up events and the processing of events that have again been fired by those handlers and so on. The completion of the processing of an event and all its direct or indirect follow-up events may be indicated by a Complete event. This event is generated by the manager if Event has its complete attribute set to True.

Apart from the event queue, the root manager also maintains a list of tasks, actually Python generators, that are updated when the event queue has been flushed.

initializes x; see x.__class__.__doc__ for signature

name

Return the name of this Component/Manager

running

Return the running state of this Component/Manager

pid

Return the process id of this Component/Manager

fireEvent(event, *channels)

Fire an event into the system.

Parameters:
  • event – The event that is to be fired.
  • channels – The channels that this event is delivered on. If no channels are specified, the event is delivered to the channels found in the event’s channel attribute. If this attribute is not set, the event is delivered to the firing component’s channel. And eventually, when set neither, the event is delivered on all channels (“*”).
fire(event, *channels)

Fire an event into the system.

Parameters:
  • event – The event that is to be fired.
  • channels – The channels that this event is delivered on. If no channels are specified, the event is delivered to the channels found in the event’s channel attribute. If this attribute is not set, the event is delivered to the firing component’s channel. And eventually, when set neither, the event is delivered on all channels (“*”).
callEvent(event, *channels)

Fire the given event to the specified channels and suspend execution until it has been dispatched. This method may only be invoked as argument to a yield on the top execution level of a handler (e.g. “yield self.callEvent(event)”). It effectively creates and returns a generator that will be invoked by the main loop until the event has been dispatched (see circuits.core.handlers.handler()).

call(event, *channels)

Fire the given event to the specified channels and suspend execution until it has been dispatched. This method may only be invoked as argument to a yield on the top execution level of a handler (e.g. “yield self.callEvent(event)”). It effectively creates and returns a generator that will be invoked by the main loop until the event has been dispatched (see circuits.core.handlers.handler()).

flushEvents()

Flush all Events in the Event Queue. If called on a manager that is not the root of an object hierarchy, the invocation is delegated to the root manager.

flush()

Flush all Events in the Event Queue. If called on a manager that is not the root of an object hierarchy, the invocation is delegated to the root manager.

start(process=False, link=None)

Start a new thread or process that invokes this manager’s run() method. The invocation of this method returns immediately after the task or process has been started.

stop()

Stop this manager. Invoking this method causes an invocation of run() to return.

tick(timeout=-1)

Execute all possible actions once. Process all registered tasks and flush the event queue. If the application is running fire a GenerateEvents to get new events from sources.

This method is usually invoked from run(). It may also be used to build an application specific main loop.

Parameters:timeout (float, measuring seconds) – the maximum waiting time spent in this method. If negative, the method may block until at least one action has been taken.
run(socket=None)

Run this manager. The method fires the Started event and then continuously calls tick().

The method returns when the manager’s stop() method is invoked.

If invoked by a programs main thread, a signal handler for the INT and TERM signals is installed. This handler fires the corresponding Signal events and then calls stop() for the manager.

Components

none

Events

none

Functions

none

circuits-2.1.0/docs/build/html/api/circuits_io_events.html0000644000014400001440000011327012113366675023440 0ustar prologicusers circuits.io.events – I/O Events — circuits 2.1.0 documentation

circuits.io.events – I/O Events

Events

class circuits.io.events.Close(*args, **kwargs)

Bases: circuits.core.events.Event

Close Event

An Event is a message send to one or more channels. It is eventually dispatched to all components that have handlers for one of the channels and the event type.

All normal arguments and keyword arguments passed to the constructor of an event are passed on to the handler. When declaring a handler, its argument list must therefore match the arguments used for creating the event.

Every event has a name attribute that is used for matching the event with the handlers. By default, the name is the uncameled class name of the event.

Variables:
  • channels

    an optional attribute that may be set before firing the event. If defined (usually as a class variable), the attribute specifies the channels that the event should be delivered to as a tuple. This overrides the default behavior of sending the event to the firing component’s channel.

    When an event is fired, the value in this attribute is replaced for the instance with the channels that the event is actually sent to. This information may be used e.g. when the event is passed as a parameter to a handler.

  • value – this is a circuits.core.values.Value object that holds the results returned by the handlers invoked for the event.
  • success – if this optional attribute is set to True, an associated event EventSuccess (original name with “Success” appended) will automatically be fired when all handlers for the event have been invoked successfully.
  • success_channels – the success event is, by default, delivered to same channels as the successfully dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.
  • complete – if this optional attribute is set to True, an associated event EventComplete (original name with “Complete” appended) will automatically be fired when all handlers for the event and all events fired by these handlers (recursively) have been invoked successfully.
  • success_channels – the complete event is, by default, delivered to same channels as the initially dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.
class circuits.io.events.Closed(*args, **kwargs)

Bases: circuits.core.events.Event

Closed Event

An Event is a message send to one or more channels. It is eventually dispatched to all components that have handlers for one of the channels and the event type.

All normal arguments and keyword arguments passed to the constructor of an event are passed on to the handler. When declaring a handler, its argument list must therefore match the arguments used for creating the event.

Every event has a name attribute that is used for matching the event with the handlers. By default, the name is the uncameled class name of the event.

Variables:
  • channels

    an optional attribute that may be set before firing the event. If defined (usually as a class variable), the attribute specifies the channels that the event should be delivered to as a tuple. This overrides the default behavior of sending the event to the firing component’s channel.

    When an event is fired, the value in this attribute is replaced for the instance with the channels that the event is actually sent to. This information may be used e.g. when the event is passed as a parameter to a handler.

  • value – this is a circuits.core.values.Value object that holds the results returned by the handlers invoked for the event.
  • success – if this optional attribute is set to True, an associated event EventSuccess (original name with “Success” appended) will automatically be fired when all handlers for the event have been invoked successfully.
  • success_channels – the success event is, by default, delivered to same channels as the successfully dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.
  • complete – if this optional attribute is set to True, an associated event EventComplete (original name with “Complete” appended) will automatically be fired when all handlers for the event and all events fired by these handlers (recursively) have been invoked successfully.
  • success_channels – the complete event is, by default, delivered to same channels as the initially dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.
class circuits.io.events.EOF(*args, **kwargs)

Bases: circuits.core.events.Event

EOF Event

An Event is a message send to one or more channels. It is eventually dispatched to all components that have handlers for one of the channels and the event type.

All normal arguments and keyword arguments passed to the constructor of an event are passed on to the handler. When declaring a handler, its argument list must therefore match the arguments used for creating the event.

Every event has a name attribute that is used for matching the event with the handlers. By default, the name is the uncameled class name of the event.

Variables:
  • channels

    an optional attribute that may be set before firing the event. If defined (usually as a class variable), the attribute specifies the channels that the event should be delivered to as a tuple. This overrides the default behavior of sending the event to the firing component’s channel.

    When an event is fired, the value in this attribute is replaced for the instance with the channels that the event is actually sent to. This information may be used e.g. when the event is passed as a parameter to a handler.

  • value – this is a circuits.core.values.Value object that holds the results returned by the handlers invoked for the event.
  • success – if this optional attribute is set to True, an associated event EventSuccess (original name with “Success” appended) will automatically be fired when all handlers for the event have been invoked successfully.
  • success_channels – the success event is, by default, delivered to same channels as the successfully dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.
  • complete – if this optional attribute is set to True, an associated event EventComplete (original name with “Complete” appended) will automatically be fired when all handlers for the event and all events fired by these handlers (recursively) have been invoked successfully.
  • success_channels – the complete event is, by default, delivered to same channels as the initially dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.
class circuits.io.events.Error(*args, **kwargs)

Bases: circuits.core.events.Event

Error Event

An Event is a message send to one or more channels. It is eventually dispatched to all components that have handlers for one of the channels and the event type.

All normal arguments and keyword arguments passed to the constructor of an event are passed on to the handler. When declaring a handler, its argument list must therefore match the arguments used for creating the event.

Every event has a name attribute that is used for matching the event with the handlers. By default, the name is the uncameled class name of the event.

Variables:
  • channels

    an optional attribute that may be set before firing the event. If defined (usually as a class variable), the attribute specifies the channels that the event should be delivered to as a tuple. This overrides the default behavior of sending the event to the firing component’s channel.

    When an event is fired, the value in this attribute is replaced for the instance with the channels that the event is actually sent to. This information may be used e.g. when the event is passed as a parameter to a handler.

  • value – this is a circuits.core.values.Value object that holds the results returned by the handlers invoked for the event.
  • success – if this optional attribute is set to True, an associated event EventSuccess (original name with “Success” appended) will automatically be fired when all handlers for the event have been invoked successfully.
  • success_channels – the success event is, by default, delivered to same channels as the successfully dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.
  • complete – if this optional attribute is set to True, an associated event EventComplete (original name with “Complete” appended) will automatically be fired when all handlers for the event and all events fired by these handlers (recursively) have been invoked successfully.
  • success_channels – the complete event is, by default, delivered to same channels as the initially dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.
class circuits.io.events.Opened(*args, **kwargs)

Bases: circuits.core.events.Event

Opened Event

An Event is a message send to one or more channels. It is eventually dispatched to all components that have handlers for one of the channels and the event type.

All normal arguments and keyword arguments passed to the constructor of an event are passed on to the handler. When declaring a handler, its argument list must therefore match the arguments used for creating the event.

Every event has a name attribute that is used for matching the event with the handlers. By default, the name is the uncameled class name of the event.

Variables:
  • channels

    an optional attribute that may be set before firing the event. If defined (usually as a class variable), the attribute specifies the channels that the event should be delivered to as a tuple. This overrides the default behavior of sending the event to the firing component’s channel.

    When an event is fired, the value in this attribute is replaced for the instance with the channels that the event is actually sent to. This information may be used e.g. when the event is passed as a parameter to a handler.

  • value – this is a circuits.core.values.Value object that holds the results returned by the handlers invoked for the event.
  • success – if this optional attribute is set to True, an associated event EventSuccess (original name with “Success” appended) will automatically be fired when all handlers for the event have been invoked successfully.
  • success_channels – the success event is, by default, delivered to same channels as the successfully dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.
  • complete – if this optional attribute is set to True, an associated event EventComplete (original name with “Complete” appended) will automatically be fired when all handlers for the event and all events fired by these handlers (recursively) have been invoked successfully.
  • success_channels – the complete event is, by default, delivered to same channels as the initially dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.
class circuits.io.events.Read(*args, **kwargs)

Bases: circuits.core.events.Event

Read Event

An Event is a message send to one or more channels. It is eventually dispatched to all components that have handlers for one of the channels and the event type.

All normal arguments and keyword arguments passed to the constructor of an event are passed on to the handler. When declaring a handler, its argument list must therefore match the arguments used for creating the event.

Every event has a name attribute that is used for matching the event with the handlers. By default, the name is the uncameled class name of the event.

Variables:
  • channels

    an optional attribute that may be set before firing the event. If defined (usually as a class variable), the attribute specifies the channels that the event should be delivered to as a tuple. This overrides the default behavior of sending the event to the firing component’s channel.

    When an event is fired, the value in this attribute is replaced for the instance with the channels that the event is actually sent to. This information may be used e.g. when the event is passed as a parameter to a handler.

  • value – this is a circuits.core.values.Value object that holds the results returned by the handlers invoked for the event.
  • success – if this optional attribute is set to True, an associated event EventSuccess (original name with “Success” appended) will automatically be fired when all handlers for the event have been invoked successfully.
  • success_channels – the success event is, by default, delivered to same channels as the successfully dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.
  • complete – if this optional attribute is set to True, an associated event EventComplete (original name with “Complete” appended) will automatically be fired when all handlers for the event and all events fired by these handlers (recursively) have been invoked successfully.
  • success_channels – the complete event is, by default, delivered to same channels as the initially dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.
class circuits.io.events.Seek(*args, **kwargs)

Bases: circuits.core.events.Event

Seek Event

An Event is a message send to one or more channels. It is eventually dispatched to all components that have handlers for one of the channels and the event type.

All normal arguments and keyword arguments passed to the constructor of an event are passed on to the handler. When declaring a handler, its argument list must therefore match the arguments used for creating the event.

Every event has a name attribute that is used for matching the event with the handlers. By default, the name is the uncameled class name of the event.

Variables:
  • channels

    an optional attribute that may be set before firing the event. If defined (usually as a class variable), the attribute specifies the channels that the event should be delivered to as a tuple. This overrides the default behavior of sending the event to the firing component’s channel.

    When an event is fired, the value in this attribute is replaced for the instance with the channels that the event is actually sent to. This information may be used e.g. when the event is passed as a parameter to a handler.

  • value – this is a circuits.core.values.Value object that holds the results returned by the handlers invoked for the event.
  • success – if this optional attribute is set to True, an associated event EventSuccess (original name with “Success” appended) will automatically be fired when all handlers for the event have been invoked successfully.
  • success_channels – the success event is, by default, delivered to same channels as the successfully dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.
  • complete – if this optional attribute is set to True, an associated event EventComplete (original name with “Complete” appended) will automatically be fired when all handlers for the event and all events fired by these handlers (recursively) have been invoked successfully.
  • success_channels – the complete event is, by default, delivered to same channels as the initially dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.
class circuits.io.events.Write(*args, **kwargs)

Bases: circuits.core.events.Event

Write Event

An Event is a message send to one or more channels. It is eventually dispatched to all components that have handlers for one of the channels and the event type.

All normal arguments and keyword arguments passed to the constructor of an event are passed on to the handler. When declaring a handler, its argument list must therefore match the arguments used for creating the event.

Every event has a name attribute that is used for matching the event with the handlers. By default, the name is the uncameled class name of the event.

Variables:
  • channels

    an optional attribute that may be set before firing the event. If defined (usually as a class variable), the attribute specifies the channels that the event should be delivered to as a tuple. This overrides the default behavior of sending the event to the firing component’s channel.

    When an event is fired, the value in this attribute is replaced for the instance with the channels that the event is actually sent to. This information may be used e.g. when the event is passed as a parameter to a handler.

  • value – this is a circuits.core.values.Value object that holds the results returned by the handlers invoked for the event.
  • success – if this optional attribute is set to True, an associated event EventSuccess (original name with “Success” appended) will automatically be fired when all handlers for the event have been invoked successfully.
  • success_channels – the success event is, by default, delivered to same channels as the successfully dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.
  • complete – if this optional attribute is set to True, an associated event EventComplete (original name with “Complete” appended) will automatically be fired when all handlers for the event and all events fired by these handlers (recursively) have been invoked successfully.
  • success_channels – the complete event is, by default, delivered to same channels as the initially dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.

Components

none

Functions

none

circuits-2.1.0/docs/build/html/api/circuits_node_node.html0000644000014400001440000002164512113366676023404 0ustar prologicusers circuits.node.node – Node — circuits 2.1.0 documentation

circuits.node.node – Node

Node

...

Events

none

Components

class circuits.node.node.Node(bind=None, channel='node')

Bases: circuits.core.components.BaseComponent

Node

...

Functions

none

circuits-2.1.0/docs/build/html/api/circuits_core_loader.html0000644000014400001440000002315112113366674023720 0ustar prologicusers circuits.core.loader – Loader — circuits 2.1.0 documentation

circuits.core.loader – Loader

This module implements a generic Loader suitable for dynamically loading components from other modules. This supports loading from local paths, eggs and zip archives. Both setuptools and distribute are fully supported.

Classes

none

Components

class circuits.core.loader.Loader(auto_register=True, init_args=None, init_kwargs=None, paths=None, channel='loader')

Bases: circuits.core.components.BaseComponent

Create a new Loader Component

Creates a new Loader Component that enables dynamic loading of components from modules either in local paths, eggs or zip archives.

initializes x; see x.__class__.__doc__ for signature

Events

none

Functions

none

circuits-2.1.0/docs/build/html/api/circuits_net_protocols_line.html0000644000014400001440000003676312113366675025361 0ustar prologicusers circuits.net.protocols.line – Line Protocol — circuits 2.1.0 documentation

circuits.net.protocols.line – Line Protocol

Events

class circuits.net.protocols.line.Line(*args, **kwargs)

Bases: circuits.core.events.Event

Line Event

An Event is a message send to one or more channels. It is eventually dispatched to all components that have handlers for one of the channels and the event type.

All normal arguments and keyword arguments passed to the constructor of an event are passed on to the handler. When declaring a handler, its argument list must therefore match the arguments used for creating the event.

Every event has a name attribute that is used for matching the event with the handlers. By default, the name is the uncameled class name of the event.

Variables:
  • channels

    an optional attribute that may be set before firing the event. If defined (usually as a class variable), the attribute specifies the channels that the event should be delivered to as a tuple. This overrides the default behavior of sending the event to the firing component’s channel.

    When an event is fired, the value in this attribute is replaced for the instance with the channels that the event is actually sent to. This information may be used e.g. when the event is passed as a parameter to a handler.

  • value – this is a circuits.core.values.Value object that holds the results returned by the handlers invoked for the event.
  • success – if this optional attribute is set to True, an associated event EventSuccess (original name with “Success” appended) will automatically be fired when all handlers for the event have been invoked successfully.
  • success_channels – the success event is, by default, delivered to same channels as the successfully dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.
  • complete – if this optional attribute is set to True, an associated event EventComplete (original name with “Complete” appended) will automatically be fired when all handlers for the event and all events fired by these handlers (recursively) have been invoked successfully.
  • success_channels – the complete event is, by default, delivered to same channels as the initially dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.

Components

class circuits.net.protocols.line.LP(*args, **kwargs)

Bases: circuits.core.components.BaseComponent

Line Protocol

Implements the Line Protocol.

Incoming data is split into lines with a splitter function. For each line of data processed a Line Event is created. Any unfinished lines are appended into an internal buffer.

A custom line splitter function can be passed to customize how data is split into lines. This function must accept two arguments, the data to process and any left over data from a previous invocation of the splitter function. The function must also return a tiple of two items, a list of lines and any left over data.

Parameters:splitter (function) – a line splitter function

This Component operates in two modes. In normal operation it’s expected to be used in conjunction with components that expose a Read Event on a “read” channel with only one argument (data). Some builtin components that expose such events are: - circuits.net.sockets.TCPClient - circuits.io.File

The second mode of operation works with circuits.net.sockets.Server components such as TCPServer, UNIXServer, etc. It’s expected that two arguments exist in the Read Event, sock and data. The following two arguments can be passed to affect how unfinished data is stored and retrieved for such components:

Parameters:getBuffer (function) – function to retrieve the buffer for a client sock

This function must accept one argument (sock,) the client socket whoose buffer is to be retrieved.

Parameters:updateBuffer (function) – function to update the buffer for a client sock

This function must accept two arguments (sock, buffer,) the client socket and the left over buffer to be updated.

@note: This Component must be used in conjunction with a Component that
exposes Read events on a “read” Channel.

initializes x; see x.__class__.__doc__ for signature

Functions

circuits-2.1.0/docs/build/html/api/circuits_app_log.html0000644000014400001440000003043212113366673023062 0ustar prologicusers circuits.app.log – Application Logging — circuits 2.1.0 documentation

circuits.app.log – Application Logging

Events

class circuits.app.log.Log(*args, **kwargs)

Bases: circuits.core.events.Event

Log Event

An Event is a message send to one or more channels. It is eventually dispatched to all components that have handlers for one of the channels and the event type.

All normal arguments and keyword arguments passed to the constructor of an event are passed on to the handler. When declaring a handler, its argument list must therefore match the arguments used for creating the event.

Every event has a name attribute that is used for matching the event with the handlers. By default, the name is the uncameled class name of the event.

Variables:
  • channels

    an optional attribute that may be set before firing the event. If defined (usually as a class variable), the attribute specifies the channels that the event should be delivered to as a tuple. This overrides the default behavior of sending the event to the firing component’s channel.

    When an event is fired, the value in this attribute is replaced for the instance with the channels that the event is actually sent to. This information may be used e.g. when the event is passed as a parameter to a handler.

  • value – this is a circuits.core.values.Value object that holds the results returned by the handlers invoked for the event.
  • success – if this optional attribute is set to True, an associated event EventSuccess (original name with “Success” appended) will automatically be fired when all handlers for the event have been invoked successfully.
  • success_channels – the success event is, by default, delivered to same channels as the successfully dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.
  • complete – if this optional attribute is set to True, an associated event EventComplete (original name with “Complete” appended) will automatically be fired when all handlers for the event and all events fired by these handlers (recursively) have been invoked successfully.
  • success_channels – the complete event is, by default, delivered to same channels as the initially dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.

Components

class circuits.app.log.Logger(filename, name, type, level, channel='logger')

Bases: circuits.core.components.BaseComponent

Functions

circuits-2.1.0/docs/build/html/api/circuits_web_http.html0000644000014400001440000003764112113366700023255 0ustar prologicusers circuits.web.http – HTTP Protocol — circuits 2.1.0 documentation

circuits.web.http – HTTP Protocol

Hyper Text Transfer Protocol

This module implements the server side Hyper Text Transfer Protocol or commonly known as HTTP.

Components

class circuits.web.http.HTTP(encoding='utf-8', channel='web')

Bases: circuits.core.components.BaseComponent

HTTP Protocol Component

Implements the HTTP server protocol and parses and processes incoming HTTP messages, creating and sending an appropriate response.

The component handles Read events on its channel and collects the associated data until a complete HTTP request has been received. It parses the request’s content and puts it in a Request object and creates a corresponding Response object. Then it emits a Request event with these objects as arguments.

The component defines several handlers that send a response back to the client.

_on_response(response)

Response Event Handler

Parameters:response (Response) – the Response object created when the HTTP request was initially received.

This handler builds an HTTP response data stream from the information contained in the response object and sends it to the client (firing Write events).

_on_read(sock, data)

Read Event Handler

Process any incoming data appending it to an internal buffer. Split the buffer by the standard HTTP delimiter CRLF and create Raw Event per line. Any unfinished lines of text, leave in the buffer.

_on_httperror(event, request, response, code, **kwargs)

Default HTTP Error Handler

Default Error Handler that by default just fires a Response event with the response as argument. The response is normally modified by a HTTPError instance or a subclass thereof.

_on_request_success(e, value)

Handler for the RequestSuccess event that is automatically generated after all handlers for a Request event have been invoked successfully.

Parameters:
  • e – the successfully handled Request event (having as attributes the associated Request and Response objects).
  • value – the value(s) returned by the invoked handler(s).

This handler converts the value(s) returned by the (successfully invoked) handlers for the initial Request event to a body and assigns it to the Response object’s body attribute. It then fires a Response event with the Response object as argument.

Functions

none

circuits-2.1.0/docs/build/html/api/circuits_node_utils.html0000644000014400001440000002312212113366676023607 0ustar prologicusers circuits.node.utils – Node Utilities — circuits 2.1.0 documentation

circuits.node.utils – Node Utilities

Utils

...

Events

none

Components

none

Functions

circuits.node.utils.dump_event(e, id)
circuits.node.utils.dump_value(v)
circuits.node.utils.load_event(s)
circuits.node.utils.load_value(v)
circuits-2.1.0/docs/build/html/api/circuits_core_components.html0000644000014400001440000004563512113366673024651 0ustar prologicusers circuits.core.components – Components — circuits 2.1.0 documentation

circuits.core.components – Components

This module defines the BaseComponent and its subclass Component.

Classes

class circuits.core.components.BaseComponent(*args, **kwargs)

Bases: circuits.core.manager.Manager

This is the base class for all components in a circuits based application. Components can (and should, except for root components) be registered with a parent component.

BaseComponents can declare methods as event handlers using the handler decoration (see circuits.core.handlers.handler()). The handlers are invoked for matching events from the component’s channel (specified as the component’s channel attribute).

BaseComponents inherit from circuits.core.manager.Manager. This provides components with the circuits.core.manager.Manager.fireEvent() method that can be used to fire events as the result of some computation.

Apart from the fireEvent() method, the Manager nature is important for root components that are started or run.

Variables:channel – a component can be associated with a specific channel by setting this attribute. This should either be done by specifying a class attribute channel in the derived class or by passing a keyword parameter channel=”...” to __init__. If specified, the component’s handlers receive events on the specified channel only, and events fired by the component will be sent on the specified channel (this behavior may be overridden, see Event, fireEvent() and handler()). By default, the channel attribute is set to “*”, meaning that events are fired on all channels and received from all channels.

initializes x; see x.__class__.__doc__ for signature

register(parent)

Inserts this component in the component tree as a child of the given parent node.

Parameters:parent (Manager) – the parent component after registration has completed.

This method fires a Registered event to inform other components in the tree about the new member.

unregister()

Removes this component from the component tree.

Removing a component from the component tree is a two stage process. First, the component is marked as to be removed, which prevents it from receiving further events, and a PrepareUnregister event is fired. This allows other components to e.g. release references to the component to be removed before it is actually removed from the component tree.

After the processing of the PrepareUnregister event has completed, the component is removed from the tree and an Unregistered event is fired.

classmethod handlers()

Returns a list of all event handlers for this Component

classmethod handles(*names)

Returns True if all names are event handlers of this Component

class circuits.core.components.Component(*args, **kwargs)

Bases: circuits.core.components.BaseComponent

If you use Component instead of BaseComponent as base class for your own component class, then all methods that are not marked as private (i.e: start with an underscore) are automatically decorated as handlers.

The methods are invoked for all events from the component’s channel where the event’s name matches the method’s name.

Components

none

Events

class circuits.core.components.PrepareUnregister(*args, **kwargs)

Bases: circuits.core.events.Event

This event is fired when a component is about to be unregistered from the component tree. Unregistering a component actually detaches the complete subtree that the unregistered component is the root of. Components that need to know if they are removed from the main tree (e.g. because they maintain relationships to other components in the tree) handle this event, check if the component being unregistered is one of their ancestors and act accordingly.

Parameters:component – the component that will be unregistered
in_subtree(component)

Convenience method that checks if the given component is in the subtree that is about to be detached.

class circuits.core.components.SingletonError

Bases: exceptions.Exception

Raised if a Component with the singleton class attribute is True.

Functions

none

circuits-2.1.0/docs/build/html/api/circuits_web_controllers.html0000644000014400001440000002462312113366676024654 0ustar prologicusers circuits.web.controllers – Controllers — circuits 2.1.0 documentation

circuits.web.controllers – Controllers

Controllers

This module implements ...

Events

none

Components

class circuits.web.controllers.Controller(*args, **kwargs)

Bases: circuits.web.controllers.BaseController

initializes x; see x.__class__.__doc__ for signature

class circuits.web.controllers.JSONController(*args, **kwargs)

Bases: circuits.web.controllers.BaseController

initializes x; see x.__class__.__doc__ for signature

Functions

circuits.web.controllers.expose(*channels, **config)
circuits.web.controllers.exposeJSON(*channels, **config)
circuits-2.1.0/docs/build/html/api/circuits_core_events.html0000644000014400001440000006063112113366673023761 0ustar prologicusers circuits.core.events – Events — circuits 2.1.0 documentation

circuits.core.events – Events

This module defines the basic Event class and common events.

Classes

class circuits.core.events.Event(*args, **kwargs)

Bases: circuits.core.events.BaseEvent

An Event is a message send to one or more channels. It is eventually dispatched to all components that have handlers for one of the channels and the event type.

All normal arguments and keyword arguments passed to the constructor of an event are passed on to the handler. When declaring a handler, its argument list must therefore match the arguments used for creating the event.

Every event has a name attribute that is used for matching the event with the handlers. By default, the name is the uncameled class name of the event.

Variables:
  • channels

    an optional attribute that may be set before firing the event. If defined (usually as a class variable), the attribute specifies the channels that the event should be delivered to as a tuple. This overrides the default behavior of sending the event to the firing component’s channel.

    When an event is fired, the value in this attribute is replaced for the instance with the channels that the event is actually sent to. This information may be used e.g. when the event is passed as a parameter to a handler.

  • value – this is a circuits.core.values.Value object that holds the results returned by the handlers invoked for the event.
  • success – if this optional attribute is set to True, an associated event EventSuccess (original name with “Success” appended) will automatically be fired when all handlers for the event have been invoked successfully.
  • success_channels – the success event is, by default, delivered to same channels as the successfully dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.
  • complete – if this optional attribute is set to True, an associated event EventComplete (original name with “Complete” appended) will automatically be fired when all handlers for the event and all events fired by these handlers (recursively) have been invoked successfully.
  • success_channels – the complete event is, by default, delivered to same channels as the initially dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.

Components

none

Events

class circuits.core.events.Error(type, value, traceback, handler=None)

Bases: circuits.core.events.Event

Error Event

This Event is sent for any exceptions that occur during the execution of an Event Handler that is not SystemExit or KeyboardInterrupt.

Parameters:
  • type (type) – type of exception
  • value (exceptions.TypeError) – exception object
  • traceback (traceback) – traceback of exception
  • kwargs (dict) – (Optional) Additional Information
class circuits.core.events.Failure(*args, **kwargs)

Bases: circuits.core.events.DerivedEvent

Failure Event

This Event is sent when an error has occurred with the execution of an Event Handlers.

Parameters:event (Event) – The event that failed
class circuits.core.events.Registered(component, manager)

Bases: circuits.core.events.Event

Registered Event

This Event is sent when a Component has registered with another Component or Manager. This Event is only sent iif the Component or Manager being registered with is not itself.

Parameters:
  • component (Component) – The Component being registered
  • manager (Component or Manager) – The Component or Manager being registered with
class circuits.core.events.Signal(signal, stack)

Bases: circuits.core.events.Event

Signal Event

This Event is sent when a Component receives a signal.

Parameters:
  • signal – The signal number received.
  • stack – The interrupted stack frame.
class circuits.core.events.Started(component)

Bases: circuits.core.events.Event

Started Event

This Event is sent when a Component has started running.

Parameters:component (Component or Manager) – The component that was started
class circuits.core.events.Stopped(component)

Bases: circuits.core.events.Event

Stopped Event

This Event is sent when a Component has stopped running.

Parameters:component (Component or Manager) – The component that has stopped
class circuits.core.events.Success(*args, **kwargs)

Bases: circuits.core.events.DerivedEvent

Success Event

This Event is sent when all handlers (for a particular event) have been executed successfully, see Manager.

Parameters:event (Event) – The event that has completed.
class circuits.core.events.Unregister(component=None)

Bases: circuits.core.events.Event

Unregister Event

This Event ask for a Component to unregister from its Component or Manager.

class circuits.core.events.Unregistered(component, manager)

Bases: circuits.core.events.Event

Unregistered Event

This Event is sent when a Component has been unregistered from its Component or Manager.

class circuits.core.events.GenerateEvents(lock, max_wait)

Bases: circuits.core.events.Event

Generate events event

This event is sent by the circuits core. All components that generate timed events or events from external sources (e.g. data becoming available) should fire any pending events in their “generate_events” handler. The handler must either be a filter (preventing other handler from being called in the same iteration) or must invoke reduce_time_left() with parameter 0.

Parameters:max_wait – maximum time available for generating events.

Components that actually consume time waiting for events to be generated, thus suspending normal execution, must provide a method resume that interrupts waiting for events.

time_left

The time left for generating events. A value less than 0 indicates unlimited time. You should have only one component in your system (usually a poller component) that spends up to “time left” until it generates an event.

reduce_time_left(time_left)

Update the time left for generating events. This is typically used by event generators that currently don’t want to generate an event but know that they will within a certain time. By reducing the time left, they make sure that they are reinvoked when the time for generating the event has come (at the latest).

This method can only be used to reduce the time left. If the parameter is larger than the current value of time left, it is ignored.

If the time left is reduced to 0 and the event is currently being handled, the handler’s resume method is invoked.

Functions

none

circuits-2.1.0/docs/build/html/api/circuits_web_errors.html0000644000014400001440000003076212113366677023624 0ustar prologicusers circuits.web.errors – Errors — circuits 2.1.0 documentation

circuits.web.errors – Errors

Errors

This module implements a set of standard HTTP Errors.

Components

none

Events

class circuits.web.errors.HTTPError(request, response, code=None, **kwargs)

Bases: circuits.core.events.Event

An event for signaling an HTTP error

The constructor creates a new instance and modifies the response argument to reflect the error.

class circuits.web.errors.Forbidden(request, response, code=None, **kwargs)

Bases: circuits.web.errors.HTTPError

An event for signaling the HTTP Forbidden error

The constructor creates a new instance and modifies the response argument to reflect the error.

class circuits.web.errors.NotFound(request, response, code=None, **kwargs)

Bases: circuits.web.errors.HTTPError

An event for signaling the HTTP Not Fouond error

The constructor creates a new instance and modifies the response argument to reflect the error.

class circuits.web.errors.Redirect(request, response, urls, code=None)

Bases: circuits.web.errors.HTTPError

An event for signaling the HTTP Redirect response

The constructor creates a new instance and modifies the response argument to reflect a redirect response to the given url.

class circuits.web.errors.Unauthorized(request, response, code=None, **kwargs)

Bases: circuits.web.errors.HTTPError

An event for signaling the HTTP Unauthorized error

The constructor creates a new instance and modifies the response argument to reflect the error.

Functions

none

circuits-2.1.0/docs/build/html/api/circuits_web_wsgi.html0000644000014400001440000002467412113366700023251 0ustar prologicusers circuits.web.wsgi – WSGI Support — circuits 2.1.0 documentation

circuits.web.wsgi – WSGI Support

WSGI Components

This module implements WSGI Components.

Events

none

Components

class circuits.web.wsgi.Application(*args, **kwargs)

Bases: circuits.core.components.BaseComponent

initializes x; see x.__class__.__doc__ for signature

class circuits.web.wsgi.Gateway(*args, **kwargs)

Bases: circuits.core.components.BaseComponent

initializes x; see x.__class__.__doc__ for signature

Functions

none

circuits-2.1.0/docs/build/html/api/circuits_io.html0000644000014400001440000002016112113366674022047 0ustar prologicusers circuits.io – I/O Support — circuits 2.1.0 documentation

circuits.io – I/O Support

I/O Support

This package contains various I/O Components. Provided are a a generic File Component, StdIn, StdOut and StdErr components. Instances of StdIn, StdOUt and StdErr are also created by importing this package.

circuits-2.1.0/docs/build/html/api/circuits_web_servers.html0000644000014400001440000002746612113366700023773 0ustar prologicusers circuits.web.servers – Servers — circuits 2.1.0 documentation

circuits.web.servers – Servers

Web Servers

This module implements the several Web Server components.

Events

none

Components

class circuits.web.servers.BaseServer(bind, encoding='utf-8', secure=False, certfile=None, channel='web')

Bases: circuits.core.components.BaseComponent

Create a Base Web Server

Create a Base Web Server (HTTP) bound to the IP Address / Port or UNIX Socket specified by the ‘bind’ parameter.

Variables:server – Reference to underlying Server Component
Parameters:bind (Instance of int, list, tuple or str) – IP Address / Port or UNIX Socket to bind to.

The ‘bind’ parameter is quite flexible with what valid values it accepts.

If an int is passed, a TCPServer will be created. The Server will be bound to the Port given by the ‘bind’ argument and the bound interface will default (normally to “0.0.0.0”).

If a list or tuple is passed, a TCPServer will be created. The Server will be bound to the Port given by the 2nd item in the ‘bind’ argument and the bound interface will be the 1st item.

If a str is passed and it contains the ‘:’ character, this is assumed to be a request to bind to an IP Address / Port. A TCpServer will thus be created and the IP Address and Port will be determined by splitting the string given by the ‘bind’ argument.

Otherwise if a str is passed and it does not contain the ‘:’ character, a file path is assumed and a UNIXServer is created and bound to the file given by the ‘bind’ argument.

class circuits.web.servers.Server(bind, **kwargs)

Bases: circuits.web.servers.BaseServer

Create a Web Server

Create a Web Server (HTTP) complete with the default Dispatcher to parse requests and posted form data dispatching to appropriate Controller(s).

See: circuits.web.servers.BaseServer

Functions

none

circuits-2.1.0/docs/build/html/api/circuits_node_client.html0000644000014400001440000002157512113366676023737 0ustar prologicusers circuits.node.client – Client — circuits 2.1.0 documentation

circuits.node.client – Client

Client

...

Events

none

Components

class circuits.node.client.Client(host, port, channel='node')

Bases: circuits.core.components.BaseComponent

Client

...

Functions

none

circuits-2.1.0/docs/build/html/api/circuits_node_events.html0000644000014400001440000003113712113366676023760 0ustar prologicusers circuits.node.events – Events — circuits 2.1.0 documentation

circuits.node.events – Events

Events

...

Events

class circuits.node.events.Packet(*args, **kwargs)

Bases: circuits.core.events.Event

Packet Event

An Event is a message send to one or more channels. It is eventually dispatched to all components that have handlers for one of the channels and the event type.

All normal arguments and keyword arguments passed to the constructor of an event are passed on to the handler. When declaring a handler, its argument list must therefore match the arguments used for creating the event.

Every event has a name attribute that is used for matching the event with the handlers. By default, the name is the uncameled class name of the event.

Variables:
  • channels

    an optional attribute that may be set before firing the event. If defined (usually as a class variable), the attribute specifies the channels that the event should be delivered to as a tuple. This overrides the default behavior of sending the event to the firing component’s channel.

    When an event is fired, the value in this attribute is replaced for the instance with the channels that the event is actually sent to. This information may be used e.g. when the event is passed as a parameter to a handler.

  • value – this is a circuits.core.values.Value object that holds the results returned by the handlers invoked for the event.
  • success – if this optional attribute is set to True, an associated event EventSuccess (original name with “Success” appended) will automatically be fired when all handlers for the event have been invoked successfully.
  • success_channels – the success event is, by default, delivered to same channels as the successfully dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.
  • complete – if this optional attribute is set to True, an associated event EventComplete (original name with “Complete” appended) will automatically be fired when all handlers for the event and all events fired by these handlers (recursively) have been invoked successfully.
  • success_channels – the complete event is, by default, delivered to same channels as the initially dispatched event itself. This may be overridden by specifying an alternative list of destinations using this attribute.
class circuits.node.events.Remote(event, node, channel=None)

Bases: circuits.core.events.Event

Remote Event

...

Components

none

Functions

none

circuits-2.1.0/docs/build/html/api/circuits_web_dispatchers_dispatcher.html0000644000014400001440000002253612113366676027026 0ustar prologicusers circuits.web.dispatchers.dispatcher – Default Dispatcher — circuits 2.1.0 documentation

circuits.web.dispatchers.dispatcher – Default Dispatcher

Events

none

Components

class circuits.web.dispatchers.dispatcher.Dispatcher(**kwargs)

Bases: circuits.core.components.BaseComponent

Functions

none

circuits-2.1.0/docs/build/html/dev/0000755000014400001440000000000012113366740016644 5ustar prologicuserscircuits-2.1.0/docs/build/html/dev/processes.html0000644000014400001440000002403012113366702021535 0ustar prologicusers Development Processes — circuits 2.1.0 documentation

Development Processes

We document all our internal development processes here so you know exactly how we work and what to expect. If you find any issues or problems please let us know!

Software Development Life Cycle (SDLC)

We employ the use of the SCRUM Agile Process and use Pivotal Tracker to track our stories, bugs, chores and releases. If you wish to contribute to circuits, please famiilarize yourself with SCRUM and Pivotal Tracker.

Bug Reports

Feature Requests

Writing new Code

  • Write your code.

  • Use flake8 to ensure code quality.

  • Run the tests:

    $ tox
  • Ensure any new or modified code does not break existing unit tests.

  • Updated any relevant docstrings or documentatino.

Running the Tests

To run the tests you will need the following installed:

All of these can be instaleld via easy_isntall or pip.

Please also ensure that you you have all supported versions of Python that circuits supports installed in your local environment.

To run the tests:

$ tox
circuits-2.1.0/docs/build/html/dev/index.html0000644000014400001440000002046012113366701020640 0ustar prologicusers Developer Docs — circuits 2.1.0 documentation

Developer Docs

So, you’d like to contribute to circuits in some way? Got a bug report? Having problems running the examples? Having problems getting circuits working in your environment/platform?

Excellent. Here’s what you need to know.

circuits-2.1.0/docs/build/html/dev/introduction.html0000644000014400001440000001701312113366701022252 0ustar prologicusers Development Introduction — circuits 2.1.0 documentation

Development Introduction

Here’s how we do things in circuits...

Standards

We use the following coding standard:

Tools

We use the following tools to develop circuits and share code:

circuits-2.1.0/docs/build/html/dev/contributing.html0000644000014400001440000002204212113366701022236 0ustar prologicusers Contributing to circuits — circuits 2.1.0 documentation

Contributing to circuits

Here’s how you can contribute to circuits

Share your story

One of the best ways you can contribute to circuits is by using circuits. Share with us your story of how you’ve used circuits to solve a problem or create a new software solution using the circuits framework and library of components. See our Users Page.

Submitting Bug Reports

We welcome all bug reports. We do however prefer bug reports in a clear and concise form with repeatable steps. One of the best ways you can report a bug to us is by writing a unit test (//similar to the ones in our tests//) so that we can verify the bug, fix it and commit the fix along with the test.

To submit a bug report, please use:
http://bitbucket.org/prologic/circuits/issues

Writing new tests

We’re not perfect, and we’re still writing more tests to ensure quality code. If you’d like to help, please Fork circuits-dev, write more tests that cover more of our code base and submit a Pull Request. Many Thanks!

Adding New Features

If you’d like to see a new feature added to circutis, then we’d like to hear about it~ We would like to see some discussion around any new features as well as valid use-cases. To start the discussions off, please either:

circuits-2.1.0/docs/build/html/man/0000755000014400001440000000000012113366740016641 5ustar prologicuserscircuits-2.1.0/docs/build/html/man/tools.html0000644000014400001440000001346312113366702020674 0ustar prologicusers Tools — circuits 2.1.0 documentation

Tools

circuits-2.1.0/docs/build/html/man/events.html0000644000014400001440000004124712113366702021041 0ustar prologicusers Events — circuits 2.1.0 documentation

Events

Basic usage

Events are objects that are fired by the circuits framework implicitly (like the Started event used in the tutorial) or explicitly by components while handling some other event. Once fired, events are dispatched to the components that are interested in these events, i.e. that have registered themselves as handlers for these events.

Events are usually fired on one or more channels, allowing components to gather in “interest groups”. This is especially useful if you want to reuse basic components such as a TCP server. A TCP server component fires a Read event for every package of data that it receives. If we hadn’t the channels, it would be very difficult to separate the data from two different TCP connections. But using the channels, we can put one TCP server and all components interested in its events on one channel, and another TCP server and the components interested in this other TCP server’s events on another channel. Components are associated with a channel by setting their channel attribute (see API description for Component).

Besides having a name, events carry additional arbitrary information. This information is passed as arguments or keyword arguments to the constructor. It is then delivered to the handler function that must have exactly the same number of arguments and keyword arguments. Of course, as is usual in Python, you can also pass additional information by setting attributes of the event object, though this usage pattern is discouraged for events.

Events as result collectors

Apart from delivering information to handlers, event objects may also collect information. If a handler returns something that is not None, it is stored in the event’s value attribute. If a second (or any subsequent) handler invocation also returns a value, the values are stored as a list. Note that the value attribute is of type Value and you must access its property value to access the data stored (collected_information = event.value.value).

The collected information can be accessed by handlers in order to find out about any return values from the previously invoked handlers. More useful though, is the possibility to access the information after all handlers have been invoked. After all handlers have run successfully (i.e. no handler has thrown an error) circuits may generate an event that indicates the successful handling. This event has the name of the event just handled with “Success” appended. So if the event is called Identify then the success event is called IdentifySuccess. Success events aren’t delivered by default. If you want successful handling to be indicated for an event, you have to set the optional attribute success of this event to True.

The handler for a success event must be defined with two arguments. When invoked, the first argument is the event just having been handled successfully and the second argument is (as a convenience) what has been collected in event.value.value (note that the first argument may not be called event, for an explanation of this restriction as well as for an explanation why the method is called identify_success see the section on handlers).

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#!/usr/bin/env python

from circuits import Component, Event
from circuits.core.debugger import Debugger

class Identify(Event):
    """Identify Event"""
    success = True

class Pound(Component):

    def __init__(self):
        super(Pound, self).__init__()

        Debugger().register(self)
        Bob().register(self)
        Fred().register(self)

    def started(self, *args):
        self.fire(Identify())
        
    def identify_success(self, evt, result):
        if not isinstance(result, list):
            result = [result]
        print "In pound:"
        for name in result:
            print name

class Dog(Component):

    def identify(self):
        return self.__class__.__name__

class Bob(Dog):
    """Bob"""

class Fred(Dog):
    """Fred"""

Pound().run()

Download handler_returns.py

Advanced usage

Sometimes it may be necessary to take some action when all state changes triggered by an event are in effect. In this case it is not sufficient to wait for the completion of all handlers for this particular event. Rather, we also have to wait until all events that have been fired by those handlers have been processed (and again wait for the events fired by those events’ handlers, and so on). To support this scenario, circuits can fire a Complete event. The usage is similar to the previously described success event. Details can be found in the API description of circuits.core.events.Event.

circuits-2.1.0/docs/build/html/man/index.html0000644000014400001440000001545212113366702020643 0ustar prologicusers The circuits Framework — circuits 2.1.0 documentation
circuits-2.1.0/docs/build/html/man/components.html0000644000014400001440000002211212113366702021710 0ustar prologicusers Components — circuits 2.1.0 documentation

Components

The architectural concept of circuits is to encapsulate system functionality into discrete manageable and reusable units, called Components, that interact by sending and handling events that flow throughout the system.

Technically, a circuits Component is a Python class that inherits (directly or indirectly) from BaseComponent.

Components can be sub-classed like any other normal Python class, however components can also be composed of other components and it is natural to do so. These are called Complex Components. An example of a Complex Component within the circuits library is the circuits.web.servers.Server Component which is comprised of:

Note that there is no class or other technical means to mark a component as a complex component. Rather, all component instances in a circuits based application belong to some component tree (there may be several), with Complex Components being a subtree within that structure.

A Component is attached to the tree by registering with the parent and detached by un-registering itself (methods register() and unregister() of BaseComponent).

circuits-2.1.0/docs/build/html/man/values.html0000644000014400001440000001350212113366702021025 0ustar prologicusers Values — circuits 2.1.0 documentation

Values

circuits-2.1.0/docs/build/html/man/debugging.html0000644000014400001440000001344712113366702021471 0ustar prologicusers Debugging — circuits 2.1.0 documentation

Debugging

circuits-2.1.0/docs/build/html/man/handlers.html0000644000014400001440000003316712113366702021337 0ustar prologicusers Handlers — circuits 2.1.0 documentation

Handlers

Explicit Event Handlers

Event Handlers are methods of components that are invoked when a matching event is dispatched. These can be declared explicitly on a BaseComponent or Component or by using the handler() decorator.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#!/usr/bin/env python

from circuits.core.debugger import Debugger
from circuits.core.components import BaseComponent
from circuits.core.handlers import handler

class MyComponent(BaseComponent):

    def __init__(self):
        super(MyComponent, self).__init__()

        Debugger().register(self)

    @handler("started", channel="*")
    def _on_started(self, component):
        print "Start event detected"

MyComponent().run()

Download handler_annotation.py

The handler decorator on line 14 turned the method _on_started into an event handler for the event Started. Event names used to define handlers are the uncameled class names of the event. An event with a class name MySpecialEvent becomes “my_special_event” when referred to in a handler definition.

When defining explicit event handlers in this way, it’s convention to use the following pattern:

@handler("foo")
def _on_foo(self, ...):
   ...

This makes reading code clear and concise and obvious to the reader that the method is not part of the class’s public API (leading underscore as per Python convention) and that it is invoked for events of type SomeEvent.

The optional keyword argument “channel” can be used to attach the handler to a different channel than the component’s channel (as specified by the component’s channel attribute).

Handler methods must be declared with arguments and keyword arguments that match the arguments passed to the event upon its creation. Looking at the API for Started you’ll find that the component that has been started is passed as an argument to its constructor. Therefore, our handler method must declare one argument (Line 15).

The @handler(...) decorator accepts other keyword arguments that influence the behavior of the event handler and its invocation. Details can be found in the API description of handler().

Implicit Event Handlers

To make things easier for the developer when creating many event handlers and thus save on some typing, the Component can be used and subclassed instead which provides an implicit mechanism for creating event handlers.

Basically every method in the component is automatically and implicitly marked as an event handler with @handler(<name)) where <name>> is the name of each method applied.

The only exceptions are:

  • Methods are start with an underscore _.
  • Methods already marked explicitly with the @handler(...) decorator.

Note

You can specify that a method not be an event handler by marking it with @handler(False).

circuits-2.1.0/docs/build/html/man/manager.html0000644000014400001440000001360112113366702021140 0ustar prologicusers Manager — circuits 2.1.0 documentation

Manager

circuits-2.1.0/docs/build/html/web/0000755000014400001440000000000012113366740016643 5ustar prologicuserscircuits-2.1.0/docs/build/html/web/gettingstarted.html0000644000014400001440000002245512113366703022570 0ustar prologicusers Getting Started — circuits 2.1.0 documentation

Getting Started

Just like any application or system built with circuits, a circuits.web application follows the standard Component based design and structure whereby functionality is encapsulated in components. circuits.web itself is designed and built in this fashion. For example a circuits.web Server’s structure looks like this:

../_images/web.png

To illustrate the basic steps, we will demonstrate developing your classical “Hello World!” applications in a web-based way with circuits.web

To get started, we first import the necessary components:

from circutis.web import Server, Controller

Next we define our first Controller with a single Request Handler defined as our index. We simply return “Hello World!” as the response for our Request Handler.

class Root(Controller):

   def index(self):
      return "Hello World!"

This completes our simple web application which will respond with “Hello World!” when anyone accesses it.

Admittedly this is a stupidly simple web application! But circuits.web is very powerful and plays nice with other tools.

Now we need to run the application:

(Server(8000) + Root()).run()

That’s it! Navigate to: http://127.0.0.1:8000/ and see the result.

Here’s the complete code:

1
2
3
4
5
6
7
8
from circuits.web import Server, Controller

class Root(Controller):

   def index(self):
      return "Hello World!"

(Server(8000) + Root()).run()

Have fun!

circuits-2.1.0/docs/build/html/web/index.html0000644000014400001440000001425012113366703020641 0ustar prologicusers The circuits.web Framework — circuits 2.1.0 documentation

The circuits.web Framework

circuits-2.1.0/docs/build/html/web/basics.html0000644000014400001440000002615412113366703021004 0ustar prologicusers The Basics — circuits 2.1.0 documentation

The Basics

circuits.web is not a full stack web framework, rather it is more closely aligned with CherryPy and offers enough functionality to make quickly developing web applications easy and as flexible as possible. circuits.web does not provide features such as:

  • builtin Templating
  • builtin Database or ORM tools
  • etc

The functionality that circutis.web does provide ensures that circuits.web is fully HTTP/1.1 and WSGI/1.0 compliant and offers all the essential tools you need to build your web application or website.

A Stand Alone Server

A stand alone server consist of the components shown in section Getting Started. The process of handling an HTTP request starts with the TCPServer receiving a chunk of bytes. It emits those bytes as a Read event on the channel shared by the Server, HTTP, TCPServer and Dispatcher components (“web” by default).

The Read events are handled by the HTTP component. It collects the chunks until a complete HTTP request has been received. The request is then emitted as a Request event with an instance of classes Request and Response each as arguments. To complete the client’s request, a Response event must be fired. This is usually done by the HTTP component itself upon the receipt of a RequestSuccess event (automatically generated after all handlers for the Request event have been invoked successfully). In case of a problem, the Request event’s handlers should fire or return a HTTPError which is instead converted by the HTTP component to a Response event.

HTTP’s handler for the Response event retrieves the response information from the event and encodes it as required by HTTP (the protocol). It then fires one or more Write events which are handled by the TCPServer (and the response is thus sent to the client). More details can be found in circuits.web.http – HTTP Protocol.

A commonly used component for handling Request events is a dispatcher. [To be continued]

circuits-2.1.0/docs/build/html/web/introduction.html0000644000014400001440000003010112113366703022244 0ustar prologicusers Introduction — circuits 2.1.0 documentation

Introduction

circuits.web is a set of components for building high performance HTTP/1.1 and WSGI/1.0 compliant web applications. These components make it easy to rapidly develop rich, scalable web applications with minimal effort.

circuits.web borrows from

  • CherryPy
  • BaseHTTPServer (Python std. lib)
  • wsgiref (Python std. lib)

Overview

The circuits.web namespace contains the following exported components and events for convenience:

Events

Event Description
Request The Request Event
Response The Response Event
Stream The Stream Event

Servers

Server Description
BaseServer The Base Server (no Dispatcher)
Server The full Server + Dispatcher

Error Events

Error Description
HTTPError A generic HTTP Error Event
Forbidden A Forbidden (403) Event
NotFound A Not Found (404) Event
Redirect A Redirect (30x) Event

Dispatchers

Dispatcher Description
Static A Static File Dispatcher
Dispatcher The Default Dispatcher
VirtualHosts Virtual Hosts Dispatcher
XMLRPC XML-RPC Dispatcher
JSONRPC JSON-RPC Dispatcher

Other Components

Component Description
Logger Default Logger
Controller Request Handler Mapper
Sessions Default Sessions Handler

To start working with circuits.web one normally only needs to import from circuits.web, for example:

1
2
3
4
5
6
7
8
9
from circuits import Component
from circuits.web import BaseServer

class Root(Component):

    def request(self, request, response):
        return "Hello World!"

(BaseServer(8000) + Root()).run()

For further information regarding any of circuits.web’s components, events or other modules and functions refer to the API Documentation.

circuits-2.1.0/docs/build/html/pypitest.html0000644000014400001440000003167312113366702020645 0ustar prologicusers PyPi Test Page - Tentative Release — circuits 2.1.0 documentation

PyPi Test Page - Tentative Release

Overview

circuits is a Lightweight Event driven and Asynchronous Application Framework for the Python Programming Language with a strong Component Architecture.

circuits also includes a lightweight, high performance and scalable HTTP/WSGI compliant web server as well as various I/O and Networking components.

To take full advantage of circuits and its architecture, circuits encourages you to design your application in terms of loosely coupled components. Circuits has a very powerful message passing system that enables components to interact with each other via events. Applications written this way tend to be more maintainable, easier to develop and scale to complex systems.

circuits’ Loosely Coupled Component Architecture allows for a high level of Reuse and Scalability. Simpler components can be combined together to form Complex Components and provide higher level functionality and abstraction. Much of the circuits component library is designed and built this way.

Features

  • event driven
  • concurrency support
  • component architecture
  • asynchronous I/O components
  • no required external dependencies
  • full featured web framework (circuits.web)
  • coroutine based synchronization primitives

Requirements

Supported Platforms

  • Linux, FreeBSD, Mac OS X
  • Python 2.6, 2.7, 3.2, 3.3
  • pypy 2.0
Windows: We acknowledge that Windows exists and make reasonable efforts
to maintain compatibility. Unfortunately we cannot guarantee support at this time.

NB: We are working toward getting Windows supported.

Installation

The simplest and recommended way to install circuits is with pip. You may install the latest stable release from PyPI with pip:

> pip install circuits

If you do not have pip, you may use easy_install:

> easy_install circuits

Alternatively, you may download the source package from the PyPi Page or the Downloads page on the Website; extract it and install using:

> python setup.py install

License

circuits is licensed under the MIT License.

Feedback

We welcome any questions or feedback about bugs and suggestions on how to improve circuits. Let us know what you think about circuits. @pythoncircuits.

Do you have suggestions for improvement? Then please Create an Issue with details of what you would like to see. I’ll take a look at it and work with you to either incorporate the idea or find a better solution.

Community

There is also a small community of circuits enthusiasts that you may find on the #circuits IRC Channel on the FreeNode IRC Network and the Mailing List.

Release Notes - circuits-2.1.0 (<release>)

This release adds the following new features to circuits:

  • Python 3 support.
  • Windows support.
  • PyPy support.
  • IPv6 support.
  • Better WSGI support.
  • Fully documented examples.
  • Component Interface querying.

And many bug fixes!

circuits-2.1.0/docs/build/html/contributors.html0000644000014400001440000001455212113366701021515 0ustar prologicusers Contributors — circuits 2.1.0 documentation

Contributors

circuits was originally designed, written and primarily maintained by James Mills (http://prologic.shortcircuit.net.au/).

The following users and developers have contributed to circuits:

  • Alessio Deiana
  • Dariusz Suchojad
  • Tim Miller
  • Holger Krekel
  • Justin Giorgi
  • Edwin Marshall
  • Alex Mayfield
  • Toni Alatalo
  • Michael Lipp

Anyone not listed here (apologies as this list is taken directly from Mercurial’s churn command and output). We appreciate any and all contributions to circuits.

circuits-2.1.0/docs/build/html/start/0000755000014400001440000000000012113366740017223 5ustar prologicuserscircuits-2.1.0/docs/build/html/start/quick.html0000644000014400001440000001563512113366703021236 0ustar prologicusers Quick Start Guide — circuits 2.1.0 documentation

Quick Start Guide

The easiest way to download and install circuits is to use the pip command:

$ pip install circuits

Now that you have successfully downloaded and installed circuits, let’s test that circuits is properly installed and working.

First, let’s check the installed version:

>>> import circuits
>>> print circuits.__version__
2.1.0

Try some of the examples in the examples/ directory shipped with the distribution or check out some Applications using circuits

Have fun :)

circuits-2.1.0/docs/build/html/start/downloading.html0000644000014400001440000001647712113366703022434 0ustar prologicusers Downloading — circuits 2.1.0 documentation

Downloading

Latest Stable Release

The latest stable releases can be downloaded from the Downloads page (specifically the Tags tab).

Latest Development Source Code

We use Mercurial for source control and code sharing.

The latest development branch can be cloned using the following command:

$ hg clone https://bitbucket.org/prologic/circuits/

For further instructions on how to use Mercurial, please refer to the Mercurial Book.

circuits-2.1.0/docs/build/html/start/index.html0000644000014400001440000001604112113366703021221 0ustar prologicusers Getting Started — circuits 2.1.0 documentation circuits-2.1.0/docs/build/html/start/installing.html0000644000014400001440000001775612113366703022274 0ustar prologicusers Installing — circuits 2.1.0 documentation

Installing

Installing from a Source Package

If you have downloaded a source archive, this applies to you.

$ python setup.py install

For other installation options see:

$ python setup.py --help install

Installing from the Development Repository

If you have cloned the source code repository, this applies to you.

If you have cloned the development repository, it is recommended that you use setuptools and use the following command:

$ python setup.py develop

This will allow you to regularly update your copy of the circuits development repository by simply performing the following in the circuits working directory:

$ hg pull -u

Note

You do not need to reinstall if you have installed with setuptools via the circuits repository and used setuptools to install in “develop” mode.

circuits-2.1.0/docs/build/html/start/requirements.html0000644000014400001440000002001112113366703022625 0ustar prologicusers Requirements and Dependencies — circuits 2.1.0 documentation

Requirements and Dependencies

Supported Platforms:
 Linux, FreeBSD, Mac OS X, Windows
Supported Python Versions:
 2.6, 2.7, 3.2, 3.3
Supported pypy Versions:
 2.0

Other Optional Dependencies

These dependencies are not strictly required and only add additional features.

circuits-2.1.0/docs/build/html/faq.html0000644000014400001440000002024112113366702017520 0ustar prologicusers Frequently Asked Questions — circuits 2.1.0 documentation

Frequently Asked Questions

General

... What is circuits?
circuits is an event-driven framework with a high focus on Component architectures making your life as a software developer much easier. circuits allows you to write maintainable and scalable systems easily
... Can I write networking applications with circuits?
Yes absolutely. circuits comes with socket I/O components for tcp, udp and unix sockets with asynchronous polling implementations for select, poll, epoll and kqueue.
... Can I integrate circuits with a GUI library?
This is entirely possible. You will have to hook into the GUI’s main loop.
... What are the core concepts in circuits?
Components and Events. Components are maintainable reusable units of behavior that communicate with other components via a powerful message passing system.
... How would you compare circuits to Twisted?
Others have said that circuits is very elegant in terms of it’s usage. circuits’ component architecture allows you to define clear interfaces between components while maintaining a high level of scalability and maintainability.
... Can Components communicate with other processes?
Yes. circuits implements currently component bridging and nodes
... What platforms does circuits support?
circuits currently supports Linux, FreeBSD, OSX and Windows and is currently continually tested against Linux and Windows against Python versions 2.6, 2.7, 3.1 and 3.2
... Can circuits be used for concurrent or distributed programming?
Yes. We also have plans to build more distributed components into circuits making distributing computing with circuits very trivial.

Got more questions?

circuits-2.1.0/docs/build/html/_downloads/0000755000014400001440000000000012113366740020217 5ustar prologicuserscircuits-2.1.0/docs/build/html/_downloads/handler_annotation.py0000644000014400001440000000066212072034467024446 0ustar prologicusers#!/usr/bin/env python from circuits.core.debugger import Debugger from circuits.core.components import BaseComponent from circuits.core.handlers import handler class MyComponent(BaseComponent): def __init__(self): super(MyComponent, self).__init__() Debugger().register(self) @handler("started", channel="*") def _on_started(self, component): print "Start event detected" MyComponent().run() circuits-2.1.0/docs/build/html/_downloads/handler_returns.py0000644000014400001440000000142012072034467023767 0ustar prologicusers#!/usr/bin/env python from circuits import Component, Event from circuits.core.debugger import Debugger class Identify(Event): """Identify Event""" success = True class Pound(Component): def __init__(self): super(Pound, self).__init__() Debugger().register(self) Bob().register(self) Fred().register(self) def started(self, *args): self.fire(Identify()) def identify_success(self, evt, result): if not isinstance(result, list): result = [result] print "In pound:" for name in result: print name class Dog(Component): def identify(self): return self.__class__.__name__ class Bob(Dog): """Bob""" class Fred(Dog): """Fred""" Pound().run() circuits-2.1.0/docs/build/html/_downloads/simple_server.py0000644000014400001440000000115312072034467023452 0ustar prologicusers#!/usr/bin/env python from circuits import Component from circuits.net.sockets import TCPServer, Write class Server(Component): def __init__(self, host, port=8000): super(Server, self).__init__() self._clients = [] TCPServer((host, port)).register(self) def connect(self, sock, host, port): self._clients.append(sock) def disconnect(self, sock): self._clients.remove(sock) def read(self, sock, data): for client in self._clients: if not client == sock: self.fire(Write(client, data.strip())) Server("localhost").run() circuits-2.1.0/docs/build/html/_downloads/001.py0000644000014400001440000000011112072034467021064 0ustar prologicusers#!/usr/bin/env python from circuits import Component Component().run() circuits-2.1.0/docs/build/html/_downloads/002.py0000644000014400001440000000020112072034467021065 0ustar prologicusers#!/usr/bin/env python from circuits import Component class MyComponent(Component): """My Component""" MyComponent().run() circuits-2.1.0/docs/build/html/_downloads/003.py0000644000014400001440000000024712072034467021100 0ustar prologicusers#!/usr/bin/env python from circuits import Component class MyComponent(Component): def started(self, *args): print("Hello World!") MyComponent().run() circuits-2.1.0/docs/build/html/_downloads/004.py0000644000014400001440000000037412072034467021102 0ustar prologicusers#!/usr/bin/env python from circuits import Component class Bob(Component): def started(self, *args): print("Hello I'm Bob!") class Fred(Component): def started(self, *args): print("Hello I'm Fred!") (Bob() + Fred()).run() circuits-2.1.0/docs/build/html/_downloads/005.py0000644000014400001440000000077612072034467021111 0ustar prologicusers#!/usr/bin/env python from circuits import Component from circuits.tools import graph class Pound(Component): def __init__(self): super(Pound, self).__init__() self.bob = Bob().register(self) self.fred = Fred().register(self) def started(self, *args): print(graph(self.root)) class Bob(Component): def started(self, *args): print("Hello I'm Bob!") class Fred(Component): def started(self, *args): print("Hello I'm Fred!") Pound().run() circuits-2.1.0/docs/build/html/_downloads/006.py0000644000014400001440000000076512072034467021110 0ustar prologicusers#!/usr/bin/env python from circuits import Component, Event class Woof(Event): """Woof Event""" class Pound(Component): def __init__(self): super(Pound, self).__init__() self.bob = Bob().register(self) self.fred = Fred().register(self) def started(self, *args): self.fire(Woof()) class Dog(Component): def woof(self): print("Woof! I'm %s!" % self.name) class Bob(Dog): """Bob""" class Fred(Dog): """Fred""" Pound().run() circuits-2.1.0/docs/build/html/_downloads/007.py0000644000014400001440000000105212072034467021077 0ustar prologicusers#!/usr/bin/env python from circuits import Component, Event class Woof(Event): """Woof Event""" class Pound(Component): def __init__(self): super(Pound, self).__init__() self.bob = Bob().register(self) self.fred = Fred().register(self) def started(self, *args): self.fire(Woof(), self.bob) class Dog(Component): def woof(self): print("Woof! I'm %s!" % self.name) class Bob(Dog): """Bob""" channel = "bob" class Fred(Dog): """Fred""" channel = "fred" Pound().run() circuits-2.1.0/docs/build/html/_downloads/008.py0000644000014400001440000000103312072034467021077 0ustar prologicusers#!/usr/bin/env python from circuits import Component, Event class Bark(Event): """Bark Event""" class Pound(Component): def __init__(self): super(Pound, self).__init__() self.bob = Bob().register(self) self.fred = Fred().register(self) class Dog(Component): def started(self, *args): self.fire(Bark()) def bark(self): print("Woof! I'm %s!" % self.name) class Bob(Dog): """Bob""" channel = "bob" class Fred(Dog): """Fred""" channel = "fred" Pound().run() circuits-2.1.0/docs/build/html/_downloads/009.py0000644000014400001440000000102612072034467021102 0ustar prologicusers#!/usr/bin/env python from circuits import Component, Event class Bark(Event): """Bark Event""" class Pound(Component): def __init__(self): super(Pound, self).__init__() self.bob = Bob().register(self) self.fred = Fred().register(self) class Dog(Component): def started(self, *args): self.fire(Bark()) def bark(self): print("Woof! I'm %s!" % name) class Bob(Dog): """Bob""" channel = "bob" class Fred(Dog): """Fred""" channel = "fred" Pound().run() circuits-2.1.0/docs/build/html/.buildinfo0000644000014400001440000000024612113366704020044 0ustar prologicusers# Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. config: tags: circuits-2.1.0/docs/build/html/index.html0000644000014400001440000003016212113366702020063 0ustar prologicusers circuits 2.1.0 Documentation — circuits 2.1.0 documentation

circuits 2.1.0 Documentation

Release:2.1.0
Date:February 27, 2013

Overview

circuits is a Lightweight Event driven and Asynchronous Application Framework for the Python Programming Language with a strong Component Architecture.

circuits also includes a lightweight, high performance and scalable HTTP/WSGI compliant web server as well as various I/O and Networking components.

To take full advantage of circuits and its architecture, circuits encourages you to design your application in terms of loosely coupled components. Circuits has a very powerful message passing system that enables components to interact with each other via events. Applications written this way tend to be more maintainable, easier to develop and scale to complex systems.

circuits’ Loosely Coupled Component Architecture allows for a high level of Reuse and Scalability. Simpler components can be combined together to form Complex Components and provide higher level functionality and abstraction. Much of the circuits component library is designed and built this way.

Features

  • event driven
  • concurrency support
  • component architecture
  • asynchronous I/O components
  • no required external dependencies
  • full featured web framework (circuits.web)
  • coroutine based synchronization primitives

Requirements

Supported Platforms

  • Linux, FreeBSD, Mac OS X
  • Python 2.6, 2.7, 3.2, 3.3
  • pypy 2.0
Windows: We acknowledge that Windows exists and make reasonable efforts
to maintain compatibility. Unfortunately we cannot guarantee support at this time.

NB: We are working toward getting Windows supported.

Installation

The simplest and recommended way to install circuits is with pip. You may install the latest stable release from PyPI with pip:

> pip install circuits

If you do not have pip, you may use easy_install:

> easy_install circuits

Alternatively, you may download the source package from the PyPi Page or the Downloads page on the Website; extract it and install using:

> python setup.py install

License

circuits is licensed under the MIT License.

Feedback

We welcome any questions or feedback about bugs and suggestions on how to improve circuits. Let us know what you think about circuits. @pythoncircuits.

Do you have suggestions for improvement? Then please Create an Issue with details of what you would like to see. I’ll take a look at it and work with you to either incorporate the idea or find a better solution.

circuits-2.1.0/docs/build/html/_images/0000755000014400001440000000000012113366740017472 5ustar prologicuserscircuits-2.1.0/docs/build/html/_images/web.png0000644000014400001440000010364012072034467020763 0ustar prologicusersPNG  IHDRņbKGD IDATxwXT6{IW(t(DEKQO1%Qk99Q_$Xc1j""HQ#" RTPfX3#]=󻮹vyfc1B!9B!F#!BiB!Y \ zA   ]ee%jkk Ѐ0hjjա(**JBި`$DBEEE())Aii)JJJ |>"***PUU&TUU]]]6W^04418M!xt4!ANN>}B ??EEE(**G^^ɂKSUU***Ԅ"tttuuuAYY'|eee5ZZZכq%IeII PQQ!UVWW7(n_}󥖭CCC011 ,,,`aaKKFBCs@BBv؁SN [nùE!Bٳի1c >>r ]%K`޽Rnܸ6m" Tx{{ʕ+o!//C Aaa!&M[[[$''ܹsXj曷Z~{t͛}}}\p\G"aȐ̖/_΄B!qc3yyy`H$bϟg$΍7;0H{Z?`nݒ>--%&&c[Xp!BCCo߾xMMMc4O>Xx1/^ … qe޽WC(bӦMM.ƊEӧc۶mv{aҥRiu7 q >|>\k-Ngiilذ/^eM"k,i"LMMu6{%p---7n QVVd\v ]ut]‡  HJJK:bݍyրÆ C\\]۷^\044رc%8 5qXZZb„ */{GѣG 8ujkkq%i:Chh(Ν;-C!2&Y"3sHlҥŅiii1yyy<<V\;wrBڄa$2E[[111сk#+Ē%K0{l|رcב!ͨ`$27o̙`s6~:pl޼JPHd [DEEڵk4h{rb6lTL2Xƨ`$2- 1c>S]zgx9VZ[[[DEE᧟~B[^H͛7۷//_9s4{K=B:CFFكXnBBBu4BiT0.'##qQx<̙3˖-FzHg~@tt4l2|:!+*IUVVbϞ=HOOcccn*11aaa8~8|81estq)))8~8C!88s΅5!QHZDEE8}4*++c"00nnn DZTQQDFF… B߾}iӦɉ누ҩ`$VMM .]#** 000#0fR!)) •+WP__///bرpvv:&!p Fc<~ĥKP^^cccxzzbذa򂫫+J:Xqq1q5!11հD`` mmmBLHB)))v횤h˃*ggg8;;ޞ.҅HNNFrr2nݺCNN񁷷7annu\BIT0rrrpU#99)))PTT ''' 0!eHuu5222;wH Ĝ9xxx@SSԄ5PHHcxTTJJ !tYT0F|>At*,,,`ii ȞϟyyyǏ,dggӧD^z8TBigT0N둓ldgg#++ 999x1Z055.`ooBOOсyW.PRR"y(**B~~> >ϟK>077%$-,,`ee^zquҳ(pBNNlt|}}=󑟟<{ /_FDD! QTTB6 mmmIMMMBEEPTTopmauuuhL{IIdjԀ磮eee +**BOO055JKKQYY+V 00ƒBBlN"''޽{wިիq̜9?CK4;@ 'O  QVV@*z.& Q^^ _cǓ`Ǐ O?fO>A||< _Xңѧ!c޼y>}:OD:. \]]q-̚5 3gĜ9sE!=&\zgFuu5~G;\GΝ; @EEưaøD!= 0ҎB!>3T,q!55QWWu,B1v#̘1w]d IZ  ѣGѯ_?#BHG=GX !!!HJJH$+~g#BHG#!oÜ9s0|$$$`\lmm%K>@pppS$h4!o(113gDii)BCC1~x#Hј;w.q:!B:0F1|򂅅RRRXP@@RSS |g \"nz i̝;ꫯ.-C݋?8rD!}JϟpU|'T,ʘ? 9u$Bӎ|G?~<ƌ[naȐ!\"M8p 0|̝;gϦ;B[]҄4#==3fÇ{n̙3H "##CMM G'ב!KFBO? HJJb DJJ 0|p|D\". FB^SZZӧcXl^}r!###ouV!;;Xҥ.iB^q5̚5 B@@בH;JMM̙3ݻ3f:!t HH-[DJJ ݐ#1{l̚5 s̡b!xyyy={6cX;w ,*9ooo#B̢Fң>}NNN(((@||#Xcƌ'OE! FmTUUaɒ%2e M7oXPTTW_}+W ;;8rױ!SPH4 2ǏGDD555cnoٳ1w\L:ϟ?:!t(*I?www!99'O:wŋHHH=Μ9u,B0T0.ŋ4iV\O?077:AF4wŢEE!.MdN}}=.ٳgC^^Ga:)!߰d"44ً}***B0rJDEE5:N(bÆ 9r$<< {zjRBțF"SN8S|>455%?~3g"%%| ,YULBuA\&&&8|0 1Ǐ:t(Q !UȌLxPTT?Oɸ07nܠbȴy!-- _|:ڵ .\(((`٨8-!zL!C:Cdd$O??7|C}.1ݻwc͚5033Cff&D';Q IDAT"dVXoÔ2*L ? P(&''###,XC aBB\BBQ[[+U0/Q:Bi&;v/U,/ϖ~9X$]c 7nP(lP,/{g͚ 2"+`$JOO… s]]BCCڵkJ!͢]ҤpuuQWW9-i i_=©Sm0'x<\|\$)T0v!%%%^E$@Fkn4yɫ444UUU@II mچ*<  Ѐ/F#F޾|||PQQ>2TVVJڈ:TTTX 555(++Kh*++CCCCVCCCZZZ֖.n;}}}p98T0Ree%<;;YYYx $Eaaa!>}*URŌ~Ŏ69RT^^2ɇϥpyaaaB011 ajj sssXZZzh IWW^^<~(((ӧOQXX(i+CCF==F mmϤJJJ|1՟ 011!333FFFm!!1"33ْ0''x䉤WVV%z CCC۔C555(,,D^^~?ğ>}|`T!iee.< PFKׇCN *털X/=UQQ,,,$Eѯ_?pUp%%%@zz:222 ##Cr‡:,--aaa!)^illL'[t#}C\ ,wEѯ_?Ɔveu>jѷo_/t$d`D{._.yܿ`ii ggg888 NNNC8QSSwJCUUnnn<<<лwo#w 1ddd !!AHIIP(X\ 8% ʒvÇD'WWW"CdgP( (//%o&OO&/Cx7n )) uuu033СC1bƆ]H$­[8ܸqPWW1tPxxx\%U*++\~ x)OOO9~~~mh;!S ŋx"bccQ^^b[[[9$]^uu5n߾x\~'={KKK5 9r$Wt ::()) &i!//uTBMnnxvn޼ :tt \uuuADD"### 5j)))x׬...0a0h cvZ~Cdd$rssahh(9r$,--IH|yw444w}Izv/kkkqE8qOFYY{aԨQt`BXȸ8DFFɓx1  ёQQQ8q~w|x{{cĉ5j} sΡ~~~2e {=sV0&&&b޽8y$ム L'OBPRR;PTTT ((K.ڤG޽{,Zvćt>|'Oϟ:t7*|>vڅ{SLҥK jjj={H[AAA26??[nŁӧOҥKm0B"Oؿ?rrrkϏh;am w}/YAAA[!0ooocteǎƆ)((0/:q9s&cCe'ב(--eׯǧ}wXHmH$bgϞe#Gd/:&Z]0>}0FH=TTTYm@YF67{Q^^.5.\옲2SUUelͬ] sssc֭c_||r,=$%%Ç\Gb"HERWWܹUUUqKJsg=ى'ĉ1STTdӓm۶x())1+++b/fLII)))1 6~xsNV__),}6[n;v,366nz6AV|}}cgϞ=:Z%]YY˗#44f֭[ann= ,TUU!77(((#~߿555.\z-Z+WSU֭[ǃ"|}}\t pvvF\\[_wř3gPTTZVGիݻwcΜ9ܹsq5ڵkIlܸM65qFcڴiD޽1j( y&tuuQ\\,Zܼy055ERR ???TTT`̘1233%쬫B&hƍشi1`6nI maG ǪU 1cptUUݝӧOwJ67G@lx<sttdto'06ƍb }Woǧ]^PSS1֬Y=RĄ۳۷owCK{'Ndm3nݺܪenݺ`֭c1Y\\\iE";|aLKKc1MYm ;Rii)5kgC&?KKK0`Ho~竫c[la ]M77ndlXjڲ2qF6tP%[|y2^2СCSRRb b~i ܹsY^ 6lKHHh:~8eZZZLEE9;;itZ٤In h_x1cƼvEaaaLEEY֙ʴ;Ё3lΜ9.C\شR=1Ƙ*suumsxOFGG7{l_'NMۇڄbmvY˳( j&9Νcjjj,==4.{f}iq>fff֠A#/Zt?` 7ȵsNRÛ%QFI5F{AիWK ߾};6m$ H"HAwZѬMiGO]]O^G?7َ: vb{fkײA5jk/,,,I-S> a۽{7KJJbM.ߓ/IIIR3226o޼[w[iTjִo]ի]sO#FZӸ5|ܼU;`Rß={噯o˨`جY7W=x<ѣVehP1lĉa&L`jX򕔔XYYYY^石&Xii)_!x,&&SRRjpVlGW.300`u3MMM믿v::Ks텊J[L333Iuѣfjj*"WYY}&''')`TTTr{2>>/6mbXddd-ޤ`lM/l{WPVV:e>W[[X,[Q=JPP<WWW̜9Çի0}}}iiiR###(..F}}d\~~~3&&&VVVRw)-- KHH&v` BKKKjXcg:lӦMJJJ9c1y!Ǝ yyyCMMMjnGW???DEE>uǣδlFnnZQQ}%KgP|8wnܸD矈šC)y{ +++aǎ #GLۙjMkm{]---xzz… 4iqHWzYXXԵZ K}\6mD"Q$=z`:::,88}'ވr4%//z_k8{j666LGG>dfffLMMɋXvtF^凅199D{nG1ܹS2=ߓbk׮eؕ+Wc/{ȮZ.ۃilm{&UL:M< {400&=zԖKx1Zu2lڴ ľ}`ll/~m]NiiԷ쯾 HKKï;v`ƍۼ=:::xEk\\\^#..UjlEUUU=z<{ O;|;Go߾|kkkYN=¡C.] 3f;&S<#AKZ&mÇѿc.AGrCw+LR6uY9" 777dff";;wnTSStXXX4'`(((@DD\[-ۇW͛7m۶fnqj14h! 333x{{KM' bme}ݻw!ip 7ݮ۶mÞ={Yf8_`[icD"|R>sD"L>]2Rǚ5k͡ _xb0[kXxqz勥7X>c | |>L"5.++ 1n8Y ??V}`)۷cΝ N1qD(**‰'i R7nK0d\vMrM6aƍDPPjkkggg rرk֬?aĄ #22Rjnsjlܺum6ƍ!ʐk׮={vߔ7b=z4,--!T899!..---C6z҅yۼu;V~!p֭%-6m4#66SZ}ր}ƍqzϟzN'''wwwBOOeee|2ܹ\zU#ޓ>   !;!Ǝ+v7i^ɶ2@iӦ!)) III2}S";qLQQC/ўҒM4>|kNoF سgd)zlHHH9sPVV3gãS_SSOCIIS3BZvY,Z8{,츎DϨ?ׯGTT/P[[!x9^% IDAT.] ///XYY!99ӋE;ݻwoŠApر.;Ço>TTTtdFBzL^صk"##smpF+Wqܾ}FFF7=!!4s;{tWlkƦñcǠ9s`ҥ0`@{g$D8wك(#$$/ZtU|8y$ttt0|ښht+8rۇ 2K,ٳbҮ޸`+))o>҂*sPUU___aƌ:"ڭ`|U]]._p:u /^1j(ɱMUNzgϞ!&&шD^^Sv:jkk'O~Cqq1#G***\$S1!::111P(ȑ#1yd{:&A:`|P(Dll,.\/"55>|tpp ioՈCtt4 UUU 6 0almm qh@II @@@\\\ //uTB:Ǐ#yww|TU_2d&uM鴐PB * PPuEE]׵+ ,@BI!$gR&;͐IHB;IO&3w}s{9Μ9f¼y\ o=aUee%EVV233@[[LMMȵj <LTUUb1Xq2.T*aN=;;[[[$RS7xzzٙ}ϣ\UUPTT~AAA Epp0~ 3mR"΢[RAhvnnnpuuk JKK!QXXTP(;4h___HR6r""h eff";;hkkp;Ȧ4ƚPVV Qs+,,Daa!ܼ^3wskO0ƈK{% P^^ny{{{8::NNNpvv3[[[ƆDMMMAuu5*** Q^^rr/++*yf+a...˻`hꈢ"spttGGGSS?ذAP(zB.R(//Gee%JJJ C*B*rwwwF?vQVV% \"+QQQX%lll`gg$:9annݬ`ee5BPhllBB@]]P]]*Uk}bKy'irtt3#U}}=W/99z8vN";#`ii sssrM]P(Ԅp2zB:ajj34899daz%VQYY3.ihh:)Dj&fH$000`jj  @/,,,t\g+hSSSV;tDFT*477CTBTmmm\2Y;ַM;uttdst2zOTZIO؈nש$- ˀ&~6119uY{{; Zh* n( 䰩 uuuݾoM=׹ŋe˖!44T+wttdfqD:<<5lCC:::ʸ---]*rh[uժysNJ,C$qP(Қjaatnaeuttti]kllD]]Wg#4IXKK Z[[ֆ.~hhh@ss3LMMZ-;xzdZrxfff\= HyѴv7qF$&&b͚5x܇Oa` (sN\Rg0wށ\.}i&`ӦMx aF)aѲsNw}>YnX|9222i&ۡVaF02 Ì׮]Crr2VXw(J,c¼yvZ?'O;41X0 3JpwwɓeP8;;?GJJ %K ''fc #0(@D)zqAc|Ň~hpaFaQ`Ν Ahh(ߡ )###[X~=^{5aϞ=|0 KaF6ڵk v sss p"66W\;4X0 3ǣ˗/;IRܹΝCkk+Ə+WFaf۹s'LC8w~'$&&" jAdю% 0#Xcc#?OGwK.Ezz:' KaF={@Raҥ|#;;/&>|0ߡ1` #0? ..666|)))pssÜ9s0w\\vw,adr9?>^طoN8 alofTc #0O? ,;aiڴix" ٳM͌j,ad~,Y"P-CCC<&ſo1̐a #0/D3wNNfΜ|8<ߡ1̐` #0ccƌ|2oŋ!+V% 0#JŽ;zjj~03'N$ॗ^B]]ߡ1̠`5 0s!rYPFŋ#==߰}v>J;4P,adaoߎ)SLJPFccclذXz56n܈0673afq~w<|2H$lݺǜ9sd102 Ì ;w ^Cd2vލxdff"((/ k,adA<033;QoΜ9HII;v̰FaҥKHKKc]􈑑֭[ץɓ'a% 0#_ DGG s72 KaF:X~=ߡ0=dؿ?<72 KaF_UV qqq#3afSϰfH$azIWƈֿK,ad~w';472z% 0֭[@Ca<72z% 0ٳgqilڴP_~ Zwh(Faa_ٳg={!** SL12fڿq?~<ƀ QVVף"\p˖-㖫Ƙ1cuVBe `L:O=~',\t5<󈏏ŋC&3q`ngӦM60 s'lllP[[  PTđ2KGDDDPXjOQ1 W]1p,011!*Fh7^~/cII mXp!xNX8J^K?FZ+KK. mۆbvۿqܲJfBII _2KGu7[$N '''"b̴# B{xGyg7>f_̚5 ^3227 R<ގsa͚5`cnQdѢE s8E0Jx뭷wH0Rv;͚f~ /F F|ܹzlCCT:hhh222 ɰ{.IX,H$1`eeSSSK1 3Zz(J477CP{VMMM:Osy  ٳcccH$^M͌^| rsso{AZ[6mBV444J]lkkCSSS[[[ko``[XX033%smڝFKK P^^ TUUUUU hhh@KKB3X!aaa[[[Ύkoo[[[NNN=2RT\.Gee%jkkQWWZjvp 5HĕSX DkkkX[[okk 899Ɔ5BnKO cʕގJ\.Gqq1ni hhhRDccc[hIX 333666:ﻸ C>a CNN544䒲[3ng`nnKKKG/H```J6m(Mi[ZZ K2[YYjB/ ?Q3*++QXX" (//Gee%*++^#M45 H$\K)7Gvfbb5EN/ٱcǠP(0e_^kkkΉv644hmpqq# gggxxx:ce[KK .^t"%%iii\- AD]6СC>}:@.#77yyyGyy9JKKQVVƕ-:0[[[XYYuiDʓ!b]Ύi΢uR91U(P*Gss3[wLD"\\\WWW8;;񁷷mg #"#%%FVVrrrPUUf 777A*pww3jjjU܌IP^^J\dzK2Zk׮!++ ׯ_GFF ###xzzj%6T*V@g(**B~~>knpE~~~뮻0_ڸt.qÖB-y...6#//yyy\+lnn.rrr ###d2 ((3f̰ٷr9ŋhiiD"Axx8BCCP#v .Tdׯ_G[[HDGGcl0(QZZdv偈 H%&>>>h~Cff&222A[[D"  ,"Bff&D@TAAAZLpp0{D@nn.ҴlT*a„ 0a888v,aA}}==Gȑ#ͅ(DGGÃPGvܹsHHHsPXXP &`֬Y3g&L##6S*HJJٳgƍ044L&Cxx8tٙT*dggk%wI&aҤI]ww#ZFJJ ?'N̙3Ǝ%';QI«Iⓒpujx{{cԩŌ3w,aLV#118|0!3g"&&j MkC밲Œ30k,̛7R0^P(̙3tJ%H3F0VK.qgnaoo(`ԩ7nܨYYY8|0??pwwGll,L & ((}z.]… pI9s 1k,^& Zٳg?cϞ=())A@@0k,L6JJJpa>|GEMM &LKbٲe;Dx?jaaaI WWWCeZիWq$$$(,, f͚8̞=[/ZZZƅ w^ݻpttDll,\d2d@{{;℄ttt`ԩ{p!k +W}v/;v,.]Kח;сSNo\qaŊXjըG/---8xs` IDAT vލ#G^^^3g0c ztQPPx:t'N@}}=BBB0w\{h;!GD8}4~۷ =܃{&L`QFf:t*;/C=4J ~'|HJJBpp0VZKQJLttt̙3矱sN477cɒ%x1uTV"RÇ㧟~¾}ڊӧF\\k`DRܹs޽{q5xyyaw;v;({Xh|||AGGΞ=~ ?r9O5k`ɒ%}Fzgʊb1=CtbXss3ر W_}EJFK.ѣ>J͘1K;4fIMM͛7/WQee%ߡ ZM;͚5 Ņ^z%~:ߡ1zFRсhٲedbbBVVVn:m脱z)DF}UWW#ccc?%w{$J~)rCcFK.s=G666dbbB=]p; !?>8pT*ߡ1@uu5 LFl2JJJȄ6nH$J>VbPQQ_LLL͍vwHJcc#%{{{ wX(L| 7i|kj; BZj3LuttЮ]hfΜIW\F\¸grss#[[[jZII =cdhhHgϦCkJ>Srrr" zשsyZx1ФIԩS|ԣD$###z'رckݺutƍ>c$uuud200zhDcaΙ3g($$b1}'|O^^^$hƍxf\pf̘Ah޼yTPPwHZhڵdhhHӦM˗/3Bjھ};9;;}zH333ߟѣ| smmm׿Yug? cZjՈn@&M;cҤIˣGRPPYYYю;xE#++֖~GR|4"{$ȈЖ-[W3ϐ= ѣ$HhҤItu $Ji͚57dq TAQQQüfhhxÇ5EEED&{{{ڽ{7P~~>=M;ޡNT=p-Z|||H$P($z)77Wk#}W|nv˴!)) _|ߏ˗/.ڷo;hCiyBu]w@ZhBBBdرc=+CrrrrGyf|ts'z$8/))!KKKz(hٲev5(h%%%$;!w1211~Zo􈍍%@@O\GGw(Zb1;ϯ۵kM:,--I$Qxx8}:ߗiPkk+ӧvj@sܟ'& 7oeddeHDTYY9---G?l7[XWWs:nWRui֗ŷJJ=6r_ 'OɐNw_~}}=Yfqĉ ҦMhڴi::'}Yv˖-ubd``]'@SO/L , HthZ^y.%%%9-\?ӦMhBBBOi'T:jjzhzӲaccC= ^ @6l@/"ڰaCu=)+wZ~PPPm۶׿{!v7n?mmm3gΤM6Qll,999Q``^&DDׯ_'SSSڻwo7$FrxKO/}p y,1|ZjaQ_w@*ا~JhڵZ>>~-Ktg|Օy۾Koz3(<<PJJ8tuBל"{vMss3Y[[w}kC!55 )--PXv-0ڶm]|ں]>>>?vttO(!!A5~}]O_@z133o8plB -ZhٲeJ?@۶m#Ok=OPyW)44tP7) ӛ]+|$\[P%nNIwWS/>M}N̙C=wCPP(~Pka{Wh޼yd``@~~~Zύ!@迢M<_gdgguڷٳ_.]"hP(V\m˗ӢEc=w:555њ5kАKDD"M6.T,X@fff]F ݜDW뀮_ӗr'_R*TWWG رc:_~zS&сn255%//.#'OLFFF]ܸq^'999.]4hػw/ B^Gfi۾t}ٳ zVV[g ~K: a׮]C{{;BBBS\\7|S1;;;֖{ի󃝝ֲdHOOײotomuEd2xyyz۷oGO>ŋQSSZ=W^^mp||1蒒0qD׿/ԩS8y$;C,.\ lݺ˺4n빓YOVcllRx0}.߶mmۆ\p7nwߍ_~K,Gnn.Ν @Zϧ׷K=bgg___ddd]-#!!cǎm\|z9¤IpٳCMBnnnx'kq#oW>3BoiرcЀh?C{GN8AhA.oAh̘1ZEFF\=Y pBSLM\=imm%kkkDT[[sHMDB?ew m۶a ^yyyKL-&&Fk]~o}]O_JoOd2I$^-[QQAbBCCu>Kdjj%nWgF&;3hhĉ]ݪo}u-S. fv'/Ο?a¨/K>pttĖ-[P\\o| ?,,,P__uuuu˲CD>000ٳg5H$5كZXD2o6̐5Tccc\TTTٙ0 OwǏʝ%<<^>m8*++vypS\_[011֭[ FVVBvv6,|Gtހo`ܸqAaaaӛu8T3g ::0]\\;%`8HuމDDDڵkwu=})+-immEff&<<ۯӢ=4/kFsjF4kF[Nk9(?{/-\PEE@n/B9nm!yzz8 Ņ Shh^4呡aF w$HhΝ|͛Ls/2/c l2W.Stߌ.VOڴis  =cyyy$J{=PSg:P`8iŊ1c͛};}qUOINw^>M}ؗuGRL&{O[{PRRBz1R/?//ۛT*܊ӧOךgyo,O5Kosך5k7/L/&Xs7|o65}?===^gy\]]izQVXe?&{{{*..;-kFFFҺuW_~ 9g#Q5=k&OL.{zz[V[~lB|rzº|O<ꫴa;v, ÃPddVnGTr9s&4}truu MoNC2H,SffoFkH}իrppzL_{s80MnJkQZпo"9?O$ I*ҟg_P_U(zj%;{z_jK?~ '''CbF~ K._|՟s4ɓֆ1 /v܉?Oذa!n}}=&MH#Gzȶ0?~ ,SO={ݠ @]v:G1̝ڶm-[M6dp1H$;?#!1ijjO<|/R;`eeC&L@rrna:۶mΝ|n Y{ ٳg/|Ìmmm㏓@ >pxB6l \̓addggfΜI"ok,H+V @@N Ȟg} כ!tE7nYYYriɑ#G͍ ####;wn쇚J^{ iѢEwH(w^!:~x_7"F?D?34443m޼Ԕ6nH|5'|BbbbO?e-3^ TJ4|;ITWWoM$hʕtȑaUWWG_~%pyϯ: 0j?V\I&&&deeEO=3DiϞ=GJ[laG@VѣG&kkkK?ZpL  -[Pnn.ߡ /)**T*^{ a8tZr%bŴrJ:yngN_555oW_!##cƌҥKtR3:::pI/ؽ{70w\!xmmm8|0vڅ{ ;w.0n8`!P(p1СCχ~w} ;!o=1n8,Z .DHH1C 'No} QQQXf ~XYY 6G]¨AD8{,~())Ahh(-[{000;LZ[[q)޽wFuu5&NKbٲeJ|8j8x >,c3gN oood@{{;._'O8s j5s"<<0y9޷o݋B`ѢE?> `8v݋x( DEEa…Xx1|}}u6a쌈D gٳ1c vA=EDHKKÇqhkkĉl2{,ISG||<?F899!** 'OFtt4Ǝ Pw ABBΝ;ӧOŋhii'iӦ JH{b߾}r LLLX"""aN8ǏڵkD1c.\ qa 8|0>SN !!!Add$&NN_DTʕ+8PTHIIsﵴbƍØ1cpؘ~+Wd\t 044Dpp0bbb0i$L4Cee%N<%YYY077ĉL0|tсk׮!11p`dd̘1ӦMCTTLLLx%ֆ=zgΜARR`oo(DEEa̘1 3(Bjj*K.ATј2e fΜeXQQΞ=$''#%%   Dxx8p]w?iiiAVVpU.A,**HRc̘1ĉaaas#OYY;g… o;%IDATz*T*\]]1aDDD 44AAA`]Rq5\rt`ee#22SLALL LMMKLr$$$ !!{{{!,, !!! L&%QRdee!-- )))HMMիW ccc3QQQ`-!//Ou*%%%%%HǐMQ\\dff"33DQQj5B!d2Ǝ˵3666|?*HLLDRR "."00dJl`?477#77HOOGzz:^T* ,,K#""秷,aHMMEjjVptt|}} LL888hoo\.GQQldgg#'' %ݡ E@@tKL(JX,<==usvv듪*TVV(((@QQQXX2tttlmmoooV~Bבk׮!-- (--Bxzz>>>񁷷74j QRR|"//999ͅ\.pEpp0 D%DV#??K䨠dE"\]] Tݷ=`gg[[[bUWqP]]*TTTEEE(++Cqq1***VL&;;;3RjGQQ PXXbq˛sqNNNpvv=`cckkkH$X[[s%@RZVWWZԠ娨\.\.GeeceeT OOOxyyq=<< @\򓗗\~II 4郱1gggre666_>hnnFuu5jjjP]]eV^^rTTTp311PwN}||FDk0򠭭 (--Eqq1JJJƍ\Raff[[[ b055%! a``DzsMMMZ;v ---hhhB@ss3 vmb8:: pqq;ܸe?R3ZrC.ƍ(--Eee%***P^^ݯӹ+++.466b1D",,,  !H`ll 333@ MEWy\;\___[[-҂V444hmmĖ. B...pttkg'''ں_332)Jp Tyy9P^^R;֙%DjʋD"H$)`bbsss7Vnm0j;Zhii777---\x:pvv \]] 777899A*yX@KXMMV]MBW__&477PTPThllZ_CCVzk!444䦭055X,`jj XXXpSsiggN1#ֹ+JJT* P*hnnkؙD"&H$BXXXpswnܷX,JRŮF뾦j%tJK6omn:itn$ D"\맮ёKaaaaKaaaa`aaCKPIENDB`circuits-2.1.0/docs/build/html/_images/graphviz-fa9bbccfbcc0c44bc0636e85a3c610dc406600cf.png.map0000644000014400001440000000003512113365276030573 0ustar prologicusers circuits-2.1.0/docs/build/html/_images/graphviz-fa9bbccfbcc0c44bc0636e85a3c610dc406600cf.png0000644000014400001440000002533212113365276030026 0ustar prologicusersPNG  IHDR xZbKGD IDATxyTS׾ǿ$L *ʨPu3]S'k]z_뽭jlU-hU&(~\EINY39{[`0ǵaY0`0|0LFRDee%J%4  uTUUA~DJ&0ӰPEEEd())Gc}`Ĉ:t(FѣGcԨQ{ipVō7p\~׮]Cnn.`РA>|8twC>Ӷ(++Ý;wp]ܹsu***`kk#88&Lܣaa+d( 88cƌ]oq5ݔJoooK@dd$ǵ3 #Rp9̙3x1HDDDˋkFAZZ/BRfBTT`eeŵn 3 P(X$$$={6&MaÆq-[QWW+W !!111Ά'Ν(L8<{0"D|78~8`ԩ̙3ѫW/233K.ҥK1h uit'O`ǎصk0vX,[ ,D"Z^'//;ww}DDD`ժU7o+}tbtҺuH$Q^Oeffr- ~7ox>>8qΟ?L9gΜZõk=rppok9 QUUEK,!+++ӟD\K2[اOQXXɓ'7n!C0b{ԩSkA.믿6"44}ABBz͵$ ̙۷ r~~\Kbp̕+W0m4l޼6lZYLᅬݻw###}1cHIIApp0r̆ooFPPi8q4߼<[YY=34ڋglZa4 ݻgH6 JN5VV;>GkyA>mJmkk{h|3 D6^z7%mCK ՚! DkqF \mF7 A.4nEl{SмYjMstHRehӈT*ELL Rz xZk:رcGA(b/o,iWun: =.B!C7G}dX!PHDm ynٮǡ:ZFHHgű4ztI$ ;lݺjiѳ=#J񼫍͵Vk KW_UUU/bVx~{ywży󐒒bßzҴNkmj5ζ,0}ڵ fCe6WOjX|9?L2kI  "]8x ?p-`%߱޽{l2̚5 ۶m;"p#** ;wDll,3V`%?M6!22{쁋 גF&11K,@ 1n8%-.^<1vBcc#ײFWƔ)S f~=RIk׮%>Oty%1 D]]}$JՕǵ$ܹsMF_faۛhӦMlxL={ Ir-e۷/ʕ+\˲HXCh'v>+Vѿ1ݻwѣUvZۗky 3.oCii)"##ul0ܑ`޽رcl2'b1,f@ٳسgܹs1g6, HOOG\\bccqM`x0tPu+iR3g &&OFuu5^|EL2;v,B!2-2\p8{,d2 (̝;cǎe fFIII8s qc„ @HHXY pu/HJJ­[`ccqaҤI9s&#`aBJKKqy$&&… ða1c`R.)))۷q5\~ׯ_GII K/!""Ǐ-r{48Ǹ~v***`ee///a󃟟̵lhPXX|ܹswݻw믿VVV|dd=z|>_gDprroggkkg ^[.j[ogP*\.GUUJ%JKKQYY~xzz{6cf݄Caɒ%عs'B!?~2]]] Zg򨭭Z $෡ E"sf+>}?^ wwwa (..ƨQ/Z3f N8aahZL4 %%%HMMH$ZdDFF/ի0 ;._Ca@XX>lذ\aVҰ`_|֬Yõ1s0ӰP #06Fa |rX[[cfm={`طor]_̙38x13c _WFvv6r]UO,4;7r-Cc„ h4|2lll4,R 0gϞO߿@?ɵF'\׃Yjo>4 8p W_!..k9NJž={b $$$t!#z-;v oU ѣGc͚5غu+r JBpp0pX[[s-'4Z!99kIΝ;e02+=8tP2 >|8>slݺIII\a +i1ǎW^ZXp!zni)2 Xp!oεP(#!!p00C\zvvv\K2:׮]Chh(3rm4̐͛7֭[8rH0 Ɩ-[yf\rk96`% 3ܹs6mv܉+Vp-Ǥf̘LffDii)0i$߿k9PVV7=r-'fBcc#^}U8::v϶pvvƁ;vp-4̄O>8|p1<<6m;#۷os- V=1.]'O?ڵkchZDFF όfSYY@9qqq(,,D@@Ν;wr-;z1ZEtgj<<<{nڵ Zwip_x8p M fo+W"//k9 gcܸqظq#>5;v, +0j=駟X_z X_|rz4zWFEE8 CO۷/ɓ'ӣa% o>,]'OČ3cq,_'ODFF<<<#aaB1zhضmr,=}ERR+q3 QWWc/^dy]֭[ {g\q6 "??GeEF> q8XIÀd2xyy=7?..QQQ8t,X`zaݔҥKy&2J8;;sJdĉ6mu>|+V7`a`B,[ O~WD"| @th44a>|8p-[rem6""ھ}; @Æ X]ښ'@@QQQdooO+5[n%PHSL!+++y[YYѣG`q ]YѠqqq 7aaaptt矩x<"`aJ%~g466>3ׯ_?~u_| BCCQYY։@YHHHFiqYCC?~P| s<~#Fƍjj[Gܹs@akĦ G!++T5'Nݻw]Ν33.hjIc%K@.ϔ-+WDZZ|}}[]#>>ބʺ?4HJJ Je{B"X]&007oĆ Z,544 &&U 3.kMӧ#;;gBZ[nErr2[,uTVVQ 3.rq~ D"۷Ͻ0Ǐݻw <޿P(dU¾=oȑ#uy<"""w^sg?W_œ'OtaY$ rrPպnP(u`kk # J!JuZgaʕWqP'''HRH$nχŕ4>Dqq1=z\*ųT*E^ 777߷z /4h2 Ñ#G믣 EQQJJJPXX g>24b{\]]777 A5RܸqBvv6u`kk; Mq~t%&wrrP(.m'''5556Kuu4UTT(,,DAAN@ A0l0AAA}n0ոy&ӑ\ǐ!CWWWxxxW^ASޑJ )u'fJ RBЕZ}0|p/qq̛7!kkk3ݻ(//ǃ^x ?~<ƌ@&81 VW")) ϟ˗V1d@ Y 337nM騫È#DFFёkfO}}=.]ɸr T*t$ ]TT #-- iiix0cرLΝC||O$ɌQ*tQZhIRqQtt4rqBEEEGGӄ ښhܹ7PII ̆b?={6ۓ5,4iFVVVN{졊 cxe˖H$";;;Zh%&&r-h4W^ylllH$ҥKT[[˵iRTT)SPRRAD1E&oMBɓ\K0UUUyfDNQ(m6ruu%HD~aKs2 ZM7ne3gtIC?rssYYYQddE4&766Ү]O>$Ji֭RPT??$Jٙv:l4brtt__\D._;;wZNd2:u*xliiirrroc=n~ ]_} IDATMVipڳwG cym/_qaoòQM< nnn(++C]]Qt?}@:`M:{ۣ?ÔiB^z-^zh7^|ԕso5Hkasdjk1J-e1ˌ3wp]1h#33S7i-^Kk:lӏygʶFdffeϙ?<==qi kZeDKl`{ ==f2ZYfAV4Z9j~ im^knG"o={uuu9ss˞3 ŋc߾}Ff*Q̙!!!F3f`Ϟ=Fa.:նg كٳgO>/|!,ݿ֍x+oibtT>鷶]WtBA&$%%B!ݼyh1=v흿,h["==A_u˖-c'zqN{fӞ;kd8o6G7xƌcq6hO/"HHf擡ihh6?Ah5ZCҢEGZy}OxWik6Ύ~j[70h^!xwlmC1c6iҥf,mFuI$_b0a oŋdooʕ+m׮M5eč7.0?9::󒱈#kkkڰa,˂h4~z zWرcdkkK .dŚ!v"@@˖-b=q`H\.iӦ赍ݻ7F~К5kʊ>#HMM%2d]tk9V_LJ<==쩫9jEɡѣG=_br Sǭ0EEEyZwjjjt&M>JKK;}^> >O'N&eeezj4uT*,,ZRڵR) 4<VK ///rrr{v*N?IMMxxbzAgbA]]}$JՕve1%"Zt)x< %8N>MhT\\鴺9B>>>dkkKo&eggw%IF3yzzmڴˣ~s۷i֬Y^|E:|0 ؈i̘1̙Cwry3ih޼yl.LRb1mذ ˗iӓnJ=ZVѣGuV >O ,W,}jBhСuV***2dnJӤI㑋 }TYYɵ4 w%TJf̘AG!Jŵ4CRѡCh$W^{ujT0TnݢS߾}ښNJ]KuGT*I"@ 9sPll,s-$j:z(͙3I$zWѣ 1i r:|0-Z$ B3g;v̨S:Xhhhӧq9sUUUx1gL2F2yׂ\SXXD3fɓ!Lˤќ{.$FBPPF@+zh p-ܸq7n@jj****`oo & <<3fLC1Z%;;)))HNNFrr2#;;iii7V ///&.86ܻw--- UUUW7 0nnnɊ(**BAAp= ++ yyy1zh5 B${ HKK{B+**D"+<<A}}=@(<DwcH$D"A>}www]IXޚ 5  =44 F``0:3 !x8IENDB`circuits-2.1.0/docs/build/html/_static/0000755000014400001440000000000012113366740017514 5ustar prologicuserscircuits-2.1.0/docs/build/html/_static/plus.png0000644000014400001440000000030712062603403021176 0ustar prologicusersPNG  IHDR &q pHYs  tIME 1l9tEXtComment̖RIDATcz(BpipPc |IENDB`circuits-2.1.0/docs/build/html/_static/basic.css0000644000014400001440000002041712113366704021313 0ustar prologicusers/* * basic.css * ~~~~~~~~~ * * Sphinx stylesheet -- basic theme. * * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ /* -- main layout ----------------------------------------------------------- */ div.clearer { clear: both; } /* -- relbar ---------------------------------------------------------------- */ div.related { width: 100%; font-size: 90%; } div.related h3 { display: none; } div.related ul { margin: 0; padding: 0 0 0 10px; list-style: none; } div.related li { display: inline; } div.related li.right { float: right; margin-right: 5px; } /* -- sidebar --------------------------------------------------------------- */ div.sphinxsidebarwrapper { padding: 10px 5px 0 10px; } div.sphinxsidebar { float: left; width: 230px; margin-left: -100%; font-size: 90%; } div.sphinxsidebar ul { list-style: none; } div.sphinxsidebar ul ul, div.sphinxsidebar ul.want-points { margin-left: 20px; list-style: square; } div.sphinxsidebar ul ul { margin-top: 0; margin-bottom: 0; } div.sphinxsidebar form { margin-top: 10px; } div.sphinxsidebar input { border: 1px solid #98dbcc; font-family: sans-serif; font-size: 1em; } div.sphinxsidebar #searchbox input[type="text"] { width: 170px; } div.sphinxsidebar #searchbox input[type="submit"] { width: 30px; } img { border: 0; } /* -- search page ----------------------------------------------------------- */ ul.search { margin: 10px 0 0 20px; padding: 0; } ul.search li { padding: 5px 0 5px 20px; background-image: url(file.png); background-repeat: no-repeat; background-position: 0 7px; } ul.search li a { font-weight: bold; } ul.search li div.context { color: #888; margin: 2px 0 0 30px; text-align: left; } ul.keywordmatches li.goodmatch a { font-weight: bold; } /* -- index page ------------------------------------------------------------ */ table.contentstable { width: 90%; } table.contentstable p.biglink { line-height: 150%; } a.biglink { font-size: 1.3em; } span.linkdescr { font-style: italic; padding-top: 5px; font-size: 90%; } /* -- general index --------------------------------------------------------- */ table.indextable { width: 100%; } table.indextable td { text-align: left; vertical-align: top; } table.indextable dl, table.indextable dd { margin-top: 0; margin-bottom: 0; } table.indextable tr.pcap { height: 10px; } table.indextable tr.cap { margin-top: 10px; background-color: #f2f2f2; } img.toggler { margin-right: 3px; margin-top: 3px; cursor: pointer; } div.modindex-jumpbox { border-top: 1px solid #ddd; border-bottom: 1px solid #ddd; margin: 1em 0 1em 0; padding: 0.4em; } div.genindex-jumpbox { border-top: 1px solid #ddd; border-bottom: 1px solid #ddd; margin: 1em 0 1em 0; padding: 0.4em; } /* -- general body styles --------------------------------------------------- */ a.headerlink { visibility: hidden; } h1:hover > a.headerlink, h2:hover > a.headerlink, h3:hover > a.headerlink, h4:hover > a.headerlink, h5:hover > a.headerlink, h6:hover > a.headerlink, dt:hover > a.headerlink { visibility: visible; } div.body p.caption { text-align: inherit; } div.body td { text-align: left; } .field-list ul { padding-left: 1em; } .first { margin-top: 0 !important; } p.rubric { margin-top: 30px; font-weight: bold; } img.align-left, .figure.align-left, object.align-left { clear: left; float: left; margin-right: 1em; } img.align-right, .figure.align-right, object.align-right { clear: right; float: right; margin-left: 1em; } img.align-center, .figure.align-center, object.align-center { display: block; margin-left: auto; margin-right: auto; } .align-left { text-align: left; } .align-center { text-align: center; } .align-right { text-align: right; } /* -- sidebars -------------------------------------------------------------- */ div.sidebar { margin: 0 0 0.5em 1em; border: 1px solid #ddb; padding: 7px 7px 0 7px; background-color: #ffe; width: 40%; float: right; } p.sidebar-title { font-weight: bold; } /* -- topics ---------------------------------------------------------------- */ div.topic { border: 1px solid #ccc; padding: 7px 7px 0 7px; margin: 10px 0 10px 0; } p.topic-title { font-size: 1.1em; font-weight: bold; margin-top: 10px; } /* -- admonitions ----------------------------------------------------------- */ div.admonition { margin-top: 10px; margin-bottom: 10px; padding: 7px; } div.admonition dt { font-weight: bold; } div.admonition dl { margin-bottom: 0; } p.admonition-title { margin: 0px 10px 5px 0px; font-weight: bold; } div.body p.centered { text-align: center; margin-top: 25px; } /* -- tables ---------------------------------------------------------------- */ table.docutils { border: 0; border-collapse: collapse; } table.docutils td, table.docutils th { padding: 1px 8px 1px 5px; border-top: 0; border-left: 0; border-right: 0; border-bottom: 1px solid #aaa; } table.field-list td, table.field-list th { border: 0 !important; } table.footnote td, table.footnote th { border: 0 !important; } th { text-align: left; padding-right: 5px; } table.citation { border-left: solid 1px gray; margin-left: 1px; } table.citation td { border-bottom: none; } /* -- other body styles ----------------------------------------------------- */ ol.arabic { list-style: decimal; } ol.loweralpha { list-style: lower-alpha; } ol.upperalpha { list-style: upper-alpha; } ol.lowerroman { list-style: lower-roman; } ol.upperroman { list-style: upper-roman; } dl { margin-bottom: 15px; } dd p { margin-top: 0px; } dd ul, dd table { margin-bottom: 10px; } dd { margin-top: 3px; margin-bottom: 10px; margin-left: 30px; } dt:target, .highlighted { background-color: #fbe54e; } dl.glossary dt { font-weight: bold; font-size: 1.1em; } .field-list ul { margin: 0; padding-left: 1em; } .field-list p { margin: 0; } .refcount { color: #060; } .optional { font-size: 1.3em; } .versionmodified { font-style: italic; } .system-message { background-color: #fda; padding: 5px; border: 3px solid red; } .footnote:target { background-color: #ffa; } .line-block { display: block; margin-top: 1em; margin-bottom: 1em; } .line-block .line-block { margin-top: 0; margin-bottom: 0; margin-left: 1.5em; } .guilabel, .menuselection { font-family: sans-serif; } .accelerator { text-decoration: underline; } .classifier { font-style: oblique; } abbr, acronym { border-bottom: dotted 1px; cursor: help; } /* -- code displays --------------------------------------------------------- */ pre { overflow: auto; overflow-y: hidden; /* fixes display issues on Chrome browsers */ } td.linenos pre { padding: 5px 0px; border: 0; background-color: transparent; color: #aaa; } table.highlighttable { margin-left: 0.5em; } table.highlighttable td { padding: 0 0.5em 0 0.5em; } tt.descname { background-color: transparent; font-weight: bold; font-size: 1.2em; } tt.descclassname { background-color: transparent; } tt.xref, a tt { background-color: transparent; font-weight: bold; } h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt { background-color: transparent; } .viewcode-link { float: right; } .viewcode-back { float: right; font-family: sans-serif; } div.viewcode-block:target { margin: -1px -10px; padding: 0 10px; } /* -- math display ---------------------------------------------------------- */ img.math { vertical-align: middle; } div.body div.math p { text-align: center; } span.eqno { float: right; } /* -- printout stylesheet --------------------------------------------------- */ @media print { div.document, div.documentwrapper, div.bodywrapper { margin: 0 !important; width: 100%; } div.sphinxsidebar, div.related, div.footer, #top-link { display: none; } }circuits-2.1.0/docs/build/html/_static/ajax-loader.gif0000644000014400001440000000124112062603403022361 0ustar prologicusersGIF89aU|NU|l!Created with ajaxload.info! ! NETSCAPE2.0,30Ikc:Nf E1º.`q-[9ݦ9 JkH! ,4N!  DqBQT`1 `LE[|ua C%$*! ,62#+AȐ̔V/cNIBap ̳ƨ+Y2d! ,3b%+2V_ ! 1DaFbR]=08,Ȥr9L! ,2r'+JdL &v`\bThYB)@<&,ȤR! ,3 9tڞ0!.BW1  sa50 m)J! ,2 ٜU]qp`a4AF0` @1Α! ,20IeBԜ) q10ʰPaVڥ ub[;circuits-2.1.0/docs/build/html/_static/reset-fonts-grids.css0000644000014400001440000001262212072034467023612 0ustar prologicusers/* Copyright (c) 2008, Yahoo! Inc. All rights reserved. Code licensed under the BSD License: http://developer.yahoo.net/yui/license.txt version: 2.5.1 */ html{color:#000;background:#FFF;}body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;padding:0;}table{border-collapse:collapse;border-spacing:0;}fieldset,img{border:0;}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal;}li{list-style:none;}caption,th{text-align:left;}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal;}q:before,q:after{content:'';}abbr,acronym {border:0;font-variant:normal;}sup {vertical-align:text-top;}sub {vertical-align:text-bottom;}input,textarea,select{font-family:inherit;font-size:inherit;font-weight:inherit;}input,textarea,select{*font-size:100%;}legend{color:#000;}body {font:13px/1.231 arial,helvetica,clean,sans-serif;*font-size:small;*font:x-small;}table {font-size:inherit;font:100%;}pre,code,kbd,samp,tt{font-family:monospace;*font-size:108%;line-height:100%;} body{text-align:center;}#ft{clear:both;}#doc,#doc2,#doc3,#doc4,.yui-t1,.yui-t2,.yui-t3,.yui-t4,.yui-t5,.yui-t6,.yui-t7{margin:auto;text-align:left;width:57.69em;*width:56.25em;min-width:750px;}#doc2{width:73.076em;*width:71.25em;}#doc3{margin:auto 10px;width:auto;}#doc4{width:74.923em;*width:73.05em;}.yui-b{position:relative;}.yui-b{_position:static;}#yui-main .yui-b{position:static;}#yui-main{width:100%;}.yui-t1 #yui-main,.yui-t2 #yui-main,.yui-t3 #yui-main{float:right;margin-left:-25em;}.yui-t4 #yui-main,.yui-t5 #yui-main,.yui-t6 #yui-main{float:left;margin-right:-25em;}.yui-t1 .yui-b{float:left;width:12.30769em;*width:12.00em;}.yui-t1 #yui-main .yui-b{margin-left:13.30769em;*margin-left:13.05em;}.yui-t2 .yui-b{float:left;width:13.8461em;*width:13.50em;}.yui-t2 #yui-main .yui-b{margin-left:14.8461em;*margin-left:14.55em;}.yui-t3 .yui-b{float:left;width:23.0769em;*width:22.50em;}.yui-t3 #yui-main .yui-b{margin-left:24.0769em;*margin-left:23.62em;}.yui-t4 .yui-b{float:right;width:13.8456em;*width:13.50em;}.yui-t4 #yui-main .yui-b{margin-right:14.8456em;*margin-right:14.55em;}.yui-t5 .yui-b{float:right;width:18.4615em;*width:18.00em;}.yui-t5 #yui-main .yui-b{margin-right:19.4615em;*margin-right:19.125em;}.yui-t6 .yui-b{float:right;width:23.0769em;*width:22.50em;}.yui-t6 #yui-main .yui-b{margin-right:24.0769em;*margin-right:23.62em;}.yui-t7 #yui-main .yui-b{display:block;margin:0 0 1em 0;}#yui-main .yui-b{float:none;width:auto;}.yui-gb .yui-u,.yui-g .yui-gb .yui-u,.yui-gb .yui-g,.yui-gb .yui-gb,.yui-gb .yui-gc,.yui-gb .yui-gd,.yui-gb .yui-ge,.yui-gb .yui-gf,.yui-gc .yui-u,.yui-gc .yui-g,.yui-gd .yui-u{float:left;}.yui-g .yui-u,.yui-g .yui-g,.yui-g .yui-gb,.yui-g .yui-gc,.yui-g .yui-gd,.yui-g .yui-ge,.yui-g .yui-gf,.yui-gc .yui-u,.yui-gd .yui-g,.yui-g .yui-gc .yui-u,.yui-ge .yui-u,.yui-ge .yui-g,.yui-gf .yui-g,.yui-gf .yui-u{float:right;}.yui-g div.first,.yui-gb div.first,.yui-gc div.first,.yui-gd div.first,.yui-ge div.first,.yui-gf div.first,.yui-g .yui-gc div.first,.yui-g .yui-ge div.first,.yui-gc div.first div.first{float:left;}.yui-g .yui-u,.yui-g .yui-g,.yui-g .yui-gb,.yui-g .yui-gc,.yui-g .yui-gd,.yui-g .yui-ge,.yui-g .yui-gf{width:49.1%;}.yui-gb .yui-u,.yui-g .yui-gb .yui-u,.yui-gb .yui-g,.yui-gb .yui-gb,.yui-gb .yui-gc,.yui-gb .yui-gd,.yui-gb .yui-ge,.yui-gb .yui-gf,.yui-gc .yui-u,.yui-gc .yui-g,.yui-gd .yui-u{width:32%;margin-left:1.99%;}.yui-gb .yui-u{*margin-left:1.9%;*width:31.9%;}.yui-gc div.first,.yui-gd .yui-u{width:66%;}.yui-gd div.first{width:32%;}.yui-ge div.first,.yui-gf .yui-u{width:74.2%;}.yui-ge .yui-u,.yui-gf div.first{width:24%;}.yui-g .yui-gb div.first,.yui-gb div.first,.yui-gc div.first,.yui-gd div.first{margin-left:0;}.yui-g .yui-g .yui-u,.yui-gb .yui-g .yui-u,.yui-gc .yui-g .yui-u,.yui-gd .yui-g .yui-u,.yui-ge .yui-g .yui-u,.yui-gf .yui-g .yui-u{width:49%;*width:48.1%;*margin-left:0;}.yui-g .yui-gb div.first,.yui-gb .yui-gb div.first{*margin-right:0;*width:32%;_width:31.7%;}.yui-g .yui-gc div.first,.yui-gd .yui-g{width:66%;}.yui-gb .yui-g div.first{*margin-right:4%;_margin-right:1.3%;}.yui-gb .yui-gc div.first,.yui-gb .yui-gd div.first{*margin-right:0;}.yui-gb .yui-gb .yui-u,.yui-gb .yui-gc .yui-u{*margin-left:1.8%;_margin-left:4%;}.yui-g .yui-gb .yui-u{_margin-left:1.0%;}.yui-gb .yui-gd .yui-u{*width:66%;_width:61.2%;}.yui-gb .yui-gd div.first{*width:31%;_width:29.5%;}.yui-g .yui-gc .yui-u,.yui-gb .yui-gc .yui-u{width:32%;_float:right;margin-right:0;_margin-left:0;}.yui-gb .yui-gc div.first{width:66%;*float:left;*margin-left:0;}.yui-gb .yui-ge .yui-u,.yui-gb .yui-gf .yui-u{margin:0;}.yui-gb .yui-gb .yui-u{_margin-left:.7%;}.yui-gb .yui-g div.first,.yui-gb .yui-gb div.first{*margin-left:0;}.yui-gc .yui-g .yui-u,.yui-gd .yui-g .yui-u{*width:48.1%;*margin-left:0;}s .yui-gb .yui-gd div.first{width:32%;}.yui-g .yui-gd div.first{_width:29.9%;}.yui-ge .yui-g{width:24%;}.yui-gf .yui-g{width:74.2%;}.yui-gb .yui-ge div.yui-u,.yui-gb .yui-gf div.yui-u{float:right;}.yui-gb .yui-ge div.first,.yui-gb .yui-gf div.first{float:left;}.yui-gb .yui-ge .yui-u,.yui-gb .yui-gf div.first{*width:24%;_width:20%;}.yui-gb .yui-ge div.first,.yui-gb .yui-gf .yui-u{*width:73.5%;_width:65.5%;}.yui-ge div.first .yui-gd .yui-u{width:65%;}.yui-ge div.first .yui-gd div.first{width:32%;}#bd:after,.yui-g:after,.yui-gb:after,.yui-gc:after,.yui-gd:after,.yui-ge:after,.yui-gf:after{content:".";display:block;height:0;clear:both;visibility:hidden;}#bd,.yui-g,.yui-gb,.yui-gc,.yui-gd,.yui-ge,.yui-gf{zoom:1;}circuits-2.1.0/docs/build/html/_static/default.css0000644000014400001440000000013312072034467021651 0ustar prologicusers@import url(reset-fonts-grids.css); @import url(djangodocs.css); @import url(homepage.css);circuits-2.1.0/docs/build/html/_static/down.png0000644000014400001440000000055312062603403021165 0ustar prologicusersPNG  IHDRasRGBbKGDC pHYs B(xtIME"U{IDAT8ҡNCAJ, ++@4>/U^,~T&3M^^^PM6ٹs*RJa)eG*W<"F Fg78G>q OIp:sAj5GنyD^+yU:p_%G@D|aOs(yM,"msx:.b@D|`Vٟ۲иeKſ/G!IENDB`circuits-2.1.0/docs/build/html/_static/tracsphinx.css0000644000014400001440000000531712072034467022421 0ustar prologicusers/* Trac specific styling */ @import url("sphinxdoc.css"); /* Structure */ div.footer { background-color: #4b4d4d; text-align: center; } div.bodywrapper { border-right: none; } /* Sidebar */ div.sphinxsidebarwrapper { -moz-box-shadow: 2px 2px 7px 0 grey; -webkit-box-shadow: 2px 2px 7px 0 grey; box-shadow: 2px 2px 7px 0 grey; padding: 0 0 1px .4em; } div.sphinxsidebar h3 a, div.sphinxsidebar h4 a { color: #b00; } div.sphinxsidebar h3, div.sphinxsidebar h4 { padding: 0; color: black; } div.sphinxsidebar h3, div.sphinxsidebar h4 { background: none; border: none; border-bottom: 1px solid #ddd; } div.sphinxsidebar input { border: 1px solid #d7d7d7; } p.searchtip { font-size: 90%; color: #999; } /* Navigation */ div.related ul li a { color: #b00 } div.related ul li a:hover { color: #b00; } /* Content */ body { font: normal 13px Verdana,Arial,'Bitstream Vera Sans',Helvetica,sans-serif; background-color: #4b4d4d; border: none; border-top: 1px solid #aaa; } h1, h2, h3, h4 { font-family: Arial,Verdana,'Bitstream Vera Sans',Helvetica,sans-serif; font-weight: bold; letter-spacing: -0.018em; page-break-after: avoid; } h1 { color: #555 } h2 { border-bottom: 1px solid #ddd } div.body a { text-decoration: none } a, a tt { color: #b00 } a:visited, a:visited tt { color: #800 } :link:hover, :visited:hover, a:link:hover tt, a:visited:hover tt { background-color: #eee; color: #555; } a.headerlink, a.headerlink:hover { color: #d7d7d7 !important; font-size: .8em; font-weight: normal; vertical-align: text-top; margin: 0; padding: .5em; } a.headerlink:hover { background: none; } div.body h1 a, div.body h2 a, div.body h3 a, div.body h4 a, div.body h5 a, div.body h6 a { color: #d7d7d7 !important; } dl.class { -moz-box-shadow: 1px 1px 6px 0 #888; -webkit-box-shadow: 1px 1px 6px 0 #888; box-shadow: 1px 1px 6px 0 #888; padding: .5em; } dl.function { margin-bottom: 24px; } dl.class > dt, dl.function > dt { border-bottom: 1px solid #ddd; } th.field-name { white-space: nowrap; font-size: 90%; color: #555; } td.field-body > ul { list-style-type: square; } td.field-body > ul > li > strong { font-weight: normal; font-style: italic; } /* Admonitions */ div.admonition p.admonition-title, div.warning p.admonition-title { background: none; color: #555; border: none; } div.admonition { background: none; border: none; border-left: 2px solid #acc; } div.warning { background: none; border: none; border-left: 3px solid #c33; } /* Search */ dl:target, dt:target, .highlighted { background-color: #ffa } circuits-2.1.0/docs/build/html/_static/homepage.css0000644000014400001440000000157312072034467022023 0ustar prologicusers#index p.rubric { font-size:150%; font-weight:normal; margin-bottom:.2em; color:#487858; } #index div.section dt { font-weight: normal; } #index #s-getting-help { float: right; width: 35em; background: #E1ECE2; padding: 1em; margin: 2em 0 2em 2em; } #index #s-getting-help h2 { margin: 0; } #index #s-django-documentation div.section div.section h3 { margin: 0; } #index #s-django-documentation div.section div.section { background: #E1ECE2; padding: 1em; margin: 2em 0 2em 40.3em; } #index #s-django-documentation div.section div.section a.reference { white-space: nowrap; } #index #s-using-django dl, #index #s-add-on-contrib-applications dl, #index #s-solving-specific-problems dl, #index #s-reference dl { float: left; width: 41em; } #index #s-add-on-contrib-applications, #index #s-solving-specific-problems, #index #s-reference, #index #s-and-all-the-rest { clear: left; }circuits-2.1.0/docs/build/html/_static/websupport.js0000644000014400001440000006123612062603403022265 0ustar prologicusers/* * websupport.js * ~~~~~~~~~~~~~ * * sphinx.websupport utilties for all documentation. * * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ (function($) { $.fn.autogrow = function() { return this.each(function() { var textarea = this; $.fn.autogrow.resize(textarea); $(textarea) .focus(function() { textarea.interval = setInterval(function() { $.fn.autogrow.resize(textarea); }, 500); }) .blur(function() { clearInterval(textarea.interval); }); }); }; $.fn.autogrow.resize = function(textarea) { var lineHeight = parseInt($(textarea).css('line-height'), 10); var lines = textarea.value.split('\n'); var columns = textarea.cols; var lineCount = 0; $.each(lines, function() { lineCount += Math.ceil(this.length / columns) || 1; }); var height = lineHeight * (lineCount + 1); $(textarea).css('height', height); }; })(jQuery); (function($) { var comp, by; function init() { initEvents(); initComparator(); } function initEvents() { $('a.comment-close').live("click", function(event) { event.preventDefault(); hide($(this).attr('id').substring(2)); }); $('a.vote').live("click", function(event) { event.preventDefault(); handleVote($(this)); }); $('a.reply').live("click", function(event) { event.preventDefault(); openReply($(this).attr('id').substring(2)); }); $('a.close-reply').live("click", function(event) { event.preventDefault(); closeReply($(this).attr('id').substring(2)); }); $('a.sort-option').live("click", function(event) { event.preventDefault(); handleReSort($(this)); }); $('a.show-proposal').live("click", function(event) { event.preventDefault(); showProposal($(this).attr('id').substring(2)); }); $('a.hide-proposal').live("click", function(event) { event.preventDefault(); hideProposal($(this).attr('id').substring(2)); }); $('a.show-propose-change').live("click", function(event) { event.preventDefault(); showProposeChange($(this).attr('id').substring(2)); }); $('a.hide-propose-change').live("click", function(event) { event.preventDefault(); hideProposeChange($(this).attr('id').substring(2)); }); $('a.accept-comment').live("click", function(event) { event.preventDefault(); acceptComment($(this).attr('id').substring(2)); }); $('a.delete-comment').live("click", function(event) { event.preventDefault(); deleteComment($(this).attr('id').substring(2)); }); $('a.comment-markup').live("click", function(event) { event.preventDefault(); toggleCommentMarkupBox($(this).attr('id').substring(2)); }); } /** * Set comp, which is a comparator function used for sorting and * inserting comments into the list. */ function setComparator() { // If the first three letters are "asc", sort in ascending order // and remove the prefix. if (by.substring(0,3) == 'asc') { var i = by.substring(3); comp = function(a, b) { return a[i] - b[i]; }; } else { // Otherwise sort in descending order. comp = function(a, b) { return b[by] - a[by]; }; } // Reset link styles and format the selected sort option. $('a.sel').attr('href', '#').removeClass('sel'); $('a.by' + by).removeAttr('href').addClass('sel'); } /** * Create a comp function. If the user has preferences stored in * the sortBy cookie, use those, otherwise use the default. */ function initComparator() { by = 'rating'; // Default to sort by rating. // If the sortBy cookie is set, use that instead. if (document.cookie.length > 0) { var start = document.cookie.indexOf('sortBy='); if (start != -1) { start = start + 7; var end = document.cookie.indexOf(";", start); if (end == -1) { end = document.cookie.length; by = unescape(document.cookie.substring(start, end)); } } } setComparator(); } /** * Show a comment div. */ function show(id) { $('#ao' + id).hide(); $('#ah' + id).show(); var context = $.extend({id: id}, opts); var popup = $(renderTemplate(popupTemplate, context)).hide(); popup.find('textarea[name="proposal"]').hide(); popup.find('a.by' + by).addClass('sel'); var form = popup.find('#cf' + id); form.submit(function(event) { event.preventDefault(); addComment(form); }); $('#s' + id).after(popup); popup.slideDown('fast', function() { getComments(id); }); } /** * Hide a comment div. */ function hide(id) { $('#ah' + id).hide(); $('#ao' + id).show(); var div = $('#sc' + id); div.slideUp('fast', function() { div.remove(); }); } /** * Perform an ajax request to get comments for a node * and insert the comments into the comments tree. */ function getComments(id) { $.ajax({ type: 'GET', url: opts.getCommentsURL, data: {node: id}, success: function(data, textStatus, request) { var ul = $('#cl' + id); var speed = 100; $('#cf' + id) .find('textarea[name="proposal"]') .data('source', data.source); if (data.comments.length === 0) { ul.html('
  • No comments yet.
  • '); ul.data('empty', true); } else { // If there are comments, sort them and put them in the list. var comments = sortComments(data.comments); speed = data.comments.length * 100; appendComments(comments, ul); ul.data('empty', false); } $('#cn' + id).slideUp(speed + 200); ul.slideDown(speed); }, error: function(request, textStatus, error) { showError('Oops, there was a problem retrieving the comments.'); }, dataType: 'json' }); } /** * Add a comment via ajax and insert the comment into the comment tree. */ function addComment(form) { var node_id = form.find('input[name="node"]').val(); var parent_id = form.find('input[name="parent"]').val(); var text = form.find('textarea[name="comment"]').val(); var proposal = form.find('textarea[name="proposal"]').val(); if (text == '') { showError('Please enter a comment.'); return; } // Disable the form that is being submitted. form.find('textarea,input').attr('disabled', 'disabled'); // Send the comment to the server. $.ajax({ type: "POST", url: opts.addCommentURL, dataType: 'json', data: { node: node_id, parent: parent_id, text: text, proposal: proposal }, success: function(data, textStatus, error) { // Reset the form. if (node_id) { hideProposeChange(node_id); } form.find('textarea') .val('') .add(form.find('input')) .removeAttr('disabled'); var ul = $('#cl' + (node_id || parent_id)); if (ul.data('empty')) { $(ul).empty(); ul.data('empty', false); } insertComment(data.comment); var ao = $('#ao' + node_id); ao.find('img').attr({'src': opts.commentBrightImage}); if (node_id) { // if this was a "root" comment, remove the commenting box // (the user can get it back by reopening the comment popup) $('#ca' + node_id).slideUp(); } }, error: function(request, textStatus, error) { form.find('textarea,input').removeAttr('disabled'); showError('Oops, there was a problem adding the comment.'); } }); } /** * Recursively append comments to the main comment list and children * lists, creating the comment tree. */ function appendComments(comments, ul) { $.each(comments, function() { var div = createCommentDiv(this); ul.append($(document.createElement('li')).html(div)); appendComments(this.children, div.find('ul.comment-children')); // To avoid stagnating data, don't store the comments children in data. this.children = null; div.data('comment', this); }); } /** * After adding a new comment, it must be inserted in the correct * location in the comment tree. */ function insertComment(comment) { var div = createCommentDiv(comment); // To avoid stagnating data, don't store the comments children in data. comment.children = null; div.data('comment', comment); var ul = $('#cl' + (comment.node || comment.parent)); var siblings = getChildren(ul); var li = $(document.createElement('li')); li.hide(); // Determine where in the parents children list to insert this comment. for(i=0; i < siblings.length; i++) { if (comp(comment, siblings[i]) <= 0) { $('#cd' + siblings[i].id) .parent() .before(li.html(div)); li.slideDown('fast'); return; } } // If we get here, this comment rates lower than all the others, // or it is the only comment in the list. ul.append(li.html(div)); li.slideDown('fast'); } function acceptComment(id) { $.ajax({ type: 'POST', url: opts.acceptCommentURL, data: {id: id}, success: function(data, textStatus, request) { $('#cm' + id).fadeOut('fast'); $('#cd' + id).removeClass('moderate'); }, error: function(request, textStatus, error) { showError('Oops, there was a problem accepting the comment.'); } }); } function deleteComment(id) { $.ajax({ type: 'POST', url: opts.deleteCommentURL, data: {id: id}, success: function(data, textStatus, request) { var div = $('#cd' + id); if (data == 'delete') { // Moderator mode: remove the comment and all children immediately div.slideUp('fast', function() { div.remove(); }); return; } // User mode: only mark the comment as deleted div .find('span.user-id:first') .text('[deleted]').end() .find('div.comment-text:first') .text('[deleted]').end() .find('#cm' + id + ', #dc' + id + ', #ac' + id + ', #rc' + id + ', #sp' + id + ', #hp' + id + ', #cr' + id + ', #rl' + id) .remove(); var comment = div.data('comment'); comment.username = '[deleted]'; comment.text = '[deleted]'; div.data('comment', comment); }, error: function(request, textStatus, error) { showError('Oops, there was a problem deleting the comment.'); } }); } function showProposal(id) { $('#sp' + id).hide(); $('#hp' + id).show(); $('#pr' + id).slideDown('fast'); } function hideProposal(id) { $('#hp' + id).hide(); $('#sp' + id).show(); $('#pr' + id).slideUp('fast'); } function showProposeChange(id) { $('#pc' + id).hide(); $('#hc' + id).show(); var textarea = $('#pt' + id); textarea.val(textarea.data('source')); $.fn.autogrow.resize(textarea[0]); textarea.slideDown('fast'); } function hideProposeChange(id) { $('#hc' + id).hide(); $('#pc' + id).show(); var textarea = $('#pt' + id); textarea.val('').removeAttr('disabled'); textarea.slideUp('fast'); } function toggleCommentMarkupBox(id) { $('#mb' + id).toggle(); } /** Handle when the user clicks on a sort by link. */ function handleReSort(link) { var classes = link.attr('class').split(/\s+/); for (var i=0; iThank you! Your comment will show up ' + 'once it is has been approved by a moderator.'); } // Prettify the comment rating. comment.pretty_rating = comment.rating + ' point' + (comment.rating == 1 ? '' : 's'); // Make a class (for displaying not yet moderated comments differently) comment.css_class = comment.displayed ? '' : ' moderate'; // Create a div for this comment. var context = $.extend({}, opts, comment); var div = $(renderTemplate(commentTemplate, context)); // If the user has voted on this comment, highlight the correct arrow. if (comment.vote) { var direction = (comment.vote == 1) ? 'u' : 'd'; div.find('#' + direction + 'v' + comment.id).hide(); div.find('#' + direction + 'u' + comment.id).show(); } if (opts.moderator || comment.text != '[deleted]') { div.find('a.reply').show(); if (comment.proposal_diff) div.find('#sp' + comment.id).show(); if (opts.moderator && !comment.displayed) div.find('#cm' + comment.id).show(); if (opts.moderator || (opts.username == comment.username)) div.find('#dc' + comment.id).show(); } return div; } /** * A simple template renderer. Placeholders such as <%id%> are replaced * by context['id'] with items being escaped. Placeholders such as <#id#> * are not escaped. */ function renderTemplate(template, context) { var esc = $(document.createElement('div')); function handle(ph, escape) { var cur = context; $.each(ph.split('.'), function() { cur = cur[this]; }); return escape ? esc.text(cur || "").html() : cur; } return template.replace(/<([%#])([\w\.]*)\1>/g, function() { return handle(arguments[2], arguments[1] == '%' ? true : false); }); } /** Flash an error message briefly. */ function showError(message) { $(document.createElement('div')).attr({'class': 'popup-error'}) .append($(document.createElement('div')) .attr({'class': 'error-message'}).text(message)) .appendTo('body') .fadeIn("slow") .delay(2000) .fadeOut("slow"); } /** Add a link the user uses to open the comments popup. */ $.fn.comment = function() { return this.each(function() { var id = $(this).attr('id').substring(1); var count = COMMENT_METADATA[id]; var title = count + ' comment' + (count == 1 ? '' : 's'); var image = count > 0 ? opts.commentBrightImage : opts.commentImage; var addcls = count == 0 ? ' nocomment' : ''; $(this) .append( $(document.createElement('a')).attr({ href: '#', 'class': 'sphinx-comment-open' + addcls, id: 'ao' + id }) .append($(document.createElement('img')).attr({ src: image, alt: 'comment', title: title })) .click(function(event) { event.preventDefault(); show($(this).attr('id').substring(2)); }) ) .append( $(document.createElement('a')).attr({ href: '#', 'class': 'sphinx-comment-close hidden', id: 'ah' + id }) .append($(document.createElement('img')).attr({ src: opts.closeCommentImage, alt: 'close', title: 'close' })) .click(function(event) { event.preventDefault(); hide($(this).attr('id').substring(2)); }) ); }); }; var opts = { processVoteURL: '/_process_vote', addCommentURL: '/_add_comment', getCommentsURL: '/_get_comments', acceptCommentURL: '/_accept_comment', deleteCommentURL: '/_delete_comment', commentImage: '/static/_static/comment.png', closeCommentImage: '/static/_static/comment-close.png', loadingImage: '/static/_static/ajax-loader.gif', commentBrightImage: '/static/_static/comment-bright.png', upArrow: '/static/_static/up.png', downArrow: '/static/_static/down.png', upArrowPressed: '/static/_static/up-pressed.png', downArrowPressed: '/static/_static/down-pressed.png', voting: false, moderator: false }; if (typeof COMMENT_OPTIONS != "undefined") { opts = jQuery.extend(opts, COMMENT_OPTIONS); } var popupTemplate = '\
    \

    \ Sort by:\ best rated\ newest\ oldest\

    \
    Comments
    \
    \ loading comments...
    \
      \
      \

      Add a comment\ (markup):

      \
      \ reStructured text markup: *emph*, **strong**, \ ``code``, \ code blocks: :: and an indented block after blank line
      \
      \ \

      \ \ Propose a change ▹\ \ \ Propose a change ▿\ \

      \ \ \ \ \
      \
      \
      '; var commentTemplate = '\
      \
      \
      \ \ \ \ \ \ \
      \
      \ \ \ \ \ \ \
      \
      \
      \

      \ <%username%>\ <%pretty_rating%>\ <%time.delta%>\

      \
      <#text#>
      \

      \ \ reply ▿\ proposal ▹\ proposal ▿\ \ \

      \
      \
      <#proposal_diff#>\
              
      \
        \
        \
        \
        \ '; var replyTemplate = '\
      • \
        \
        \ \ \ \ \ \
        \
        \
      • '; $(document).ready(function() { init(); }); })(jQuery); $(document).ready(function() { // add comment anchors for all paragraphs that are commentable $('.sphinx-has-comment').comment(); // highlight search words in search results $("div.context").each(function() { var params = $.getQueryParameters(); var terms = (params.q) ? params.q[0].split(/\s+/) : []; var result = $(this); $.each(terms, function() { result.highlightText(this.toLowerCase(), 'highlighted'); }); }); // directly open comment window if requested var anchor = document.location.hash; if (anchor.substring(0, 9) == '#comment-') { $('#ao' + anchor.substring(9)).click(); document.location.hash = '#s' + anchor.substring(9); } }); circuits-2.1.0/docs/build/html/_static/pygments.css0000644000014400001440000000714312113366704022101 0ustar prologicusers.highlight .hll { background-color: #ffffcc } .highlight { background: #ffffff; } .highlight .c { color: #999988; font-style: italic } /* Comment */ .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ .highlight .k { font-weight: bold } /* Keyword */ .highlight .o { font-weight: bold } /* Operator */ .highlight .cm { color: #999988; font-style: italic } /* Comment.Multiline */ .highlight .cp { color: #999999; font-weight: bold } /* Comment.Preproc */ .highlight .c1 { color: #999988; font-style: italic } /* Comment.Single */ .highlight .cs { color: #999999; font-weight: bold; font-style: italic } /* Comment.Special */ .highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ .highlight .ge { font-style: italic } /* Generic.Emph */ .highlight .gr { color: #aa0000 } /* Generic.Error */ .highlight .gh { color: #999999 } /* Generic.Heading */ .highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ .highlight .go { color: #888888 } /* Generic.Output */ .highlight .gp { color: #555555 } /* Generic.Prompt */ .highlight .gs { font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #aaaaaa } /* Generic.Subheading */ .highlight .gt { color: #aa0000 } /* Generic.Traceback */ .highlight .kc { font-weight: bold } /* Keyword.Constant */ .highlight .kd { font-weight: bold } /* Keyword.Declaration */ .highlight .kn { font-weight: bold } /* Keyword.Namespace */ .highlight .kp { font-weight: bold } /* Keyword.Pseudo */ .highlight .kr { font-weight: bold } /* Keyword.Reserved */ .highlight .kt { color: #445588; font-weight: bold } /* Keyword.Type */ .highlight .m { color: #009999 } /* Literal.Number */ .highlight .s { color: #bb8844 } /* Literal.String */ .highlight .na { color: #008080 } /* Name.Attribute */ .highlight .nb { color: #999999 } /* Name.Builtin */ .highlight .nc { color: #445588; font-weight: bold } /* Name.Class */ .highlight .no { color: #008080 } /* Name.Constant */ .highlight .ni { color: #800080 } /* Name.Entity */ .highlight .ne { color: #990000; font-weight: bold } /* Name.Exception */ .highlight .nf { color: #990000; font-weight: bold } /* Name.Function */ .highlight .nn { color: #555555 } /* Name.Namespace */ .highlight .nt { color: #000080 } /* Name.Tag */ .highlight .nv { color: #008080 } /* Name.Variable */ .highlight .ow { font-weight: bold } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mf { color: #009999 } /* Literal.Number.Float */ .highlight .mh { color: #009999 } /* Literal.Number.Hex */ .highlight .mi { color: #009999 } /* Literal.Number.Integer */ .highlight .mo { color: #009999 } /* Literal.Number.Oct */ .highlight .sb { color: #bb8844 } /* Literal.String.Backtick */ .highlight .sc { color: #bb8844 } /* Literal.String.Char */ .highlight .sd { color: #bb8844 } /* Literal.String.Doc */ .highlight .s2 { color: #bb8844 } /* Literal.String.Double */ .highlight .se { color: #bb8844 } /* Literal.String.Escape */ .highlight .sh { color: #bb8844 } /* Literal.String.Heredoc */ .highlight .si { color: #bb8844 } /* Literal.String.Interpol */ .highlight .sx { color: #bb8844 } /* Literal.String.Other */ .highlight .sr { color: #808000 } /* Literal.String.Regex */ .highlight .s1 { color: #bb8844 } /* Literal.String.Single */ .highlight .ss { color: #bb8844 } /* Literal.String.Symbol */ .highlight .bp { color: #999999 } /* Name.Builtin.Pseudo */ .highlight .vc { color: #008080 } /* Name.Variable.Class */ .highlight .vg { color: #008080 } /* Name.Variable.Global */ .highlight .vi { color: #008080 } /* Name.Variable.Instance */ .highlight .il { color: #009999 } /* Literal.Number.Integer.Long */circuits-2.1.0/docs/build/html/_static/comment-close.png0000644000014400001440000000677212062603403022774 0ustar prologicusersPNG  IHDRa OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-bKGD pHYs  tIME!,IDAT8e_Hu?}s3y˕U2MvQ֊FE.łĊbE$DDZF5b@Q":2{n.s<_ y?mwV@tR`}Z _# _=_@ w^R%6gC-έ(K>| ${}~y3;j>;3~ZYV[eM&Uٺ3?)VA a.headerlink, h2:hover > a.headerlink, h3:hover > a.headerlink, h4:hover > a.headerlink, h5:hover > a.headerlink, h6:hover > a.headerlink, dt:hover > a.headerlink { visibility: visible; } /*** index ***/ table.indextable td { text-align: left; vertical-align: top;} table.indextable dl, table.indextable dd { margin-top: 0; margin-bottom: 0; } table.indextable tr.pcap { height: 10px; } table.indextable tr.cap { margin-top: 10px; background-color: #f2f2f2;} /*** page-specific overrides ***/ div#contents ul { margin-bottom: 0;} div#contents ul li { margin-bottom: 0;} div#contents ul ul li { margin-top: 0.3em;} /*** IE hacks ***/ * pre { width: 100%; } circuits-2.1.0/docs/build/html/_static/jquery.js0000644000014400001440000021475612062603403021401 0ustar prologicusers/*! * jQuery JavaScript Library v1.4.2 * http://jquery.com/ * * Copyright 2010, John Resig * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * Includes Sizzle.js * http://sizzlejs.com/ * Copyright 2010, The Dojo Foundation * Released under the MIT, BSD, and GPL Licenses. * * Date: Sat Feb 13 22:33:48 2010 -0500 */ (function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/, Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&& (d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this, a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b=== "find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this, function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b
        a"; var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected, parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent= false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n= s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true, applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando]; else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this, a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b=== w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i, cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected= c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed"); a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g, function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split("."); k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a), C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B=0){a.type= e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&& f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive; if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data", e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a, "_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a, d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift(); t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D|| g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()}, CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m, g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)}, text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}}, setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return hl[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h= h[3];l=0;for(m=h.length;l=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m=== "="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g, h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&& q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML=""; if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="

        ";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}(); (function(){var g=s.createElement("div");g.innerHTML="
        ";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}: function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f0)for(var j=d;j0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j= {},i;if(f&&a.length){e=0;for(var o=a.length;e-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a=== "string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode", d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")? a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType=== 1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/"},F={option:[1,""],legend:[1,"
        ","
        "],thead:[1,"","
        "],tr:[2,"","
        "],td:[3,"","
        "],col:[2,"","
        "],area:[1,"",""],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div
        ","
        "];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d= c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this}, wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})}, prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b, this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild); return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja, ""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]); return this}else{e=0;for(var j=d.length;e0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["", ""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]===""&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e= c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]? c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja= function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter= Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a, "border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f= a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b= a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=//gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!== "string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("
        ").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this}, serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "), function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href, global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&& e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)? "&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache=== false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B= false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since", c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E|| d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x); g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status=== 1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b=== "json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional; if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration=== "number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]|| c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start; this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now= this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem, e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b
        "; a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b); c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a, d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top- f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset": "pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window); circuits-2.1.0/docs/build/html/_static/minus.png0000644000014400001440000000030712062603403021346 0ustar prologicusersPNG  IHDR &q pHYs  tIME <8tEXtComment̖RIDATc= 0 && !jQuery(node.parentNode).hasClass(className)) { var span = document.createElement("span"); span.className = className; span.appendChild(document.createTextNode(val.substr(pos, text.length))); node.parentNode.insertBefore(span, node.parentNode.insertBefore( document.createTextNode(val.substr(pos + text.length)), node.nextSibling)); node.nodeValue = val.substr(0, pos); } } else if (!jQuery(node).is("button, select, textarea")) { jQuery.each(node.childNodes, function() { highlight(this); }); } } return this.each(function() { highlight(this); }); }; /** * Small JavaScript module for the documentation. */ var Documentation = { init : function() { this.fixFirefoxAnchorBug(); this.highlightSearchWords(); this.initIndexTable(); }, /** * i18n support */ TRANSLATIONS : {}, PLURAL_EXPR : function(n) { return n == 1 ? 0 : 1; }, LOCALE : 'unknown', // gettext and ngettext don't access this so that the functions // can safely bound to a different name (_ = Documentation.gettext) gettext : function(string) { var translated = Documentation.TRANSLATIONS[string]; if (typeof translated == 'undefined') return string; return (typeof translated == 'string') ? translated : translated[0]; }, ngettext : function(singular, plural, n) { var translated = Documentation.TRANSLATIONS[singular]; if (typeof translated == 'undefined') return (n == 1) ? singular : plural; return translated[Documentation.PLURALEXPR(n)]; }, addTranslations : function(catalog) { for (var key in catalog.messages) this.TRANSLATIONS[key] = catalog.messages[key]; this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); this.LOCALE = catalog.locale; }, /** * add context elements like header anchor links */ addContextElements : function() { $('div[id] > :header:first').each(function() { $('\u00B6'). attr('href', '#' + this.id). attr('title', _('Permalink to this headline')). appendTo(this); }); $('dt[id]').each(function() { $('\u00B6'). attr('href', '#' + this.id). attr('title', _('Permalink to this definition')). appendTo(this); }); }, /** * workaround a firefox stupidity */ fixFirefoxAnchorBug : function() { if (document.location.hash && $.browser.mozilla) window.setTimeout(function() { document.location.href += ''; }, 10); }, /** * highlight the search words provided in the url in the text */ highlightSearchWords : function() { var params = $.getQueryParameters(); var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; if (terms.length) { var body = $('div.body'); window.setTimeout(function() { $.each(terms, function() { body.highlightText(this.toLowerCase(), 'highlighted'); }); }, 10); $('') .appendTo($('#searchbox')); } }, /** * init the domain index toggle buttons */ initIndexTable : function() { var togglers = $('img.toggler').click(function() { var src = $(this).attr('src'); var idnum = $(this).attr('id').substr(7); $('tr.cg-' + idnum).toggle(); if (src.substr(-9) == 'minus.png') $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); else $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); }).css('display', ''); if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { togglers.click(); } }, /** * helper function to hide the search marks again */ hideSearchWords : function() { $('#searchbox .highlight-link').fadeOut(300); $('span.highlighted').removeClass('highlighted'); }, /** * make the url absolute */ makeURL : function(relativeURL) { return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; }, /** * get the current relative url */ getCurrentURL : function() { var path = document.location.pathname; var parts = path.split(/\//); $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { if (this == '..') parts.pop(); }); var url = parts.join('/'); return path.substring(url.lastIndexOf('/') + 1, path.length - 1); } }; // quick alias for translations _ = Documentation.gettext; $(document).ready(function() { Documentation.init(); }); circuits-2.1.0/docs/build/html/_static/docicons-philosophy.png0000644000014400001440000000276312072034467024231 0ustar prologicusersPNG  IHDR//E pHYs  IDATX ͙]h\Em+&SU5P֢*RPm_!M&<*>P1 }Ҫ$ښn&!) ~wO2;;w{99̙lXYYo=_"5Yͼ 88\yّ?n_s3{d3MOVMO/4ǟ޲eLu[ߌACD* |SC҅ÎwєξD[TG;2"O񞻾DdmE}UQLLr™SD*Pd6|wS ܍Orq t*\XXc;^I DٕwDP../@X-/ZjHnLzG"9ރͺ +@vuǁVFR)9&c}ބ?L:=11AϜzYeH'])(A K(qb *1e{{{XdDIbaQttt(J1\uȨe'@7**jllp(I1JԪ=44433c!^Ua#a*0SBs||\%"#R%  )'!)P$MOO#O!P6xu1ܐfAiX 8&&( "y薀rty$![e3dreض.( )e(u|!fREta)}gX$A+/ X@HTU2(>P%a~FD!@ DԘ>Ն|'H!B! C70[]ܟ!8ORc3V[9?GOp|7V7>9Gù }(n\x^GTӸҨ߽iE]4U=Uu[~: ڰԖ08;DqUf" E(ຄEĔП[­#S YmsqGfVb۾TM[Œ-4@ ph?56z(3iP0mA H].8:5u((hrIțs[btP%ĩ^/VtϰkKpOVǟaŞa?G}bfIENDB`circuits-2.1.0/docs/build/html/_static/up-pressed.png0000644000014400001440000000056412062603403022307 0ustar prologicusersPNG  IHDRasRGBbKGDC pHYs B(xtIME ,ZeIDAT8͓jA*WKk-,By@- و/`cXYh!6jf GrOlXvvfk2!p!GOOԲ &zf 6|M~%`]* ΛM]K ZĆ1Er%ȶcm1`)- EYm4%7YTk-Qa"NWAo-yeq,) Ypt\hqmszG]Nar߶s^l vh\2%0EeRvIENDB`circuits-2.1.0/docs/build/html/_static/up.png0000644000014400001440000000055312062603403020642 0ustar prologicusersPNG  IHDRasRGBbKGDC pHYs B(xtIME!.<̓EIDAT8͓NABP\EG{%<|xc  cr6@t;b$;3&)h1!﫳Hzz@=)p 3۵e2/ߴ ( %^ND^ }3H1DoǪISFұ?, G`{v^X[b]&HC3{:sO& ?,[eL#IENDB`circuits-2.1.0/docs/build/html/_static/searchtools.js0000644000014400001440000003725312113366704022412 0ustar prologicusers/* * searchtools.js_t * ~~~~~~~~~~~~~~~~ * * Sphinx JavaScript utilties for the full-text search. * * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ /** * helper function to return a node containing the * search summary for a given text. keywords is a list * of stemmed words, hlwords is the list of normal, unstemmed * words. the first one is used to find the occurance, the * latter for highlighting it. */ jQuery.makeSearchSummary = function(text, keywords, hlwords) { var textLower = text.toLowerCase(); var start = 0; $.each(keywords, function() { var i = textLower.indexOf(this.toLowerCase()); if (i > -1) start = i; }); start = Math.max(start - 120, 0); var excerpt = ((start > 0) ? '...' : '') + $.trim(text.substr(start, 240)) + ((start + 240 - text.length) ? '...' : ''); var rv = $('
        ').text(excerpt); $.each(hlwords, function() { rv = rv.highlightText(this, 'highlighted'); }); return rv; } /** * Porter Stemmer */ var Stemmer = function() { var step2list = { ational: 'ate', tional: 'tion', enci: 'ence', anci: 'ance', izer: 'ize', bli: 'ble', alli: 'al', entli: 'ent', eli: 'e', ousli: 'ous', ization: 'ize', ation: 'ate', ator: 'ate', alism: 'al', iveness: 'ive', fulness: 'ful', ousness: 'ous', aliti: 'al', iviti: 'ive', biliti: 'ble', logi: 'log' }; var step3list = { icate: 'ic', ative: '', alize: 'al', iciti: 'ic', ical: 'ic', ful: '', ness: '' }; var c = "[^aeiou]"; // consonant var v = "[aeiouy]"; // vowel var C = c + "[^aeiouy]*"; // consonant sequence var V = v + "[aeiou]*"; // vowel sequence var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 var s_v = "^(" + C + ")?" + v; // vowel in stem this.stemWord = function (w) { var stem; var suffix; var firstch; var origword = w; if (w.length < 3) return w; var re; var re2; var re3; var re4; firstch = w.substr(0,1); if (firstch == "y") w = firstch.toUpperCase() + w.substr(1); // Step 1a re = /^(.+?)(ss|i)es$/; re2 = /^(.+?)([^s])s$/; if (re.test(w)) w = w.replace(re,"$1$2"); else if (re2.test(w)) w = w.replace(re2,"$1$2"); // Step 1b re = /^(.+?)eed$/; re2 = /^(.+?)(ed|ing)$/; if (re.test(w)) { var fp = re.exec(w); re = new RegExp(mgr0); if (re.test(fp[1])) { re = /.$/; w = w.replace(re,""); } } else if (re2.test(w)) { var fp = re2.exec(w); stem = fp[1]; re2 = new RegExp(s_v); if (re2.test(stem)) { w = stem; re2 = /(at|bl|iz)$/; re3 = new RegExp("([^aeiouylsz])\\1$"); re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); if (re2.test(w)) w = w + "e"; else if (re3.test(w)) { re = /.$/; w = w.replace(re,""); } else if (re4.test(w)) w = w + "e"; } } // Step 1c re = /^(.+?)y$/; if (re.test(w)) { var fp = re.exec(w); stem = fp[1]; re = new RegExp(s_v); if (re.test(stem)) w = stem + "i"; } // Step 2 re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; if (re.test(w)) { var fp = re.exec(w); stem = fp[1]; suffix = fp[2]; re = new RegExp(mgr0); if (re.test(stem)) w = stem + step2list[suffix]; } // Step 3 re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; if (re.test(w)) { var fp = re.exec(w); stem = fp[1]; suffix = fp[2]; re = new RegExp(mgr0); if (re.test(stem)) w = stem + step3list[suffix]; } // Step 4 re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; re2 = /^(.+?)(s|t)(ion)$/; if (re.test(w)) { var fp = re.exec(w); stem = fp[1]; re = new RegExp(mgr1); if (re.test(stem)) w = stem; } else if (re2.test(w)) { var fp = re2.exec(w); stem = fp[1] + fp[2]; re2 = new RegExp(mgr1); if (re2.test(stem)) w = stem; } // Step 5 re = /^(.+?)e$/; if (re.test(w)) { var fp = re.exec(w); stem = fp[1]; re = new RegExp(mgr1); re2 = new RegExp(meq1); re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) w = stem; } re = /ll$/; re2 = new RegExp(mgr1); if (re.test(w) && re2.test(w)) { re = /.$/; w = w.replace(re,""); } // and turn initial Y back to y if (firstch == "y") w = firstch.toLowerCase() + w.substr(1); return w; } } /** * Search Module */ var Search = { _index : null, _queued_query : null, _pulse_status : -1, init : function() { var params = $.getQueryParameters(); if (params.q) { var query = params.q[0]; $('input[name="q"]')[0].value = query; this.performSearch(query); } }, loadIndex : function(url) { $.ajax({type: "GET", url: url, data: null, success: null, dataType: "script", cache: true}); }, setIndex : function(index) { var q; this._index = index; if ((q = this._queued_query) !== null) { this._queued_query = null; Search.query(q); } }, hasIndex : function() { return this._index !== null; }, deferQuery : function(query) { this._queued_query = query; }, stopPulse : function() { this._pulse_status = 0; }, startPulse : function() { if (this._pulse_status >= 0) return; function pulse() { Search._pulse_status = (Search._pulse_status + 1) % 4; var dotString = ''; for (var i = 0; i < Search._pulse_status; i++) dotString += '.'; Search.dots.text(dotString); if (Search._pulse_status > -1) window.setTimeout(pulse, 500); }; pulse(); }, /** * perform a search for something */ performSearch : function(query) { // create the required interface elements this.out = $('#search-results'); this.title = $('

        ' + _('Searching') + '

        ').appendTo(this.out); this.dots = $('').appendTo(this.title); this.status = $('

        ').appendTo(this.out); this.output = $('