diff options
author | Devtools Arcadia <arcadia-devtools@yandex-team.ru> | 2022-02-07 18:08:42 +0300 |
---|---|---|
committer | Devtools Arcadia <arcadia-devtools@mous.vla.yp-c.yandex.net> | 2022-02-07 18:08:42 +0300 |
commit | 1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch) | |
tree | e26c9fed0de5d9873cce7e00bc214573dc2195b7 /contrib/python/ipdb | |
download | ydb-1110808a9d39d4b808aef724c861a2e1a38d2a69.tar.gz |
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'contrib/python/ipdb')
-rw-r--r-- | contrib/python/ipdb/.dist-info/METADATA | 586 | ||||
-rw-r--r-- | contrib/python/ipdb/.dist-info/top_level.txt | 1 | ||||
-rw-r--r-- | contrib/python/ipdb/COPYING.txt | 30 | ||||
-rw-r--r-- | contrib/python/ipdb/README.rst | 193 | ||||
-rw-r--r-- | contrib/python/ipdb/ipdb/__init__.py | 11 | ||||
-rw-r--r-- | contrib/python/ipdb/ipdb/__main__.py | 327 | ||||
-rw-r--r-- | contrib/python/ipdb/ipdb/stdout.py | 39 | ||||
-rw-r--r-- | contrib/python/ipdb/ya.make | 38 |
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() |