aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/python/ipdb
diff options
context:
space:
mode:
authorDevtools Arcadia <arcadia-devtools@yandex-team.ru>2022-02-07 18:08:42 +0300
committerDevtools Arcadia <arcadia-devtools@mous.vla.yp-c.yandex.net>2022-02-07 18:08:42 +0300
commit1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch)
treee26c9fed0de5d9873cce7e00bc214573dc2195b7 /contrib/python/ipdb
downloadydb-1110808a9d39d4b808aef724c861a2e1a38d2a69.tar.gz
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'contrib/python/ipdb')
-rw-r--r--contrib/python/ipdb/.dist-info/METADATA586
-rw-r--r--contrib/python/ipdb/.dist-info/top_level.txt1
-rw-r--r--contrib/python/ipdb/COPYING.txt30
-rw-r--r--contrib/python/ipdb/README.rst193
-rw-r--r--contrib/python/ipdb/ipdb/__init__.py11
-rw-r--r--contrib/python/ipdb/ipdb/__main__.py327
-rw-r--r--contrib/python/ipdb/ipdb/stdout.py39
-rw-r--r--contrib/python/ipdb/ya.make38
8 files changed, 1225 insertions, 0 deletions
diff --git a/contrib/python/ipdb/.dist-info/METADATA b/contrib/python/ipdb/.dist-info/METADATA
new file mode 100644
index 0000000000..a0597b4d58
--- /dev/null
+++ b/contrib/python/ipdb/.dist-info/METADATA
@@ -0,0 +1,586 @@
+Metadata-Version: 2.1
+Name: ipdb
+Version: 0.13.9
+Summary: IPython-enabled pdb
+Home-page: https://github.com/gotcha/ipdb
+Author: Godefroid Chapelle
+Author-email: gotcha@bubblenet.be
+License: BSD
+Keywords: pdb ipython
+Platform: UNKNOWN
+Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.4
+Classifier: Programming Language :: Python :: 3.5
+Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Operating System :: MacOS :: MacOS X
+Classifier: Operating System :: POSIX :: Linux
+Classifier: Operating System :: Microsoft :: Windows
+Classifier: Topic :: Software Development :: Debuggers
+Classifier: License :: OSI Approved :: BSD License
+Requires-Python: >=2.7
+Requires-Dist: setuptools
+Requires-Dist: ipython (<6.0.0,>=5.1.0) ; python_version == "2.7"
+Requires-Dist: toml (>=0.10.2) ; python_version == "2.7"
+Requires-Dist: decorator (<5.0.0) ; python_version == "2.7"
+Requires-Dist: ipython (<7.0.0,>=6.0.0) ; python_version == "3.4"
+Requires-Dist: toml (>=0.10.2) ; python_version == "3.4"
+Requires-Dist: decorator (<5.0.0) ; python_version == "3.4"
+Requires-Dist: ipython (<7.10.0,>=7.0.0) ; python_version == "3.5"
+Requires-Dist: toml (>=0.10.2) ; python_version == "3.5"
+Requires-Dist: decorator ; python_version == "3.5"
+Requires-Dist: ipython (<7.17.0,>=7.10.0) ; python_version == "3.6"
+Requires-Dist: toml (>=0.10.2) ; python_version == "3.6"
+Requires-Dist: decorator ; python_version == "3.6"
+Requires-Dist: ipython (>=7.17.0) ; python_version > "3.6"
+Requires-Dist: toml (>=0.10.2) ; python_version > "3.6"
+Requires-Dist: decorator ; python_version > "3.6"
+
+IPython `pdb`
+=============
+
+.. image:: https://travis-ci.org/gotcha/ipdb.png?branch=master
+ :target: https://travis-ci.org/gotcha/ipdb
+.. image:: https://codecov.io/gh/gotcha/ipdb/branch/master/graphs/badge.svg?style=flat
+ :target: https://codecov.io/gh/gotcha/ipdb?branch=master
+
+Use
+---
+
+ipdb exports functions to access the IPython_ debugger, which features
+tab completion, syntax highlighting, better tracebacks, better introspection
+with the same interface as the `pdb` module.
+
+Example usage:
+
+.. code-block:: python
+
+ import ipdb
+ ipdb.set_trace()
+ ipdb.set_trace(context=5) # will show five lines of code
+ # instead of the default three lines
+ # or you can set it via IPDB_CONTEXT_SIZE env variable
+ # or setup.cfg file
+ ipdb.pm()
+ ipdb.run('x[0] = 3')
+ result = ipdb.runcall(function, arg0, arg1, kwarg='foo')
+ result = ipdb.runeval('f(1,2) - 3')
+
+
+Arguments for `set_trace`
++++++++++++++++++++++++++
+
+The `set_trace` function accepts `context` which will show as many lines of code as defined,
+and `cond`, which accepts boolean values (such as `abc == 17`) and will start ipdb's
+interface whenever `cond` equals to `True`.
+
+Using configuration file
+++++++++++++++++++++++++
+
+It's possible to set up context using a `.ipdb` file on your home folder, `setup.cfg`
+or `pyproject.toml` on your project folder. You can also set your file location via
+env var `$IPDB_CONFIG`. Your environment variable has priority over the home
+configuration file, which in turn has priority over the setup config file.
+Currently, only context setting is available.
+
+A valid setup.cfg is as follows
+
+::
+
+ [ipdb]
+ context=5
+
+
+A valid .ipdb is as follows
+
+::
+
+ context=5
+
+
+A valid pyproject.toml is as follows
+
+::
+
+ [tool.ipdb]
+ context=5
+
+
+The post-mortem function, ``ipdb.pm()``, is equivalent to the magic function
+``%debug``.
+
+.. _IPython: http://ipython.org
+
+If you install ``ipdb`` with a tool which supports ``setuptools`` entry points,
+an ``ipdb`` script is made for you. You can use it to debug your python 2 scripts like
+
+::
+
+ $ bin/ipdb mymodule.py
+
+And for python 3
+
+::
+
+ $ bin/ipdb3 mymodule.py
+
+Alternatively with Python 2.7 only, you can also use
+
+::
+
+ $ python -m ipdb mymodule.py
+
+You can also enclose code with the ``with`` statement to launch ipdb if an exception is raised:
+
+.. code-block:: python
+
+ from ipdb import launch_ipdb_on_exception
+
+ with launch_ipdb_on_exception():
+ [...]
+
+.. warning::
+ Context managers were introduced in Python 2.5.
+ Adding a context manager implies dropping Python 2.4 support.
+ Use ``ipdb==0.6`` with 2.4.
+
+Or you can use ``iex`` as a function decorator to launch ipdb if an exception is raised:
+
+.. code-block:: python
+
+ from ipdb import iex
+
+ @iex
+ def main():
+ [...]
+
+.. warning::
+ Using ``from future import print_function`` for Python 3 compat implies dropping Python 2.5 support.
+ Use ``ipdb<=0.8`` with 2.5.
+
+Issues with ``stdout``
+----------------------
+
+Some tools, like ``nose`` fiddle with ``stdout``.
+
+Until ``ipdb==0.9.4``, we tried to guess when we should also
+fiddle with ``stdout`` to support those tools.
+However, all strategies tried until 0.9.4 have proven brittle.
+
+If you use ``nose`` or another tool that fiddles with ``stdout``, you should
+explicitly ask for ``stdout`` fiddling by using ``ipdb`` like this
+
+.. code-block:: python
+
+ import ipdb
+ ipdb.sset_trace()
+ ipdb.spm()
+
+ from ipdb import slaunch_ipdb_on_exception
+ with slaunch_ipdb_on_exception():
+ [...]
+
+
+Development
+-----------
+
+``ipdb`` source code and tracker are at https://github.com/gotcha/ipdb.
+
+Pull requests should take care of updating the changelog ``HISTORY.txt``.
+
+Under the unreleased section, add your changes and your username.
+
+Manual testing
+++++++++++++++
+
+To test your changes, make use of ``manual_test.py``. Create a virtual environment,
+install IPython and run ``python manual_test.py`` and check if your changes are in effect.
+If possible, create automated tests for better behaviour control.
+
+Automated testing
++++++++++++++++++
+
+To run automated tests locally, create a virtual environment, install `coverage`
+and run `coverage run setup.py test`.
+
+Third-party support
+-------------------
+
+Products.PDBDebugMode
++++++++++++++++++++++
+
+Zope2 Products.PDBDebugMode_ uses ``ipdb``, if available, in place of ``pdb``.
+
+.. _Products.PDBDebugMode: http://pypi.python.org/pypi/Products.PDBDebugMode
+
+iw.debug
+++++++++
+
+iw.debug_ allows you to trigger an ``ipdb`` debugger on any published object
+of a Zope2 application.
+
+.. _iw.debug: http://pypi.python.org/pypi/iw.debug
+
+ipdbplugin
+++++++++++
+
+ipdbplugin_ is a nose_ test runner plugin that also uses the IPython debugger
+instead of ``pdb``. (It does not depend on ``ipdb`` anymore).
+
+.. _ipdbplugin: http://pypi.python.org/pypi/ipdbplugin
+.. _nose: http://readthedocs.org/docs/nose
+
+
+Changelog
+=========
+
+0.13.9 (2021-06-02)
+-------------------
+
+- Fix again when `pyproject.toml` does not contain `tool` section.
+ [markab108]
+
+
+0.13.8 (2021-05-26)
+-------------------
+
+- Fix when `pyproject.toml` does not contain `tool` section.
+ [anjos]
+
+- Add the convenience function ``iex()``.
+ [alanbernstein]
+
+
+0.13.7 (2021-03-16)
+-------------------
+
+- Do not instantiate IPython on import
+ [adamchainz]
+
+
+0.13.6 (2021-03-08)
+-------------------
+
+- Fix broken parsing of pyproject.toml
+ [alexandrebarbaruiva]
+
+
+0.13.5 (2021-03-02)
+-------------------
+
+- Add support for pyproject.toml as configuration file
+ [alexandrebarbaruiva]
+
+- For users using python 3.4, install 6.0.0 <= IPython < 7.0.0,
+ for users using python 3.5, install 7.0.0 <= IPython < 7.10.0,
+ for users using python 3.6, install 7.10.0 <= IPython < 7.17.0,
+ for users using python>3.6, install IPython >= 7.17.0.
+ [d1618033]
+
+
+0.13.4 (2020-10-01)
+-------------------
+
+- Add '-m' option
+ [mrmino]
+
+
+0.13.3 (2020-06-23)
+-------------------
+
+- Allow runcall, runeval to also use set context value
+ [meowser]
+
+- Add condition argument to set_trace
+ [alexandrebarbaruiva]
+
+
+0.13.2 (2020-03-03)
+-------------------
+
+- Remove leftover debug code
+ [gotcha]
+
+
+0.13.1 (2020-02-28)
+-------------------
+
+- Fix when no configuration file
+ [gotcha]
+
+
+0.13.0 (2020-02-28)
+-------------------
+
+- Add option to set context via environment variable or configuration file
+ [alexandrebarbaruiva]
+
+
+0.12.3 (2019-12-03)
+-------------------
+
+- Fix version in usage
+ [gotcha]
+
+
+0.12.2 (2019-07-30)
+-------------------
+
+- Avoid emitting term-title bytes
+ [steinnes]
+
+
+0.12.1 (2019-07-26)
+-------------------
+
+- Fix --help
+ [native-api]
+
+
+0.12 (2019-03-20)
+-----------------
+
+- Drop support for Python 3.3.x
+ [bmw]
+- Stop deprecation warnings from being raised when IPython >= 5.1 is used.
+ Support for IPython < 5.1 has been dropped.
+ [bmw]
+
+
+0.11 (2018-02-15)
+-----------------
+
+- Simplify loading IPython and getting information from it.
+ Drop support for python 2.6
+ Drop support for IPython < 5.0.0
+ [takluyver]
+
+
+0.10.3 (2017-04-22)
+-------------------
+
+- For users using python 2.6, do not install IPython >= 2.0.0.
+ And for users using python 2.7, do not install IPython >= 6.0.0.
+ [vphilippon]
+- Drop support for python 3.2.
+ [vphilippon]
+- Command line usage consistent with pdb - Add argument commands
+ [zvodd]
+
+
+0.10.2 (2017-01-25)
+-------------------
+
+- Ask IPython which debugger class to use.
+ Closes https://github.com/gotcha/ipdb/issues/105
+ [gnebehay, JBKahn]
+
+- ipdb.set_trace() does not ignore context arg anymore.
+ Closes https://github.com/gotcha/ipdb/issues/93.
+ [gnebehay, Garrett-R]
+
+
+0.10.1 (2016-06-14)
+-------------------
+
+- Support IPython 5.0.
+ [ngoldbaum]
+
+
+0.10.0 (2016-04-29)
+-------------------
+
+- Stop trying to magically guess when stdout needs to be captured.
+ Like needed by `nose`.
+ Rather, provide a set of function that can be called explicitely when needed.
+ [gotcha]
+
+- drop support of IPython before 0.10.2
+
+
+0.9.4 (2016-04-29)
+------------------
+
+- Fix Restart error when using `python -m ipdb`
+ Closes https://github.com/gotcha/ipdb/issues/93.
+ [gotcha]
+
+
+0.9.3 (2016-04-15)
+------------------
+
+- Don't require users to pass a traceback to post_mortem.
+ [Wilfred]
+
+
+0.9.2 (2016-04-15)
+------------------
+
+- Closes https://github.com/gotcha/ipdb/issues/93.
+ [gotcha]
+
+
+0.9.1 (2016-04-12)
+------------------
+
+- Reset ``sys.modules['__main__']`` to original value.
+ Closes https://github.com/gotcha/ipdb/issues/85
+ [gotcha]
+
+- Fix support of IPython versions 0.x
+ [asivokon]
+
+
+0.9.0 (2016-02-22)
+------------------
+
+- Switch to revised BSD license (with approval of all contributors).
+ Closes https://github.com/gotcha/ipdb/issues/68
+ [lebedov, gotcha]
+
+0.8.3 (2016-02-17)
+------------------
+
+- Don't pass sys.argv to IPython for configuration.
+ [emulbreh]
+
+
+0.8.2 (2016-02-15)
+------------------
+
+- Fix lexical comparison for version numbers.
+ [sas23]
+
+- Allow configuring how many lines of code context are displayed
+ by `set_trace`
+ [JamshedVesuna]
+
+- If an instance of IPython is already running its configuration will be
+ loaded.
+ [IxDay]
+
+
+0.8.1 (2015-06-03)
+------------------
+
+- Make Nose support less invasive.
+ Closes https://github.com/gotcha/ipdb/issues/52
+ Closes https://github.com/gotcha/ipdb/issues/31
+ [blink1073, gotcha]
+
+- Fix for post_mortem in context manager.
+ Closes https://github.com/gotcha/ipdb/issues/20
+ [omergertel]
+
+
+0.8 (2013-09-19)
+----------------
+
+- More Python 3 compatibility; implies dropping Python 2.5 support.
+ Closes https://github.com/gotcha/ipdb/issues/37
+ [gotcha]
+
+
+0.7.1 (2013-09-19)
+------------------
+
+- IPython 1.0 compatibility.
+ Closes https://github.com/gotcha/ipdb/issues/44
+ [pgularski]
+
+- Index into version_info in setup.py for Python 2.6 compatibility.
+ [kynan]
+
+- Add Travis CI configuration.
+ [kynan]
+
+0.7 (2012-07-06)
+----------------
+
+- Add ``launch_ipdb_on_exception`` context manager. Implies dropping Python 2.4 support.
+ [Psycojoker]
+
+- Wrap sys.excepthook only once.
+ [marciomazza]
+
+- Add GPL file and refer in headers.
+ [stan3]
+
+- Python 3 support.
+ [Piet Delport]
+
+- Basic tests.
+ [msabramo]
+
+- Added the functions ``runcall``, ``runeval`` and ``run``.
+ [dimasad]
+
+
+0.6.1 (2011-10-17)
+------------------
+
+- State dependency on IPython later or equal to 0.10.
+ [gotcha]
+
+
+0.6 (2011-09-01)
+----------------
+
+- Add setuptools ``console_scripts`` entry point.
+ [akrito, gotcha]
+
+- Nose support.
+ Closes https://github.com/gotcha/ipdb/issues/8
+ [akaihola, gotcha]
+
+
+0.5 (2011-08-05)
+----------------
+
+- IPython 0.11 support.
+ [lebedov]
+
+
+0.4 (2011-06-13)
+----------------
+
+- When used from IPython, use its colors.
+ Closes https://github.com/gotcha/ipdb/issues/1
+ [gotcha]
+
+- Fixed errors when exiting with "q".
+ [gotcha]
+
+- Allow use of ``python -m ipdb mymodule.py``.
+ Python 2.7 only.
+ Closes https://github.com/gotcha/ipdb/issues/3
+ [gotcha]
+
+- Fixed post_mortem when the traceback is None.
+ [maurits]
+
+
+0.3 (2011-01-16)
+----------------
+
+- Add ``post_mortem()`` for ``Products.PDBDebugMode`` support.
+ [Jean Jordaan]
+
+- Moved to github.com.
+
+
+0.2 (2010-10-20)
+----------------
+
+- Added ``pm()``.
+ [Paulo Benedict Ang]
+
+
+0.1 (2010-04-26)
+----------------
+
+- First "non dev" release.
+
+
diff --git a/contrib/python/ipdb/.dist-info/top_level.txt b/contrib/python/ipdb/.dist-info/top_level.txt
new file mode 100644
index 0000000000..19168ea109
--- /dev/null
+++ b/contrib/python/ipdb/.dist-info/top_level.txt
@@ -0,0 +1 @@
+ipdb
diff --git a/contrib/python/ipdb/COPYING.txt b/contrib/python/ipdb/COPYING.txt
new file mode 100644
index 0000000000..2e6b97774c
--- /dev/null
+++ b/contrib/python/ipdb/COPYING.txt
@@ -0,0 +1,30 @@
+Copyright (c) 2007-2019 ipdb development team
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+
+Redistributions in binary form must reproduce the above copyright notice,
+this list of conditions and the following disclaimer in the documentation
+and/or other materials provided with the distribution.
+
+Neither the name of the ipdb Development Team nor the names of its
+contributors may be used to endorse or promote products derived from this
+software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/contrib/python/ipdb/README.rst b/contrib/python/ipdb/README.rst
new file mode 100644
index 0000000000..96f6882d44
--- /dev/null
+++ b/contrib/python/ipdb/README.rst
@@ -0,0 +1,193 @@
+IPython `pdb`
+=============
+
+.. image:: https://travis-ci.org/gotcha/ipdb.png?branch=master
+ :target: https://travis-ci.org/gotcha/ipdb
+.. image:: https://codecov.io/gh/gotcha/ipdb/branch/master/graphs/badge.svg?style=flat
+ :target: https://codecov.io/gh/gotcha/ipdb?branch=master
+
+Use
+---
+
+ipdb exports functions to access the IPython_ debugger, which features
+tab completion, syntax highlighting, better tracebacks, better introspection
+with the same interface as the `pdb` module.
+
+Example usage:
+
+.. code-block:: python
+
+ import ipdb
+ ipdb.set_trace()
+ ipdb.set_trace(context=5) # will show five lines of code
+ # instead of the default three lines
+ # or you can set it via IPDB_CONTEXT_SIZE env variable
+ # or setup.cfg file
+ ipdb.pm()
+ ipdb.run('x[0] = 3')
+ result = ipdb.runcall(function, arg0, arg1, kwarg='foo')
+ result = ipdb.runeval('f(1,2) - 3')
+
+
+Arguments for `set_trace`
++++++++++++++++++++++++++
+
+The `set_trace` function accepts `context` which will show as many lines of code as defined,
+and `cond`, which accepts boolean values (such as `abc == 17`) and will start ipdb's
+interface whenever `cond` equals to `True`.
+
+Using configuration file
+++++++++++++++++++++++++
+
+It's possible to set up context using a `.ipdb` file on your home folder, `setup.cfg`
+or `pyproject.toml` on your project folder. You can also set your file location via
+env var `$IPDB_CONFIG`. Your environment variable has priority over the home
+configuration file, which in turn has priority over the setup config file.
+Currently, only context setting is available.
+
+A valid setup.cfg is as follows
+
+::
+
+ [ipdb]
+ context=5
+
+
+A valid .ipdb is as follows
+
+::
+
+ context=5
+
+
+A valid pyproject.toml is as follows
+
+::
+
+ [tool.ipdb]
+ context=5
+
+
+The post-mortem function, ``ipdb.pm()``, is equivalent to the magic function
+``%debug``.
+
+.. _IPython: http://ipython.org
+
+If you install ``ipdb`` with a tool which supports ``setuptools`` entry points,
+an ``ipdb`` script is made for you. You can use it to debug your python 2 scripts like
+
+::
+
+ $ bin/ipdb mymodule.py
+
+And for python 3
+
+::
+
+ $ bin/ipdb3 mymodule.py
+
+Alternatively with Python 2.7 only, you can also use
+
+::
+
+ $ python -m ipdb mymodule.py
+
+You can also enclose code with the ``with`` statement to launch ipdb if an exception is raised:
+
+.. code-block:: python
+
+ from ipdb import launch_ipdb_on_exception
+
+ with launch_ipdb_on_exception():
+ [...]
+
+.. warning::
+ Context managers were introduced in Python 2.5.
+ Adding a context manager implies dropping Python 2.4 support.
+ Use ``ipdb==0.6`` with 2.4.
+
+Or you can use ``iex`` as a function decorator to launch ipdb if an exception is raised:
+
+.. code-block:: python
+
+ from ipdb import iex
+
+ @iex
+ def main():
+ [...]
+
+.. warning::
+ Using ``from future import print_function`` for Python 3 compat implies dropping Python 2.5 support.
+ Use ``ipdb<=0.8`` with 2.5.
+
+Issues with ``stdout``
+----------------------
+
+Some tools, like ``nose`` fiddle with ``stdout``.
+
+Until ``ipdb==0.9.4``, we tried to guess when we should also
+fiddle with ``stdout`` to support those tools.
+However, all strategies tried until 0.9.4 have proven brittle.
+
+If you use ``nose`` or another tool that fiddles with ``stdout``, you should
+explicitly ask for ``stdout`` fiddling by using ``ipdb`` like this
+
+.. code-block:: python
+
+ import ipdb
+ ipdb.sset_trace()
+ ipdb.spm()
+
+ from ipdb import slaunch_ipdb_on_exception
+ with slaunch_ipdb_on_exception():
+ [...]
+
+
+Development
+-----------
+
+``ipdb`` source code and tracker are at https://github.com/gotcha/ipdb.
+
+Pull requests should take care of updating the changelog ``HISTORY.txt``.
+
+Under the unreleased section, add your changes and your username.
+
+Manual testing
+++++++++++++++
+
+To test your changes, make use of ``manual_test.py``. Create a virtual environment,
+install IPython and run ``python manual_test.py`` and check if your changes are in effect.
+If possible, create automated tests for better behaviour control.
+
+Automated testing
++++++++++++++++++
+
+To run automated tests locally, create a virtual environment, install `coverage`
+and run `coverage run setup.py test`.
+
+Third-party support
+-------------------
+
+Products.PDBDebugMode
++++++++++++++++++++++
+
+Zope2 Products.PDBDebugMode_ uses ``ipdb``, if available, in place of ``pdb``.
+
+.. _Products.PDBDebugMode: http://pypi.python.org/pypi/Products.PDBDebugMode
+
+iw.debug
+++++++++
+
+iw.debug_ allows you to trigger an ``ipdb`` debugger on any published object
+of a Zope2 application.
+
+.. _iw.debug: http://pypi.python.org/pypi/iw.debug
+
+ipdbplugin
+++++++++++
+
+ipdbplugin_ is a nose_ test runner plugin that also uses the IPython debugger
+instead of ``pdb``. (It does not depend on ``ipdb`` anymore).
+
+.. _ipdbplugin: http://pypi.python.org/pypi/ipdbplugin
+.. _nose: http://readthedocs.org/docs/nose
diff --git a/contrib/python/ipdb/ipdb/__init__.py b/contrib/python/ipdb/ipdb/__init__.py
new file mode 100644
index 0000000000..75e8fed02a
--- /dev/null
+++ b/contrib/python/ipdb/ipdb/__init__.py
@@ -0,0 +1,11 @@
+# Copyright (c) 2007-2016 Godefroid Chapelle and ipdb development team
+#
+# This file is part of ipdb.
+# Redistributable under the revised BSD license
+# https://opensource.org/licenses/BSD-3-Clause
+
+from ipdb.__main__ import set_trace, post_mortem, pm, run, iex # noqa
+from ipdb.__main__ import runcall, runeval, launch_ipdb_on_exception # noqa
+
+from ipdb.stdout import sset_trace, spost_mortem, spm # noqa
+from ipdb.stdout import slaunch_ipdb_on_exception # noqa
diff --git a/contrib/python/ipdb/ipdb/__main__.py b/contrib/python/ipdb/ipdb/__main__.py
new file mode 100644
index 0000000000..68dc921dc9
--- /dev/null
+++ b/contrib/python/ipdb/ipdb/__main__.py
@@ -0,0 +1,327 @@
+# Copyright (c) 2011-2016 Godefroid Chapelle and ipdb development team
+#
+# This file is part of ipdb.
+# Redistributable under the revised BSD license
+# https://opensource.org/licenses/BSD-3-Clause
+
+from __future__ import print_function
+import os
+import sys
+
+from decorator import contextmanager
+
+__version__ = '0.13.9'
+
+from IPython import get_ipython
+from IPython.core.debugger import BdbQuit_excepthook
+from IPython.terminal.ipapp import TerminalIPythonApp
+from IPython.terminal.embed import InteractiveShellEmbed
+try:
+ import configparser
+except:
+ import ConfigParser as configparser
+
+
+def _get_debugger_cls():
+ shell = get_ipython()
+ if shell is None:
+ # Not inside IPython
+ # Build a terminal app in order to force ipython to load the
+ # configuration
+ ipapp = TerminalIPythonApp()
+ # Avoid output (banner, prints)
+ ipapp.interact = False
+ ipapp.initialize(["--no-term-title"])
+ shell = ipapp.shell
+ else:
+ # Running inside IPython
+
+ # Detect if embed shell or not and display a message
+ if isinstance(shell, InteractiveShellEmbed):
+ sys.stderr.write(
+ "\nYou are currently into an embedded ipython shell,\n"
+ "the configuration will not be loaded.\n\n"
+ )
+
+ # Let IPython decide about which debugger class to use
+ # This is especially important for tools that fiddle with stdout
+ return shell.debugger_cls
+
+
+def _init_pdb(context=None, commands=[]):
+ if context is None:
+ context = os.getenv("IPDB_CONTEXT_SIZE", get_context_from_config())
+ debugger_cls = _get_debugger_cls()
+ try:
+ p = debugger_cls(context=context)
+ except TypeError:
+ p = debugger_cls()
+ p.rcLines.extend(commands)
+ return p
+
+
+def wrap_sys_excepthook():
+ # make sure we wrap it only once or we would end up with a cycle
+ # BdbQuit_excepthook.excepthook_ori == BdbQuit_excepthook
+ if sys.excepthook != BdbQuit_excepthook:
+ BdbQuit_excepthook.excepthook_ori = sys.excepthook
+ sys.excepthook = BdbQuit_excepthook
+
+
+def set_trace(frame=None, context=None, cond=True):
+ if not cond:
+ return
+ wrap_sys_excepthook()
+ if frame is None:
+ frame = sys._getframe().f_back
+ p = _init_pdb(context).set_trace(frame)
+ if p and hasattr(p, 'shell'):
+ p.shell.restore_sys_module_state()
+
+
+def get_context_from_config():
+ try:
+ parser = get_config()
+ return parser.getint("ipdb", "context")
+ except (configparser.NoSectionError, configparser.NoOptionError):
+ return 3
+ except ValueError:
+ value = parser.get("ipdb", "context")
+ raise ValueError(
+ "In %s, context value [%s] cannot be converted into an integer."
+ % (parser.filepath, value)
+ )
+
+
+class ConfigFile(object):
+ """
+ Filehandle wrapper that adds a "[ipdb]" section to the start of a config
+ file so that users don't actually have to manually add a [ipdb] section.
+ Works with configparser versions from both Python 2 and 3
+ """
+
+ def __init__(self, filepath):
+ self.first = True
+ with open(filepath) as f:
+ self.lines = f.readlines()
+
+ # Python 2.7 (Older dot versions)
+ def readline(self):
+ try:
+ return self.__next__()
+ except StopIteration:
+ return ''
+
+ # Python 2.7 (Newer dot versions)
+ def next(self):
+ return self.__next__()
+
+ # Python 3
+ def __iter__(self):
+ return self
+
+ def __next__(self):
+ if self.first:
+ self.first = False
+ return "[ipdb]\n"
+ if self.lines:
+ return self.lines.pop(0)
+ raise StopIteration
+
+
+def get_config():
+ """
+ Get ipdb config file settings.
+ All available config files are read. If settings are in multiple configs,
+ the last value encountered wins. Values specified on the command-line take
+ precedence over all config file settings.
+ Returns: A ConfigParser object.
+ """
+ parser = configparser.ConfigParser()
+
+ filepaths = []
+
+ # Low priority goes first in the list
+ for cfg_file in ("setup.cfg", ".ipdb", "pyproject.toml"):
+ cwd_filepath = os.path.join(os.getcwd(), cfg_file)
+ if os.path.isfile(cwd_filepath):
+ filepaths.append(cwd_filepath)
+
+ # Medium priority (whenever user wants to set a specific path to config file)
+ home = os.getenv("HOME")
+ if home:
+ default_filepath = os.path.join(home, ".ipdb")
+ if os.path.isfile(default_filepath):
+ filepaths.append(default_filepath)
+
+ # High priority (default files)
+ env_filepath = os.getenv("IPDB_CONFIG")
+ if env_filepath and os.path.isfile(env_filepath):
+ filepaths.append(env_filepath)
+
+ if filepaths:
+ # Python 3 has parser.read_file(iterator) while Python2 has
+ # parser.readfp(obj_with_readline)
+ try:
+ read_func = parser.read_file
+ except AttributeError:
+ read_func = parser.readfp
+ for filepath in filepaths:
+ parser.filepath = filepath
+ # Users are expected to put an [ipdb] section
+ # only if they use setup.cfg
+ if filepath.endswith('setup.cfg'):
+ with open(filepath) as f:
+ parser.remove_section("ipdb")
+ read_func(f)
+ # To use on pyproject.toml, put [tool.ipdb] section
+ elif filepath.endswith('pyproject.toml'):
+ import toml
+ toml_file = toml.load(filepath)
+ if "tool" in toml_file and "ipdb" in toml_file["tool"]:
+ if not parser.has_section("ipdb"):
+ parser.add_section("ipdb")
+ for key, value in toml_file["tool"]["ipdb"].items():
+ parser.set("ipdb", key, str(value))
+ else:
+ read_func(ConfigFile(filepath))
+ return parser
+
+
+def post_mortem(tb=None):
+ wrap_sys_excepthook()
+ p = _init_pdb()
+ p.reset()
+ if tb is None:
+ # sys.exc_info() returns (type, value, traceback) if an exception is
+ # being handled, otherwise it returns None
+ tb = sys.exc_info()[2]
+ if tb:
+ p.interaction(None, tb)
+
+
+def pm():
+ post_mortem(sys.last_traceback)
+
+
+def run(statement, globals=None, locals=None):
+ _init_pdb().run(statement, globals, locals)
+
+
+def runcall(*args, **kwargs):
+ return _init_pdb().runcall(*args, **kwargs)
+
+
+def runeval(expression, globals=None, locals=None):
+ return _init_pdb().runeval(expression, globals, locals)
+
+
+@contextmanager
+def launch_ipdb_on_exception():
+ try:
+ yield
+ except Exception:
+ e, m, tb = sys.exc_info()
+ print(m.__repr__(), file=sys.stderr)
+ post_mortem(tb)
+ finally:
+ pass
+
+
+# iex is a concise alias
+iex = launch_ipdb_on_exception()
+
+
+_usage = """\
+usage: python -m ipdb [-m] [-c command] ... pyfile [arg] ...
+
+Debug the Python program given by pyfile.
+
+Initial commands are read from .pdbrc files in your home directory
+and in the current directory, if they exist. Commands supplied with
+-c are executed after commands from .pdbrc files.
+
+To let the script run until an exception occurs, use "-c continue".
+To let the script run up to a given line X in the debugged file, use
+"-c 'until X'"
+
+Option -m is available only in Python 3.7 and later.
+
+ipdb version %s.""" % __version__
+
+
+def main():
+ import traceback
+ import sys
+ import getopt
+
+ try:
+ from pdb import Restart
+ except ImportError:
+ class Restart(Exception):
+ pass
+
+ if sys.version_info >= (3, 7):
+ opts, args = getopt.getopt(sys.argv[1:], 'mhc:', ['help', 'command='])
+ else:
+ opts, args = getopt.getopt(sys.argv[1:], 'hc:', ['help', 'command='])
+
+ commands = []
+ run_as_module = False
+ for opt, optarg in opts:
+ if opt in ['-h', '--help']:
+ print(_usage)
+ sys.exit()
+ elif opt in ['-c', '--command']:
+ commands.append(optarg)
+ elif opt in ['-m']:
+ run_as_module = True
+
+ if not args:
+ print(_usage)
+ sys.exit(2)
+
+ mainpyfile = args[0] # Get script filename
+ if not run_as_module and not os.path.exists(mainpyfile):
+ print('Error:', mainpyfile, 'does not exist')
+ sys.exit(1)
+
+ sys.argv = args # Hide "pdb.py" from argument list
+
+ # Replace pdb's dir with script's dir in front of module search path.
+ if not run_as_module:
+ sys.path[0] = os.path.dirname(mainpyfile)
+
+ # Note on saving/restoring sys.argv: it's a good idea when sys.argv was
+ # modified by the script being debugged. It's a bad idea when it was
+ # changed by the user from the command line. There is a "restart" command
+ # which allows explicit specification of command line arguments.
+ pdb = _init_pdb(commands=commands)
+ while 1:
+ try:
+ if run_as_module:
+ pdb._runmodule(mainpyfile)
+ else:
+ pdb._runscript(mainpyfile)
+ if pdb._user_requested_quit:
+ break
+ print("The program finished and will be restarted")
+ except Restart:
+ print("Restarting", mainpyfile, "with arguments:")
+ print("\t" + " ".join(sys.argv[1:]))
+ except SystemExit:
+ # In most cases SystemExit does not warrant a post-mortem session.
+ print("The program exited via sys.exit(). Exit status: ", end='')
+ print(sys.exc_info()[1])
+ except:
+ traceback.print_exc()
+ print("Uncaught exception. Entering post mortem debugging")
+ print("Running 'cont' or 'step' will restart the program")
+ t = sys.exc_info()[2]
+ pdb.interaction(None, t)
+ print("Post mortem debugger finished. The " + mainpyfile +
+ " will be restarted")
+
+
+if __name__ == '__main__':
+ main()
diff --git a/contrib/python/ipdb/ipdb/stdout.py b/contrib/python/ipdb/ipdb/stdout.py
new file mode 100644
index 0000000000..933aa12098
--- /dev/null
+++ b/contrib/python/ipdb/ipdb/stdout.py
@@ -0,0 +1,39 @@
+from __future__ import print_function
+import sys
+from contextlib import contextmanager
+from IPython.utils import io
+from .__main__ import set_trace
+from .__main__ import post_mortem
+
+
+def update_stdout():
+ # setup stdout to ensure output is available with nose
+ io.stdout = sys.stdout = sys.__stdout__
+
+
+def sset_trace(frame=None, context=3):
+ update_stdout()
+ if frame is None:
+ frame = sys._getframe().f_back
+ set_trace(frame, context)
+
+
+def spost_mortem(tb=None):
+ update_stdout()
+ post_mortem(tb)
+
+
+def spm():
+ spost_mortem(sys.last_traceback)
+
+
+@contextmanager
+def slaunch_ipdb_on_exception():
+ try:
+ yield
+ except Exception:
+ e, m, tb = sys.exc_info()
+ print(m.__repr__(), file=sys.stderr)
+ spost_mortem(tb)
+ finally:
+ pass
diff --git a/contrib/python/ipdb/ya.make b/contrib/python/ipdb/ya.make
new file mode 100644
index 0000000000..c1c769c05c
--- /dev/null
+++ b/contrib/python/ipdb/ya.make
@@ -0,0 +1,38 @@
+PY23_LIBRARY()
+
+LICENSE(BSD-3-Clause)
+
+OWNER(orivej g:python-contrib)
+
+VERSION(0.13.9)
+
+PEERDIR(
+ contrib/python/decorator
+ contrib/python/ipython
+)
+
+NO_LINT()
+
+PY_SRCS(
+ TOP_LEVEL
+ ipdb/__init__.py
+ ipdb/__main__.py
+ ipdb/stdout.py
+)
+
+NO_CHECK_IMPORTS(
+ # Modules presented below leads to initialization of pdb,
+ # which try to create ~/.ipython/profile_default/history.sqlite-journal,
+ # due to which import tests may crash
+ ipdb.__init__
+ ipdb.__main__
+ ipdb.stdout
+)
+
+RESOURCE_FILES(
+ PREFIX contrib/python/ipdb/
+ .dist-info/METADATA
+ .dist-info/top_level.txt
+)
+
+END()