passagemath-repl 10.5.21__tar.gz → 10.5.23__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/PKG-INFO +4 -4
- passagemath_repl-10.5.23/VERSION.txt +1 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/bin/sage-version.sh +3 -3
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/passagemath_repl.egg-info/PKG-INFO +4 -4
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/passagemath_repl.egg-info/requires.txt +2 -2
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/pyproject.toml +2 -2
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/doctest/forker.py +2 -2
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/doctest/parsing.py +9 -39
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/doctest/sources.py +9 -9
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/doctest/util.py +151 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/interfaces/quit.py +40 -25
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/misc/cython.py +1 -1
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/misc/sage_input.py +4 -4
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/book_stein_ent.py +5 -5
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/computational-mathematics-with-sagemath/float_doctest.py +1 -1
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/computational-mathematics-with-sagemath/integration_doctest.py +3 -3
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/computational-mathematics-with-sagemath/mpoly_doctest.py +5 -5
- passagemath_repl-10.5.21/VERSION.txt +0 -1
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/MANIFEST.in +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/README.rst +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/bin/math-readline +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/bin/sage +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/bin/sage-cachegrind +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/bin/sage-callgrind +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/bin/sage-cleaner +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/bin/sage-coverage +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/bin/sage-cython +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/bin/sage-env +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/bin/sage-env-config.in +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/bin/sage-eval +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/bin/sage-fixdoctests +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/bin/sage-grep +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/bin/sage-grepdoc +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/bin/sage-inline-fortran +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/bin/sage-ipynb2rst +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/bin/sage-ipython +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/bin/sage-list-packages +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/bin/sage-massif +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/bin/sage-notebook +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/bin/sage-num-threads.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/bin/sage-omega +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/bin/sage-preparse +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/bin/sage-python +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/bin/sage-run +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/bin/sage-run-cython +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/bin/sage-runtests +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/bin/sage-src-env-config.in +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/bin/sage-startuptime.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/bin/sage-update-version +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/bin/sage-valgrind +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/bin/sage-venv-config +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/known-test-failures.json +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/passagemath_repl.egg-info/SOURCES.txt +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/passagemath_repl.egg-info/dependency_links.txt +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/passagemath_repl.egg-info/top_level.txt +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/pyproject.toml.m4 +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/requirements-editable.txt.m4 +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/requirements.txt.m4 +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/all__sagemath_repl.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/doctest/__init__.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/doctest/__main__.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/doctest/all.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/doctest/check_tolerance.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/doctest/control.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/doctest/external.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/doctest/fixtures.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/doctest/marked_output.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/doctest/parsing_test.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/doctest/reporting.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/doctest/rif_tol.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/doctest/test.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/doctest/tests/1second.rst +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/doctest/tests/99seconds.rst +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/doctest/tests/abort.rst +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/doctest/tests/atexit.rst +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/doctest/tests/fail_and_die.rst +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/doctest/tests/initial.rst +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/doctest/tests/interrupt.rst +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/doctest/tests/interrupt_diehard.rst +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/doctest/tests/keyboardinterrupt.rst +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/doctest/tests/longtime.rst +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/doctest/tests/nodoctest +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/doctest/tests/random_seed.rst +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/doctest/tests/show_skipped.rst +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/doctest/tests/sig_on.rst +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/doctest/tests/simple_failure.rst +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/doctest/tests/sleep_and_raise.rst +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/doctest/tests/tolerance.rst +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/interfaces/cleaner.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/misc/all__sagemath_repl.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/misc/banner.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/misc/benchmark.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/misc/classgraph.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/misc/copying.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/misc/dev_tools.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/misc/edit_module.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/misc/explain_pickle.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/misc/gperftools.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/misc/inline_fortran.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/misc/messaging.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/misc/pager.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/misc/profiler.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/misc/python.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/misc/remote_file.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/misc/sage_eval.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/misc/sagedoc.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/misc/sh.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/misc/trace.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/__init__.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/all.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/attach.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/configuration.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/display/__init__.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/display/fancy_repr.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/display/formatter.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/display/jsmol_iframe.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/display/pretty_print.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/display/util.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/image.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/inputhook.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/interface_magic.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/interpreter.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/ipython_extension.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/ipython_kernel/__init__.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/ipython_kernel/__main__.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/ipython_kernel/all_jupyter.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/ipython_kernel/install.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/ipython_kernel/interact.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/ipython_kernel/kernel.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/ipython_kernel/widgets.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/ipython_kernel/widgets_sagenb.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/ipython_tests.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/load.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/preparse.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/prompts.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/rich_output/__init__.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/rich_output/backend_base.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/rich_output/backend_doctest.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/rich_output/backend_emacs.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/rich_output/backend_ipython.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/rich_output/buffer.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/rich_output/display_manager.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/rich_output/example.avi +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/rich_output/example.canvas3d +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/rich_output/example.dvi +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/rich_output/example.flv +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/rich_output/example.gif +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/rich_output/example.jpg +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/rich_output/example.mkv +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/rich_output/example.mov +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/rich_output/example.mp4 +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/rich_output/example.ogv +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/rich_output/example.pdf +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/rich_output/example.png +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/rich_output/example.svg +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/rich_output/example.webm +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/rich_output/example.wmv +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/rich_output/example_jmol.spt.zip +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/rich_output/example_wavefront_scene.mtl +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/rich_output/example_wavefront_scene.obj +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/rich_output/output_basic.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/rich_output/output_browser.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/rich_output/output_catalog.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/rich_output/output_graphics.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/rich_output/output_graphics3d.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/rich_output/output_video.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/rich_output/preferences.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/rich_output/pretty_print.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/rich_output/test_backend.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/repl/user_globals.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/all.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/all__sagemath_repl.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/article_heuberger_krenn_kropf_fsm-in-sage.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/arxiv_0812_2725.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/benchmark.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/book_schilling_zabrocki_kschur_primer.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/book_stein_modform.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/__init__.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/computational-mathematics-with-sagemath/README +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/computational-mathematics-with-sagemath/__init__.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/computational-mathematics-with-sagemath/calculus_doctest.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/computational-mathematics-with-sagemath/combinat_doctest.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/computational-mathematics-with-sagemath/domaines_doctest.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/computational-mathematics-with-sagemath/graphique_doctest.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/computational-mathematics-with-sagemath/graphtheory_doctest.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/computational-mathematics-with-sagemath/linalg_doctest.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/computational-mathematics-with-sagemath/linsolve_doctest.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/computational-mathematics-with-sagemath/lp_doctest.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/computational-mathematics-with-sagemath/nonlinear_doctest.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/computational-mathematics-with-sagemath/numbertheory_doctest.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/computational-mathematics-with-sagemath/polynomes_doctest.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/computational-mathematics-with-sagemath/premierspas_doctest.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/computational-mathematics-with-sagemath/programmation_doctest.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/computational-mathematics-with-sagemath/recequadiff_doctest.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/computational-mathematics-with-sagemath/sol/__init__.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/computational-mathematics-with-sagemath/sol/calculus_doctest.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/computational-mathematics-with-sagemath/sol/combinat_doctest.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/computational-mathematics-with-sagemath/sol/domaines_doctest.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/computational-mathematics-with-sagemath/sol/float_doctest.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/computational-mathematics-with-sagemath/sol/graphique_doctest.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/computational-mathematics-with-sagemath/sol/graphtheory_doctest.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/computational-mathematics-with-sagemath/sol/integration_doctest.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/computational-mathematics-with-sagemath/sol/linalg_doctest.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/computational-mathematics-with-sagemath/sol/linsolve_doctest.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/computational-mathematics-with-sagemath/sol/lp_doctest.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/computational-mathematics-with-sagemath/sol/mpoly_doctest.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/computational-mathematics-with-sagemath/sol/nonlinear_doctest.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/computational-mathematics-with-sagemath/sol/numbertheory_doctest.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/computational-mathematics-with-sagemath/sol/polynomes_doctest.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/computational-mathematics-with-sagemath/sol/recequadiff_doctest.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/judson-abstract-algebra/__init__.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/judson-abstract-algebra/actions-sage-exercises.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/judson-abstract-algebra/actions-sage.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/judson-abstract-algebra/algcodes-sage.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/judson-abstract-algebra/boolean-sage.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/judson-abstract-algebra/cosets-sage-exercises.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/judson-abstract-algebra/cosets-sage.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/judson-abstract-algebra/crypt-sage.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/judson-abstract-algebra/cyclic-sage.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/judson-abstract-algebra/domains-sage.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/judson-abstract-algebra/fields-sage.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/judson-abstract-algebra/finite-sage.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/judson-abstract-algebra/galois-sage.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/judson-abstract-algebra/groups-sage.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/judson-abstract-algebra/homomorph-sage-exercises.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/judson-abstract-algebra/homomorph-sage.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/judson-abstract-algebra/integers-sage.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/judson-abstract-algebra/isomorph-sage.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/judson-abstract-algebra/normal-sage.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/judson-abstract-algebra/permute-sage.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/judson-abstract-algebra/poly-sage.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/judson-abstract-algebra/rings-sage.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/judson-abstract-algebra/sets-sage.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/judson-abstract-algebra/struct-sage.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/judson-abstract-algebra/sylow-sage.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/judson-abstract-algebra/vect-sage-exercises.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/books/judson-abstract-algebra/vect-sage.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/cmdline.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/combinatorial_hopf_algebras.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/finite_poset.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/functools_partial_src.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/gosper-sum.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/lazy_imports.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/memcheck/__init__.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/memcheck/run_tests.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/memcheck/run_tests_in_valgrind.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/memcheck/symbolic_expression.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/memcheck/verify_no_leak.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/meson.build +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/modular_group_cohomology.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/numpy.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/parigp.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/startup.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/symbolic-series.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/sympy.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/sage/tests/test_deprecation.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/setup.cfg +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/setup.py +0 -0
- {passagemath_repl-10.5.21 → passagemath_repl-10.5.23}/tox.ini +0 -0
@@ -1,6 +1,6 @@
|
|
1
|
-
Metadata-Version: 2.
|
1
|
+
Metadata-Version: 2.4
|
2
2
|
Name: passagemath-repl
|
3
|
-
Version: 10.5.
|
3
|
+
Version: 10.5.23
|
4
4
|
Summary: passagemath: IPython kernel, Sage preparser, doctester
|
5
5
|
Author-email: The Sage Developers <sage-support@googlegroups.com>
|
6
6
|
Maintainer: Matthias Köppe, passagemath contributors
|
@@ -29,8 +29,8 @@ Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
29
29
|
Classifier: Topic :: Scientific/Engineering :: Mathematics
|
30
30
|
Requires-Python: <3.14,>=3.9
|
31
31
|
Description-Content-Type: text/x-rst
|
32
|
-
Requires-Dist: passagemath-objects~=10.5.
|
33
|
-
Requires-Dist: passagemath-environment~=10.5.
|
32
|
+
Requires-Dist: passagemath-objects~=10.5.23.0
|
33
|
+
Requires-Dist: passagemath-environment~=10.5.23.0
|
34
34
|
Requires-Dist: ipykernel>=5.2.1
|
35
35
|
Requires-Dist: ipython>=7.13.0
|
36
36
|
Requires-Dist: ipywidgets>=7.5.1
|
@@ -0,0 +1 @@
|
|
1
|
+
10.5.23
|
@@ -4,6 +4,6 @@
|
|
4
4
|
# which stops "setup.py develop" from rewriting it as a Python file.
|
5
5
|
:
|
6
6
|
# This file is auto-generated by the sage-update-version script, do not edit!
|
7
|
-
SAGE_VERSION='10.5.
|
8
|
-
SAGE_RELEASE_DATE='2025-
|
9
|
-
SAGE_VERSION_BANNER='passagemath version 10.5.
|
7
|
+
SAGE_VERSION='10.5.23'
|
8
|
+
SAGE_RELEASE_DATE='2025-04-02'
|
9
|
+
SAGE_VERSION_BANNER='passagemath version 10.5.23, Release Date: 2025-04-02'
|
@@ -1,6 +1,6 @@
|
|
1
|
-
Metadata-Version: 2.
|
1
|
+
Metadata-Version: 2.4
|
2
2
|
Name: passagemath-repl
|
3
|
-
Version: 10.5.
|
3
|
+
Version: 10.5.23
|
4
4
|
Summary: passagemath: IPython kernel, Sage preparser, doctester
|
5
5
|
Author-email: The Sage Developers <sage-support@googlegroups.com>
|
6
6
|
Maintainer: Matthias Köppe, passagemath contributors
|
@@ -29,8 +29,8 @@ Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
29
29
|
Classifier: Topic :: Scientific/Engineering :: Mathematics
|
30
30
|
Requires-Python: <3.14,>=3.9
|
31
31
|
Description-Content-Type: text/x-rst
|
32
|
-
Requires-Dist: passagemath-objects~=10.5.
|
33
|
-
Requires-Dist: passagemath-environment~=10.5.
|
32
|
+
Requires-Dist: passagemath-objects~=10.5.23.0
|
33
|
+
Requires-Dist: passagemath-environment~=10.5.23.0
|
34
34
|
Requires-Dist: ipykernel>=5.2.1
|
35
35
|
Requires-Dist: ipython>=7.13.0
|
36
36
|
Requires-Dist: ipywidgets>=7.5.1
|
@@ -10,8 +10,8 @@ build-backend = "setuptools.build_meta"
|
|
10
10
|
name = "passagemath-repl"
|
11
11
|
description = "passagemath: IPython kernel, Sage preparser, doctester"
|
12
12
|
dependencies = [
|
13
|
-
'passagemath-objects ~= 10.5.
|
14
|
-
'passagemath-environment ~= 10.5.
|
13
|
+
'passagemath-objects ~= 10.5.23.0',
|
14
|
+
'passagemath-environment ~= 10.5.23.0',
|
15
15
|
'ipykernel >=5.2.1',
|
16
16
|
'ipython >=7.13.0',
|
17
17
|
'ipywidgets >=7.5.1',
|
@@ -1829,8 +1829,8 @@ class DocTestDispatcher(SageObject):
|
|
1829
1829
|
|
1830
1830
|
sage: # needs sage.all
|
1831
1831
|
sage: from tempfile import NamedTemporaryFile as NTF
|
1832
|
-
sage: with NTF(suffix='.py', mode='w+t') as f1,
|
1833
|
-
....:
|
1832
|
+
sage: with (NTF(suffix='.py', mode='w+t') as f1,
|
1833
|
+
....: NTF(suffix='.py', mode='w+t') as f2):
|
1834
1834
|
....: _ = f1.write("'''\nsage: import time; time.sleep(60)\n'''")
|
1835
1835
|
....: f1.flush()
|
1836
1836
|
....: _ = f2.write("'''\nsage: True\nFalse\n'''")
|
@@ -880,26 +880,6 @@ class SageDocTestParser(doctest.DocTestParser):
|
|
880
880
|
sage: ex.source
|
881
881
|
'for i in range(Integer(4)):\n print(i)\n'
|
882
882
|
|
883
|
-
Sage currently accepts backslashes as indicating that the end
|
884
|
-
of the current line should be joined to the next line. This
|
885
|
-
feature allows for breaking large integers over multiple lines
|
886
|
-
but is not standard for Python doctesting. It's not
|
887
|
-
guaranteed to persist::
|
888
|
-
|
889
|
-
sage: n = 1234\
|
890
|
-
....: 5678
|
891
|
-
sage: print(n)
|
892
|
-
12345678
|
893
|
-
sage: type(n)
|
894
|
-
<class 'sage.rings.integer.Integer'>
|
895
|
-
|
896
|
-
It also works without the line continuation::
|
897
|
-
|
898
|
-
sage: m = 8765\
|
899
|
-
4321
|
900
|
-
sage: print(m)
|
901
|
-
87654321
|
902
|
-
|
903
883
|
Optional tags at the start of an example block persist to the end of
|
904
884
|
the block (delimited by a blank line)::
|
905
885
|
|
@@ -994,15 +974,15 @@ class SageDocTestParser(doctest.DocTestParser):
|
|
994
974
|
sage: # needs sage.combinat
|
995
975
|
sage: parse("::\n\n sage: # needs sage.combinat\n sage: from sage.geometry.polyhedron.combinatorial_polyhedron.conversions \\\n ....: import incidence_matrix_to_bit_rep_of_Vrep\n sage: P = polytopes.associahedron(['A',3])\n\n")
|
996
976
|
['::\n\n',
|
997
|
-
|
998
|
-
|
999
|
-
|
1000
|
-
|
1001
|
-
|
1002
|
-
|
1003
|
-
|
1004
|
-
|
1005
|
-
|
977
|
+
'',
|
978
|
+
(None,
|
979
|
+
'from sage.geometry.polyhedron.combinatorial_polyhedron.conversions \\\n import incidence_matrix_to_bit_rep_of_Vrep\n',
|
980
|
+
'from sage.geometry.polyhedron.combinatorial_polyhedron.conversions import incidence_matrix_to_bit_rep_of_Vrep\n'),
|
981
|
+
'',
|
982
|
+
(None,
|
983
|
+
"P = polytopes.associahedron(['A',3])\n",
|
984
|
+
"P = polytopes.associahedron(['A',Integer(3)])\n"),
|
985
|
+
'\n']
|
1006
986
|
|
1007
987
|
sage: example4 = '::\n\n sage: C.minimum_distance(algorithm="guava") # optional - guava\n ...\n 24\n\n'
|
1008
988
|
sage: parsed4 = DTP.parse(example4)
|
@@ -1017,20 +997,10 @@ class SageDocTestParser(doctest.DocTestParser):
|
|
1017
997
|
find_sage_continuation = re.compile(r"^(\s*)\.\.\.\.:", re.M)
|
1018
998
|
find_python_continuation = re.compile(r"^(\s*)\.\.\.([^\.])", re.M)
|
1019
999
|
python_prompt = re.compile(r"^(\s*)>>>", re.M)
|
1020
|
-
backslash_replacer = re.compile(r"""(\s*)sage:(.*)\\\ *
|
1021
|
-
\ *((\.){4}:)?\ *""")
|
1022
1000
|
|
1023
1001
|
# The following are used to allow ... at the beginning of output
|
1024
1002
|
ellipsis_tag = "<TEMP_ELLIPSIS_TAG>"
|
1025
1003
|
|
1026
|
-
# Hack for non-standard backslash line escapes accepted by the current
|
1027
|
-
# doctest system.
|
1028
|
-
m = backslash_replacer.search(string)
|
1029
|
-
while m is not None:
|
1030
|
-
g = m.groups()
|
1031
|
-
string = string[:m.start()] + g[0] + "sage:" + g[1] + string[m.end():]
|
1032
|
-
m = backslash_replacer.search(string, m.start())
|
1033
|
-
|
1034
1004
|
replace_ellipsis = not python_prompt.search(string)
|
1035
1005
|
if replace_ellipsis:
|
1036
1006
|
# There are no >>> prompts, so we can allow ... to begin the output
|
@@ -212,7 +212,7 @@ class DocTestSource:
|
|
212
212
|
sage: from sage.doctest.control import DocTestDefaults
|
213
213
|
sage: from sage.doctest.sources import FileDocTestSource
|
214
214
|
sage: from sage.doctest.parsing import SageDocTestParser
|
215
|
-
sage: filename = sage.doctest.
|
215
|
+
sage: filename = sage.doctest.marked_output.__file__
|
216
216
|
sage: FDS = FileDocTestSource(filename, DocTestDefaults())
|
217
217
|
sage: doctests, _ = FDS.create_doctests({})
|
218
218
|
sage: manual_doctests = []
|
@@ -923,7 +923,7 @@ class SourceLanguage:
|
|
923
923
|
sage: from sage.doctest.sources import FileDocTestSource
|
924
924
|
sage: from sage.doctest.parsing import SageDocTestParser
|
925
925
|
sage: from sage.doctest.util import NestedName
|
926
|
-
sage: filename = sage.doctest.
|
926
|
+
sage: filename = sage.doctest.marked_output.__file__
|
927
927
|
sage: FDS = FileDocTestSource(filename, DocTestDefaults())
|
928
928
|
sage: doctests, _ = FDS.create_doctests({})
|
929
929
|
sage: for dt in doctests:
|
@@ -943,7 +943,7 @@ class PythonSource(SourceLanguage):
|
|
943
943
|
|
944
944
|
sage: from sage.doctest.control import DocTestDefaults
|
945
945
|
sage: from sage.doctest.sources import FileDocTestSource
|
946
|
-
sage: filename = sage.doctest.
|
946
|
+
sage: filename = sage.doctest.marked_output.__file__
|
947
947
|
sage: FDS = FileDocTestSource(filename, DocTestDefaults())
|
948
948
|
sage: type(FDS)
|
949
949
|
<class 'sage.doctest.sources.PythonFileSource'>
|
@@ -959,7 +959,7 @@ class PythonSource(SourceLanguage):
|
|
959
959
|
|
960
960
|
sage: from sage.doctest.control import DocTestDefaults
|
961
961
|
sage: from sage.doctest.sources import FileDocTestSource
|
962
|
-
sage: filename = sage.doctest.
|
962
|
+
sage: filename = sage.doctest.marked_output.__file__
|
963
963
|
sage: FDS = FileDocTestSource(filename, DocTestDefaults())
|
964
964
|
sage: FDS._init()
|
965
965
|
sage: FDS.last_indent
|
@@ -994,7 +994,7 @@ class PythonSource(SourceLanguage):
|
|
994
994
|
|
995
995
|
sage: from sage.doctest.control import DocTestDefaults
|
996
996
|
sage: from sage.doctest.sources import FileDocTestSource
|
997
|
-
sage: filename = sage.doctest.
|
997
|
+
sage: filename = sage.doctest.marked_output.__file__
|
998
998
|
sage: FDS = FileDocTestSource(filename, DocTestDefaults())
|
999
999
|
sage: FDS._init()
|
1000
1000
|
sage: FDS._update_quotetype('\"\"\"'); print(" ".join(list(FDS.quotetype)))
|
@@ -1087,7 +1087,7 @@ class PythonSource(SourceLanguage):
|
|
1087
1087
|
sage: from sage.doctest.control import DocTestDefaults
|
1088
1088
|
sage: from sage.doctest.sources import FileDocTestSource
|
1089
1089
|
sage: from sage.doctest.util import NestedName
|
1090
|
-
sage: filename = sage.doctest.
|
1090
|
+
sage: filename = sage.doctest.marked_output.__file__
|
1091
1091
|
sage: FDS = FileDocTestSource(filename, DocTestDefaults())
|
1092
1092
|
sage: FDS._init()
|
1093
1093
|
sage: FDS.starting_docstring("r'''")
|
@@ -1100,7 +1100,7 @@ class PythonSource(SourceLanguage):
|
|
1100
1100
|
sage: FDS.starting_docstring(" '''")
|
1101
1101
|
<...Match object...>
|
1102
1102
|
sage: FDS.qualified_name
|
1103
|
-
sage.doctest.
|
1103
|
+
sage.doctest.marked_output.MyClass.hello_world
|
1104
1104
|
sage: FDS.ending_docstring(" '''")
|
1105
1105
|
<...Match object...>
|
1106
1106
|
sage: FDS.starting_docstring("class NewClass():")
|
@@ -1109,7 +1109,7 @@ class PythonSource(SourceLanguage):
|
|
1109
1109
|
sage: FDS.ending_docstring(" '''")
|
1110
1110
|
<...Match object...>
|
1111
1111
|
sage: FDS.qualified_name
|
1112
|
-
sage.doctest.
|
1112
|
+
sage.doctest.marked_output.NewClass
|
1113
1113
|
sage: FDS.starting_docstring("print(")
|
1114
1114
|
sage: FDS.starting_docstring(" '''Not a docstring")
|
1115
1115
|
sage: FDS.starting_docstring(" ''')")
|
@@ -1160,7 +1160,7 @@ class PythonSource(SourceLanguage):
|
|
1160
1160
|
sage: from sage.doctest.control import DocTestDefaults
|
1161
1161
|
sage: from sage.doctest.sources import FileDocTestSource
|
1162
1162
|
sage: from sage.doctest.util import NestedName
|
1163
|
-
sage: filename = sage.doctest.
|
1163
|
+
sage: filename = sage.doctest.marked_output.__file__
|
1164
1164
|
sage: FDS = FileDocTestSource(filename, DocTestDefaults())
|
1165
1165
|
sage: FDS._init()
|
1166
1166
|
sage: FDS.quotetype = "'''"
|
@@ -25,6 +25,8 @@ AUTHORS:
|
|
25
25
|
|
26
26
|
from time import time as walltime
|
27
27
|
from os import sysconf, times
|
28
|
+
from contextlib import contextmanager
|
29
|
+
from cysignals.alarm import alarm, cancel_alarm, AlarmInterrupt
|
28
30
|
|
29
31
|
|
30
32
|
def count_noun(number, noun, plural=None, pad_number=False, pad_noun=False):
|
@@ -750,3 +752,152 @@ class NestedName:
|
|
750
752
|
True
|
751
753
|
"""
|
752
754
|
return not (self == other)
|
755
|
+
|
756
|
+
|
757
|
+
@contextmanager
|
758
|
+
def ensure_interruptible_after(seconds: float, max_wait_after_interrupt: float = 0.2, inaccuracy_tolerance: float = 0.1):
|
759
|
+
"""
|
760
|
+
Helper function for doctesting to ensure that the code is interruptible after a certain amount of time.
|
761
|
+
This should only be used for internal doctesting purposes.
|
762
|
+
|
763
|
+
EXAMPLES::
|
764
|
+
|
765
|
+
sage: from sage.doctest.util import ensure_interruptible_after
|
766
|
+
sage: with ensure_interruptible_after(1) as data: sleep(3)
|
767
|
+
|
768
|
+
``as data`` is optional, but if it is used, it will contain a few useful values::
|
769
|
+
|
770
|
+
sage: data
|
771
|
+
{'alarm_raised': True, 'elapsed': 1...}
|
772
|
+
|
773
|
+
``max_wait_after_interrupt`` can be passed if the function may take longer than usual to be interrupted::
|
774
|
+
|
775
|
+
sage: # needs sage.misc.cython
|
776
|
+
sage: cython(r'''
|
777
|
+
....: from posix.time cimport clock_gettime, CLOCK_REALTIME, timespec, time_t
|
778
|
+
....: from cysignals.signals cimport sig_check
|
779
|
+
....:
|
780
|
+
....: cpdef void uninterruptible_sleep(double seconds):
|
781
|
+
....: cdef timespec start_time, target_time
|
782
|
+
....: clock_gettime(CLOCK_REALTIME, &start_time)
|
783
|
+
....:
|
784
|
+
....: cdef time_t floor_seconds = <time_t>seconds
|
785
|
+
....: target_time.tv_sec = start_time.tv_sec + floor_seconds
|
786
|
+
....: target_time.tv_nsec = start_time.tv_nsec + <long>((seconds - floor_seconds) * 1e9)
|
787
|
+
....: if target_time.tv_nsec >= 1000000000:
|
788
|
+
....: target_time.tv_nsec -= 1000000000
|
789
|
+
....: target_time.tv_sec += 1
|
790
|
+
....:
|
791
|
+
....: while True:
|
792
|
+
....: clock_gettime(CLOCK_REALTIME, &start_time)
|
793
|
+
....: if start_time.tv_sec > target_time.tv_sec or (start_time.tv_sec == target_time.tv_sec and start_time.tv_nsec >= target_time.tv_nsec):
|
794
|
+
....: break
|
795
|
+
....:
|
796
|
+
....: cpdef void check_interrupt_only_occasionally():
|
797
|
+
....: for i in range(10):
|
798
|
+
....: uninterruptible_sleep(0.8)
|
799
|
+
....: sig_check()
|
800
|
+
....: ''')
|
801
|
+
sage: with ensure_interruptible_after(1): # not passing max_wait_after_interrupt will raise an error
|
802
|
+
....: check_interrupt_only_occasionally()
|
803
|
+
Traceback (most recent call last):
|
804
|
+
...
|
805
|
+
RuntimeError: Function is not interruptible within 1.0000 seconds, only after 1.60... seconds
|
806
|
+
sage: with ensure_interruptible_after(1, max_wait_after_interrupt=0.9):
|
807
|
+
....: check_interrupt_only_occasionally()
|
808
|
+
|
809
|
+
TESTS::
|
810
|
+
|
811
|
+
sage: with ensure_interruptible_after(2) as data: sleep(1)
|
812
|
+
Traceback (most recent call last):
|
813
|
+
...
|
814
|
+
RuntimeError: Function terminates early after 1... < 2.0000 seconds
|
815
|
+
sage: data
|
816
|
+
{'alarm_raised': False, 'elapsed': 1...}
|
817
|
+
|
818
|
+
The test above requires a large tolerance, because both ``time.sleep`` and
|
819
|
+
``from posix.unistd cimport usleep`` may have slowdown on the order of 0.1s on Mac,
|
820
|
+
likely because the system is idle and GitHub CI switches the program out,
|
821
|
+
and context switch back takes time. Besides, there is an issue with ``Integer``
|
822
|
+
destructor, see `<https://github.com/sagemath/cysignals/issues/215>`_
|
823
|
+
So we use busy wait and Python integers::
|
824
|
+
|
825
|
+
sage: # needs sage.misc.cython
|
826
|
+
sage: cython(r'''
|
827
|
+
....: from posix.time cimport clock_gettime, CLOCK_REALTIME, timespec, time_t
|
828
|
+
....: from cysignals.signals cimport sig_check
|
829
|
+
....:
|
830
|
+
....: cpdef void interruptible_sleep(double seconds):
|
831
|
+
....: cdef timespec start_time, target_time
|
832
|
+
....: clock_gettime(CLOCK_REALTIME, &start_time)
|
833
|
+
....:
|
834
|
+
....: cdef time_t floor_seconds = <time_t>seconds
|
835
|
+
....: target_time.tv_sec = start_time.tv_sec + floor_seconds
|
836
|
+
....: target_time.tv_nsec = start_time.tv_nsec + <long>((seconds - floor_seconds) * 1e9)
|
837
|
+
....: if target_time.tv_nsec >= 1000000000:
|
838
|
+
....: target_time.tv_nsec -= 1000000000
|
839
|
+
....: target_time.tv_sec += 1
|
840
|
+
....:
|
841
|
+
....: while True:
|
842
|
+
....: sig_check()
|
843
|
+
....: clock_gettime(CLOCK_REALTIME, &start_time)
|
844
|
+
....: if start_time.tv_sec > target_time.tv_sec or (start_time.tv_sec == target_time.tv_sec and start_time.tv_nsec >= target_time.tv_nsec):
|
845
|
+
....: break
|
846
|
+
....: ''')
|
847
|
+
sage: with ensure_interruptible_after(2) as data: interruptible_sleep(1r)
|
848
|
+
Traceback (most recent call last):
|
849
|
+
...
|
850
|
+
RuntimeError: Function terminates early after 1.00... < 2.0000 seconds
|
851
|
+
sage: with ensure_interruptible_after(1) as data: uninterruptible_sleep(2r)
|
852
|
+
Traceback (most recent call last):
|
853
|
+
...
|
854
|
+
RuntimeError: Function is not interruptible within 1.0000 seconds, only after 2.00... seconds
|
855
|
+
sage: data
|
856
|
+
{'alarm_raised': True, 'elapsed': 2.0...}
|
857
|
+
sage: with ensure_interruptible_after(1): uninterruptible_sleep(2r); raise RuntimeError
|
858
|
+
Traceback (most recent call last):
|
859
|
+
...
|
860
|
+
RuntimeError: Function is not interruptible within 1.0000 seconds, only after 2.00... seconds
|
861
|
+
sage: data
|
862
|
+
{'alarm_raised': True, 'elapsed': 2.0...}
|
863
|
+
|
864
|
+
::
|
865
|
+
|
866
|
+
sage: with ensure_interruptible_after(1) as data: raise ValueError
|
867
|
+
Traceback (most recent call last):
|
868
|
+
...
|
869
|
+
ValueError
|
870
|
+
sage: data
|
871
|
+
{'alarm_raised': False, 'elapsed': ...}
|
872
|
+
"""
|
873
|
+
seconds = float(seconds)
|
874
|
+
max_wait_after_interrupt = float(max_wait_after_interrupt)
|
875
|
+
inaccuracy_tolerance = float(inaccuracy_tolerance)
|
876
|
+
# use Python float to avoid slowdown with Sage Integer (see https://github.com/sagemath/cysignals/issues/215)
|
877
|
+
data = {}
|
878
|
+
start_time = walltime()
|
879
|
+
alarm(seconds)
|
880
|
+
alarm_raised = False
|
881
|
+
|
882
|
+
try:
|
883
|
+
yield data
|
884
|
+
except AlarmInterrupt as e:
|
885
|
+
e.__traceback__ = None # workaround for https://github.com/python/cpython/pull/129276
|
886
|
+
alarm_raised = True
|
887
|
+
finally:
|
888
|
+
before_cancel_alarm_elapsed = walltime() - start_time
|
889
|
+
cancel_alarm()
|
890
|
+
elapsed = walltime() - start_time
|
891
|
+
data["elapsed"] = elapsed
|
892
|
+
data["alarm_raised"] = alarm_raised
|
893
|
+
|
894
|
+
if elapsed > seconds + max_wait_after_interrupt:
|
895
|
+
raise RuntimeError(
|
896
|
+
f"Function is not interruptible within {seconds:.4f} seconds, only after {elapsed:.4f} seconds"
|
897
|
+
+ ("" if alarm_raised else " (__exit__ called before interrupt check)"))
|
898
|
+
|
899
|
+
if alarm_raised:
|
900
|
+
if elapsed < seconds - inaccuracy_tolerance:
|
901
|
+
raise RuntimeError(f"Interrupted too early: {elapsed:.4f} < {seconds:.4f}, this should not happen")
|
902
|
+
else:
|
903
|
+
raise RuntimeError(f"Function terminates early after {elapsed:.4f} < {seconds:.4f} seconds")
|
@@ -12,13 +12,24 @@ Quitting interfaces
|
|
12
12
|
# https://www.gnu.org/licenses/
|
13
13
|
################################################################################
|
14
14
|
|
15
|
+
from __future__ import annotations
|
16
|
+
|
15
17
|
import os
|
18
|
+
import subprocess
|
19
|
+
import sys
|
20
|
+
from typing import TYPE_CHECKING
|
16
21
|
|
22
|
+
from sage.env import DOT_SAGE, HOSTNAME
|
17
23
|
from sage.misc.cachefunc import cached_function
|
18
24
|
|
25
|
+
if TYPE_CHECKING:
|
26
|
+
from weakref import ReferenceType
|
27
|
+
|
28
|
+
from sage.interfaces.expect import Expect
|
29
|
+
|
19
30
|
|
20
31
|
@cached_function
|
21
|
-
def sage_spawned_process_file():
|
32
|
+
def sage_spawned_process_file() -> str:
|
22
33
|
"""
|
23
34
|
EXAMPLES::
|
24
35
|
|
@@ -29,23 +40,22 @@ def sage_spawned_process_file():
|
|
29
40
|
# This is the old value of SAGE_TMP. Until sage-cleaner is
|
30
41
|
# completely removed, we need to leave these spawned_processes
|
31
42
|
# files where sage-cleaner will look for them.
|
32
|
-
from sage.env import DOT_SAGE, HOSTNAME
|
33
43
|
d = os.path.join(DOT_SAGE, "temp", HOSTNAME, str(os.getpid()))
|
34
44
|
os.makedirs(d, exist_ok=True)
|
35
45
|
return os.path.join(d, "spawned_processes")
|
36
46
|
|
37
47
|
|
38
|
-
def register_spawned_process(pid, cmd=
|
48
|
+
def register_spawned_process(pid: int, cmd: str = "") -> None:
|
39
49
|
"""
|
40
50
|
Write a line to the ``spawned_processes`` file with the given
|
41
51
|
``pid`` and ``cmd``.
|
42
52
|
"""
|
43
|
-
if cmd !=
|
53
|
+
if cmd != "":
|
44
54
|
cmd = cmd.strip().split()[0]
|
45
55
|
# This is safe, since only this process writes to this file.
|
46
56
|
try:
|
47
|
-
with open(sage_spawned_process_file(),
|
48
|
-
|
57
|
+
with open(sage_spawned_process_file(), "a") as file:
|
58
|
+
file.write("%s %s\n" % (pid, cmd))
|
49
59
|
except OSError:
|
50
60
|
pass
|
51
61
|
else:
|
@@ -53,13 +63,14 @@ def register_spawned_process(pid, cmd=''):
|
|
53
63
|
# the cleaner ourselves upon being told that there will be
|
54
64
|
# something to clean.
|
55
65
|
from sage.interfaces.cleaner import start_cleaner
|
66
|
+
|
56
67
|
start_cleaner()
|
57
68
|
|
58
69
|
|
59
|
-
expect_objects = []
|
70
|
+
expect_objects: list[ReferenceType[Expect]] = []
|
60
71
|
|
61
72
|
|
62
|
-
def expect_quitall(verbose=False):
|
73
|
+
def expect_quitall(verbose: bool = False) -> None:
|
63
74
|
"""
|
64
75
|
EXAMPLES::
|
65
76
|
|
@@ -74,17 +85,17 @@ def expect_quitall(verbose=False):
|
|
74
85
|
sage: sage.interfaces.quit.expect_quitall(verbose=True) # needs sage.libs.pari
|
75
86
|
Exiting PARI/GP interpreter with PID ... running .../gp --fast --emacs --quiet --stacksize 10000000
|
76
87
|
"""
|
77
|
-
for
|
78
|
-
|
79
|
-
if
|
88
|
+
for reference in expect_objects:
|
89
|
+
process = reference()
|
90
|
+
if process is not None:
|
80
91
|
try:
|
81
|
-
|
92
|
+
process.quit(verbose=verbose)
|
82
93
|
except RuntimeError:
|
83
94
|
pass
|
84
95
|
kill_spawned_jobs()
|
85
96
|
|
86
97
|
|
87
|
-
def kill_spawned_jobs(verbose=False):
|
98
|
+
def kill_spawned_jobs(verbose: bool = False):
|
88
99
|
"""
|
89
100
|
INPUT:
|
90
101
|
|
@@ -110,19 +121,23 @@ def kill_spawned_jobs(verbose=False):
|
|
110
121
|
if not os.path.exists(fname):
|
111
122
|
return
|
112
123
|
|
113
|
-
with open(fname) as
|
114
|
-
for
|
115
|
-
i =
|
116
|
-
pid =
|
124
|
+
with open(fname) as file:
|
125
|
+
for line in file:
|
126
|
+
i = line.find(" ")
|
127
|
+
pid = line[:i].strip()
|
117
128
|
try:
|
118
129
|
if verbose:
|
119
130
|
print("Killing spawned job %s" % pid)
|
120
|
-
|
131
|
+
if sys.platform == "win32":
|
132
|
+
# From https://stackoverflow.com/a/47756757/873661
|
133
|
+
subprocess.call(["taskkill", "/F", "/T", "/PID", pid])
|
134
|
+
else:
|
135
|
+
os.killpg(int(pid), 9)
|
121
136
|
except OSError:
|
122
137
|
pass
|
123
138
|
|
124
139
|
|
125
|
-
def is_running(pid):
|
140
|
+
def is_running(pid: int) -> bool:
|
126
141
|
"""
|
127
142
|
Return ``True`` if and only if there is a process with id pid running.
|
128
143
|
"""
|
@@ -133,11 +148,11 @@ def is_running(pid):
|
|
133
148
|
return False
|
134
149
|
|
135
150
|
|
136
|
-
def invalidate_all():
|
151
|
+
def invalidate_all() -> None:
|
137
152
|
"""
|
138
153
|
Invalidate all of the expect interfaces.
|
139
154
|
|
140
|
-
This is used, e.g., by the fork-based
|
155
|
+
This is used, e.g., by the fork-based ``@parallel`` decorator.
|
141
156
|
|
142
157
|
EXAMPLES::
|
143
158
|
|
@@ -157,7 +172,7 @@ def invalidate_all():
|
|
157
172
|
sage: a, b # needs sage.libs.pari sage.symbolic
|
158
173
|
(2, 3)
|
159
174
|
"""
|
160
|
-
for
|
161
|
-
|
162
|
-
if
|
163
|
-
|
175
|
+
for reference in expect_objects:
|
176
|
+
process = reference()
|
177
|
+
if process:
|
178
|
+
process.detach()
|
@@ -61,7 +61,7 @@ def _standard_libs_libdirs_incdirs_aliases():
|
|
61
61
|
if SAGE_LOCAL:
|
62
62
|
standard_libdirs.append(os.path.join(SAGE_LOCAL, "lib"))
|
63
63
|
standard_libdirs.extend(aliases["CBLAS_LIBDIR"] + aliases["NTL_LIBDIR"])
|
64
|
-
standard_incdirs = sage_include_directories() + aliases["CBLAS_INCDIR"] + aliases["NTL_INCDIR"]
|
64
|
+
standard_incdirs = sage_include_directories(use_sources=True) + aliases["CBLAS_INCDIR"] + aliases["NTL_INCDIR"]
|
65
65
|
return standard_libs, standard_libdirs, standard_incdirs, aliases
|
66
66
|
|
67
67
|
################################################################
|
@@ -1405,10 +1405,10 @@ class SageInputExpression:
|
|
1405
1405
|
sage: sie(4)
|
1406
1406
|
{call: {atomic:3}({atomic:4})}
|
1407
1407
|
"""
|
1408
|
-
|
1409
|
-
|
1410
|
-
|
1411
|
-
return SIE_call(self._sie_builder, self,
|
1408
|
+
new_args = [self._sie_builder(arg) for arg in args]
|
1409
|
+
new_kwargs = {key: self._sie_builder(val)
|
1410
|
+
for key, val in kwargs.items()}
|
1411
|
+
return SIE_call(self._sie_builder, self, new_args, new_kwargs)
|
1412
1412
|
|
1413
1413
|
def __getitem__(self, key):
|
1414
1414
|
r"""
|
@@ -21,11 +21,11 @@ sage: factor(2007)
|
|
21
21
|
3^2 * 223
|
22
22
|
sage: factor(31415926535898)
|
23
23
|
2 * 3 * 53 * 73 * 2531 * 534697
|
24
|
-
sage: n = 7403756347956171282804679609742957314259318888
|
25
|
-
....: 9231289084936232638972765034028266276891996419625117
|
26
|
-
....: 8439958943305021275853701189680982867331732731089309
|
27
|
-
....: 0055250511687706329907239638078671008609696253793465
|
28
|
-
....: 0563796359
|
24
|
+
sage: n = Integer('7403756347956171282804679609742957314259318888'
|
25
|
+
....: '9231289084936232638972765034028266276891996419625117'
|
26
|
+
....: '8439958943305021275853701189680982867331732731089309'
|
27
|
+
....: '0055250511687706329907239638078671008609696253793465'
|
28
|
+
....: '0563796359')
|
29
29
|
sage: len(n.str(2))
|
30
30
|
704
|
31
31
|
sage: len(n.str(10))
|
@@ -223,7 +223,7 @@ Sage example in ./float.tex, line 1194::
|
|
223
223
|
|
224
224
|
sage: c = sumcomp(y0,delta0,RDF(0.0),n,a)
|
225
225
|
sage: print("exact - compensated summation: %.5f" \
|
226
|
-
|
226
|
+
....: % RDF(s-RR(c).exact_rational()))
|
227
227
|
exact - compensated summation: -0.00042
|
228
228
|
|
229
229
|
Sage example in ./float.tex, line 1242::
|
@@ -182,7 +182,7 @@ Sage example in ./integration.tex, line 979::
|
|
182
182
|
Sage example in ./integration.tex, line 990::
|
183
183
|
|
184
184
|
sage: f = lambda y: numerical_integral(lambda x: exp(y*sin(x)), \
|
185
|
-
|
185
|
+
....: 0, sqrt(y))[0]
|
186
186
|
sage: f(0.0), f(0.5), f(1.0) # abs tol 2e-15
|
187
187
|
(0.0, 0.8414895067661431, 1.6318696084180513)
|
188
188
|
|
@@ -194,14 +194,14 @@ Sage example in ./integration.tex, line 998::
|
|
194
194
|
Sage example in ./integration.tex, line 1008::
|
195
195
|
|
196
196
|
sage: f = lambda y: sage.calculus.calculus.nintegral(exp(y*sin(x)), \
|
197
|
-
|
197
|
+
....: x, 0, sqrt(y))[0]
|
198
198
|
sage: numerical_integral(f, 0, 1) # abs tol 2e-16
|
199
199
|
(0.8606791942204567, 6.301207560882096e-07)
|
200
200
|
|
201
201
|
Sage example in ./integration.tex, line 1016::
|
202
202
|
|
203
203
|
sage: f = lambda y: RDF(mpmath.quad(lambda x: mpmath.exp(y*mpmath.sin(x)), \
|
204
|
-
|
204
|
+
....: [0, sqrt(y)]))
|
205
205
|
sage: numerical_integral(f, 0, 1) # abs tol 2e-16
|
206
206
|
(0.8606791942204567, 6.301207561187562e-07)
|
207
207
|
|