How to modularize for fun and profit, IV: Testing subset distributions in virtual envs

Skip to first unread message

Matthias Koeppe

Oct 19, 2021, 3:57:27 PMOct 19
to sage-devel
Of course, we need tools for testing modularized distributions of portions of the Sage library.

1. Modularized distributions must be testable separately!

2. But we want to keep integration testing with other portions of Sage too!

Enter "# optional", the doctest annotation that we already use whenever an optional package is needed for a particular test.

This mechanism can now also be used for making a doctest conditional on the presence of a portion of the Sage library. As of, the available tags are sage.combinat, sage.graphs, sage.plot, sage.rings.number_field, sage.rings.real_double, and sage.symbolic. It easy to add more such tags in src/sage/features/ uses this mechanism for sage.tensor (thanks, Eric!). This package is purely algebraic and has no dependency on symbolics. However, there were a small number of doctests that depend on the Symbolic Ring for integration testing. Now ticket #32712 made them conditional on the presence of sage.symbolic: the tests are marked # optional - sage.symbolic

So how to test that this works? 

Sure, we can go into local/..../site-packages and do "rm -rf sage/symbolic" and test that things still work. But that's not a good way of testing.

Instead we use a virtual environment in which we only install a subset distribution of the Sage library (and its Python dependencies). The distribution sagemath-standard-no-symbolics, under development in, omits sage.symbolic, sage.functions, sage.calculus, and other packages/modules that make heavy use of symbolics.

This is where tox comes into play: It is the standard Python tool for creating disposable virtual environments for testing. Per testing instructions in, after checking out the ticket branch and running "./bootstrap && make build" to update the normal Sage distribution, we can create a separate virtual environment for testing sagemath-standard-no-symbolics. The command: 

$ ./sage -sh -c '(cd pkgs/sagemath-standard-no-symbolics && SAGE_NUM_THREADS=16 tox -v -v -v -e py39-sagewheels-nopypi)' 

will reuse all the non-Python dependencies previously built, and also reuse the wheels built for the Python packages in the Sage distribution. It does not make any changes to the normal installation of Sage. The virtual environment is created in a subdirectory of pkgs/sagemath-standard-no-symbolics/.tox; the whole .tox directory can be safely deleted at any time.

After the command finishes,  we can start the separate subset-Sage in its virtual environment:
$ pkgs/sagemath-standard-no-symbolics/.tox/py39-sagewheels-nopypi/bin/sage

or run some tests:
$ pkgs/sagemath-standard-no-symbolics/.tox/py39-sagewheels-nopypi/bin/sage -tp 4 src/sage/graphs/

Reply all
Reply to author
0 new messages