Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: support users specifying an undeclared parametrization of python #361

Merged
merged 27 commits into from Dec 29, 2020

Conversation

crwilcox
Copy link
Collaborator

@crwilcox crwilcox commented Nov 20, 2020

Closes #158

This adds coverage for --extra-python which allows for adding additional pythons for running python interpreters, not specified in the noxfile.

@pradyunsg
Copy link
Contributor

Can't comment on the code, but hey! Thanks for moving this forward! ^>^

One thing that'd be nice would be being able to say "hey, use the regular python from PATH, instead of pythonX.Y or whatever" in addition to being able to specify custom X.Y. :)

@theacodes
Copy link
Collaborator

looks okay so far, but I do worry about this being kind of a "hidden"/"implicit" feature. I'm wondering if there's a more explicit way for us to allow amending a python interpreter.

@cjolowicz
Copy link
Collaborator

I'm wondering if there's a more explicit way for us to allow amending a python interpreter.

Would it make sense to support fnmatch-style wildcards in the interpreter specs? I'm imagining that this would enumerate Python interpreters on PATH, ordering plain python before executables with an explicit version, and take the first match. For example, python="*" would match the first python on PATH, while python="3.[6-9]" would be shorthand for the python=["3.6", "3.7", "3.8", "3.9"]. I haven't checked how well this would work for Windows and Conda, though.

Another method would be a command-line option to globally add an interpreter spec to every requested session. For example, --extra-python="3.10" or such. This could also be combined with the wildcard approach. For example, setting nox.options.extra_pythons = "3.*" in noxfile.py to explicitly allow running sessions with any python3.

@crwilcox
Copy link
Collaborator Author

crwilcox commented Nov 23, 2020

I do think as is this is rather hidden, and at minimum would require docs to state this is supported behavior.

Whilie I like the idea presented by @cjolowicz presents, I think it might be at odds with the error on missing interpreter, which I have seen used to ensure CI is actually testing all scenarios. This sort of makes it fluid what ought to be tested.

--extra-python="3.10" is an idea though. This would allow on session expansion (make_session method) to bring these in before filtering.

@crwilcox
Copy link
Collaborator Author

crwilcox commented Nov 24, 2020

Alright. I decided to move this to the direction suggested by @cjolowicz.

TODO: if we use this route changes to usage.rst will be needed to merge.

List sessions

❯ nox -l

* lint -> Run linters.
* blacken -> Run black.
* pytype -> Run pytype
* lint_setup_py -> Verify that setup.py is valid (including RST check).
* unit-3.6 -> Run the unit test suite.
* unit-3.7 -> Run the unit test suite.
* unit-3.9 -> Run the unit test suite.
* system-3.8 -> Run the system test suite.
* cover -> Run the final coverage report.
* docs -> Build the docs for this library.
* docfx -> Build the docfx yaml files for this library.

sessions marked with * are selected, sessions marked with - are skipped.

List with extra-python argument

❯ nox -l  --extra-python 3.8
Sessions defined in /Users/crwilcox/workspace/python-firestore/noxfile.py:

* lint-3.8 -> Run linters.
* lint-3.8 -> Run linters.
* blacken-3.6 -> Run black.
* blacken-3.8 -> Run black.
* pytype-3.7 -> Run pytype
* pytype-3.8 -> Run pytype
* lint_setup_py-3.8 -> Verify that setup.py is valid (including RST check).
* lint_setup_py-3.8 -> Verify that setup.py is valid (including RST check).
* unit-3.6 -> Run the unit test suite.
* unit-3.7 -> Run the unit test suite.
* unit-3.9 -> Run the unit test suite.
* unit-3.8 -> Run the unit test suite.
* system-3.8 -> Run the system test suite.
* system-3.8 -> Run the system test suite.
* cover-3.8 -> Run the final coverage report.
* cover-3.8 -> Run the final coverage report.
* docs-3.8 -> Build the docs for this library.
* docs-3.8 -> Build the docs for this library.
* docfx-3.8 -> Build the docfx yaml files for this library.
* docfx-3.8 -> Build the docfx yaml files for this library.

sessions marked with * are selected, sessions marked with - are skipped.

Run non existent session with extra python

❯ nox -s unit-3.8 --extra-python 3.8
nox > Running session unit-3.8
nox > Creating virtual environment (virtualenv) using python3.8 in .nox/unit-3-8
3.8
nox > Session unit-3.8 was successful.

Run all unit, with an extra python

❯ nox -s unit --extra-python 3.8
nox > Running session unit-3.6
nox > Creating virtual environment (virtualenv) using python3.6 in .nox/unit-3-6
3.6
nox > Session unit-3.6 was successful.
nox > Running session unit-3.7
nox > Creating virtual environment (virtualenv) using python3.7 in .nox/unit-3-7
3.7
nox > Session unit-3.7 was successful.
nox > Running session unit-3.9
nox > Creating virtual environment (virtualenv) using python3.9 in .nox/unit-3-9
3.9
nox > Session unit-3.9 was successful.
nox > Running session unit-3.8
nox > Creating virtual environment (virtualenv) using python3.8 in .nox/unit-3-8
3.8
nox > Session unit-3.8 was successful.
nox > Ran multiple sessions:
nox > * unit-3.6: success
nox > * unit-3.7: success
nox > * unit-3.9: success
nox > * unit-3.8: success

@pradyunsg
Copy link
Contributor

What would happen when an existing python is specified via extra-python?

@crwilcox
Copy link
Collaborator Author

crwilcox commented Nov 24, 2020

@pradyunsg as authored it will add it to the list of sessions. On extension I could 'set'-ify it to ensure this doesn't happen, but I wasn't particularly concerned with appending a duplicate session.

❯ nox -s unit --extra-python 3.6
nox > * unit-3.6: success
nox > * unit-3.7: success
nox > * unit-3.9: success
nox > * unit-3.6: success
❯ nox -s unit --extra-python 3.6 3.8
nox > Ran multiple sessions:
nox > * unit-3.6: success
nox > * unit-3.7: success
nox > * unit-3.9: success
nox > * unit-3.6: success
nox > * unit-3.8: success

nox/manifest.py Outdated Show resolved Hide resolved
@crwilcox
Copy link
Collaborator Author

Incorporated @cjolowicz changes to manage dupes

❯ nox -l
* unit-3.6 -> Run the unit test suite.
* unit-3.7 -> Run the unit test suite.
* unit-3.9 -> Run the unit test suite.
❯ nox -s unit --extra-python 3.6 3.8
nox > Ran multiple sessions:
nox > * unit-3.8: success
nox > * unit-3.9: success
nox > * unit-3.6: success
nox > * unit-3.7: success

@crwilcox crwilcox marked this pull request as ready for review November 24, 2020 22:15
nox/manifest.py Outdated Show resolved Hide resolved
Co-authored-by: Claudio Jolowicz <cjolowicz@gmail.com>
@crwilcox
Copy link
Collaborator Author

@cjolowicz are there additional test cases on your mind to guard a bit? Just thinking out loud after the few small tweaks :)

@cjolowicz
Copy link
Collaborator

cjolowicz commented Nov 24, 2020

Yes, more tests would be good :)

I'm learning to be more careful with the suggest feature 😉

Unfortunately, this last suggestion (169ede8) had a bug, the assertion on the following line can now fail.

I think it would be best to revert that commit, and think about how we want to handle the case where func.python is None.

  • Do we want to add extra Pythons to such a session?
  • If yes, do we also want to add the session passing None as the interpreter? Or do the extra Pythons override the unspecified interpreter?

@crwilcox
Copy link
Collaborator Author

crwilcox commented Nov 25, 2020

@cjolowicz I have reverted it locally.

If I have a nox session

@nox.session()
def unit_no_python(session):
    """Run the unit test suite."""
    pass

and run nox -s unit_no_python --extra-python 3.9, while running nox on 3.8.6, func.python will be set to '3.8', so after the added code, func.python will be

['3.9', '3.8']

However, it is only running the default right now.

Before trying to fix that, it may be easier to talk about the expected behavior. When no python is specified in noxfile, but extra-pythons are provided:

  1. Run only default (nox python)
  2. Run only extra-pythons (ignoring the default)
  3. Run default and extra-pythons.

I think Run default and extra-pythons make sense given the argument names. If they only needed to replace the default, it would be simpler to replace the python hosting nox.

Other potential issue: Also, when pythons are specified, you can make up session names that don't exist (for instance unit-3.11), allowing you to run just the extra-python provided, but you can't do this if there are no pythons (it will fail stating sessions not found as it would before this change)

@cjolowicz
Copy link
Collaborator

One thing that'd be nice would be being able to say "hey, use the regular python from PATH, instead of pythonX.Y or whatever" in addition to being able to specify custom X.Y. :)

@pradyunsg I think we have this covered now. If you specify --extra-python=python, you get extra sessions named <session>-python using plain python from PATH. Their environments are created using virtualenv -p python (python -m venv for the venv backend). For example:

$ nox --extra-python=python --session=mypy-python
nox > Running session mypy-python
nox > Creating virtual environment (virtualenv) using python in .nox/mypy-python
...
nox > Session mypy-python was successful.

$ readlink .nox/mypy-python/bin/python
/usr/bin/python3.9

@pradyunsg
Copy link
Contributor

YAY!

@cjolowicz
Copy link
Collaborator

cjolowicz commented Nov 26, 2020

Hey @crwilcox

I have a nox session [...] and run nox -s unit_no_python --extra-python 3.9, while running nox on 3.8.6, func.python will be set to '3.8', so after the added code, func.python will be ['3.9', '3.8']

Wouldn't this be [3.9, None]?

FWIW, here's the patch I'm trying this with:

diff --git a/nox/manifest.py b/nox/manifest.py
index dca2d0a..7a5085c 100644
--- a/nox/manifest.py
+++ b/nox/manifest.py
@@ -191,13 +191,12 @@ class Manifest:
             extra_pythons = self._config.extra_pythons  # type: List[str]
             if isinstance(func.python, (list, tuple, set)):
                 func.python = list({*func.python, *extra_pythons})
-            elif not multi and func.python:
+            elif not multi and func.python is not False:
                 # if this is multi, but there is only a single interpreter, it
                 # is the reentrant case. The extra_python interpreter shouldn't
                 # be added in that case. If func.python is False, the session
-                # has no backend; treat None and the empty string equivalently.
-                # Otherwise, add the extra specified python.
-                assert isinstance(func.python, str)
+                # has no backend. Otherwise, add the extra specified python.
+                assert func.python is None or isinstance(func.python, str)
                 func.python = list({func.python, *extra_pythons})
 
         # If the func has the python attribute set to a list, we'll need

Before trying to fix that, it may be easier to talk about the expected behavior. When no python is specified in noxfile, but extra-pythons are provided:

  1. Run only default (nox python)
  2. Run only extra-pythons (ignoring the default)
  3. Run default and extra-pythons.

I think Run default and extra-pythons make sense given the argument names.

I see your point here. I'll try to repeat this in my own words: If a user did not specify a Python version for a session, that should not prevent them from running the session on some specific interpreter via --extra-python. And specifying an "extra" Python should not make the default Python for the session (the interpreter running Nox) go away.

There are some things that bother me about this behavior, though:

  • A session without a Python version can mean that it does not make sense to run the session multiple times, or across multiple Python versions. For example, Nox itself uses bare @nox.session for the cover session, which produces the coverage report. So if you want to run the tests on an extra Python interpreter, they will notify the coverage session, and that session ends up running twice.

Edit: It doesn't. I think the general point still holds, but it turns out that the notify case behaves differently from specifying a session on the command line, in that it only triggers the first session that matches the name (cover in this case). In the current implementation, that happens to be the one with the extra Python.

  • Using the example you provided above, the session names end up being unit_no_python and unit_no_python-3.9. I find that somewhat confusing. The original session is still named unit_no_python, but passing it will trigger both sessions.

  • It doesn't type-check. Currently func.pythons can be either None or a sequence of str, but not a sequence of str mixed with None. That could be changed, of course.

On the other hand, I think the use case of running a session without a Python version on some specific interpreter is quite valid. So I guess I'm leaning towards your option 2 ("Run only extra-pythons"). I'd see this as an override, replacing None with the "extra" Python or Pythons.

I think the difference in behavior compared to sessions with a python keyword can be justified by the fact that no Python was specified, which I'd take to mean "use whatever", and by the fact that it avoids the pitfalls described above.

That could be done with the following patch:

diff --git a/nox/manifest.py b/nox/manifest.py
index dca2d0a..66a120c 100644
--- a/nox/manifest.py
+++ b/nox/manifest.py
@@ -191,14 +191,16 @@ class Manifest:
             extra_pythons = self._config.extra_pythons  # type: List[str]
             if isinstance(func.python, (list, tuple, set)):
                 func.python = list({*func.python, *extra_pythons})
-            elif not multi and func.python:
+            elif not multi:
                 # if this is multi, but there is only a single interpreter, it
                 # is the reentrant case. The extra_python interpreter shouldn't
                 # be added in that case. If func.python is False, the session
-                # has no backend; treat None and the empty string equivalently.
-                # Otherwise, add the extra specified python.
-                assert isinstance(func.python, str)
-                func.python = list({func.python, *extra_pythons})
+                # has no backend. Otherwise, add the extra specified python.
+                if func.python is None:
+                    func.python = extra_pythons[:]
+                elif func.python:
+                    assert isinstance(func.python, str)
+                    func.python = list({func.python, *extra_pythons})
 
         # If the func has the python attribute set to a list, we'll need
         # to expand them.

Using this patch on your example:

$ nox --extra-python=3.10 -l

Sessions defined in /tmp/nox-361/noxfile.py:

* unit_no_python-3.10 -> Run the unit test suite.

sessions marked with * are selected, sessions marked with - are skipped.```

$ nox --extra-python=3.9 --session=unit_no_python

nox > Running session unit_no_python-3.9
nox > Creating virtual environment (virtualenv) using python3.9 in .nox/unit_no_python-3-9
nox > Session unit_no_python-3.9 was successful.

@cjolowicz
Copy link
Collaborator

There is another issue with the current implementation. Sets do not preserve order, so the Python interpreters are run in an unpredictable order for each session. We can fix this using OrderedDict.fromkeys, for Python 3.5 support:

diff --git a/nox/manifest.py b/nox/manifest.py
index 66a120c..930e490 100644
--- a/nox/manifest.py
+++ b/nox/manifest.py
@@ -15,6 +15,7 @@
 import argparse
 import collections.abc
 import itertools
+from collections import OrderedDict
 from typing import Any, Iterable, Iterator, List, Mapping, Sequence, Set, Tuple, Union
 
 from nox._decorators import Call, Func
@@ -23,6 +24,11 @@ from nox.sessions import Session, SessionRunner
 WARN_PYTHONS_IGNORED = "python_ignored"
 
 
+def _unique_list(*args: str) -> List[str]:
+    """Return a list without duplicates, while preserving order."""
+    return list(OrderedDict.fromkeys(args))
+
+
 class Manifest:
     """Session manifest.
 
@@ -190,7 +196,7 @@ class Manifest:
             # include additional python interpreters
             extra_pythons = self._config.extra_pythons  # type: List[str]
             if isinstance(func.python, (list, tuple, set)):
-                func.python = list({*func.python, *extra_pythons})
+                func.python = _unique_list(*func.python, *extra_pythons)
             elif not multi:
                 # if this is multi, but there is only a single interpreter, it
                 # is the reentrant case. The extra_python interpreter shouldn't
@@ -200,7 +206,7 @@ class Manifest:
                     func.python = extra_pythons[:]
                 elif func.python:
                     assert isinstance(func.python, str)
-                    func.python = list({func.python, *extra_pythons})
+                    func.python = _unique_list(func.python, *extra_pythons)
 
         # If the func has the python attribute set to a list, we'll need
         # to expand them.

@crwilcox
Copy link
Collaborator Author

I have a nox session [...] and run nox -s unit_no_python --extra-python 3.9, while running nox on 3.8.6, func.python will be set to '3.8', so after the added code, func.python will be ['3.9', '3.8']

Wouldn't this be [3.9, None]?

The code in this branch returns the nox python if no python is specified, not none, at least at this point of nox. The data I was reporting was based off observed state, sometimes via debugger to inspect along the way. So I don't believe there is a time we have a sequence that mixes str and None.

I'm leaning towards your option 2 ("Run only extra-pythons"). I'd see this as an override, replacing None with the "extra" Python or Pythons.

I think this is a reasonable thought. I feel like having extra-pythons override in the case no python is specified is reasonable.

Sets do not preserve order, so the Python interpreters are run in an unpredictable order for each session.

Thanks for bringing this up. It sort of bothered me also but wasn't prioritizing fixing that up. But now that I am not the only one irritated I am going to knock that off the list of TODOs :)

docs/usage.rst Outdated Show resolved Hide resolved
Co-authored-by: Danny Hermes <daniel.j.hermes@gmail.com>
@crwilcox
Copy link
Collaborator Author

crwilcox commented Dec 14, 2020

@pradyunsg checking in since this has stabilized, does the support here do what is needed for pip?

# session is python="3.5", "3.8"
nox -s session --extra-pythons "3.9"
# session runs 3.5, 3.8, 3.9

test case at https://github.com/theacodes/nox/pull/361/files#diff-03dd41d84b05bb2477b17b322a4b5b1f3de5ccc6bc9957c09d46f87849eb3a26R207 gives a good idea of the complete behavior

@pradyunsg
Copy link
Contributor

That'll work. As long as I can test for 3.10 / PyPy x.x.x without modifying the noxfile, I'm a happy kiddo. :)

How friendly is this toward non-CPython implementations being the runner, like PyPy, Ironpython and whatnot?

@crwilcox
Copy link
Collaborator Author

This is the equivalent of specifying the string in python = [""] in the session attribute. So those should be doable.

@pradyunsg
Copy link
Contributor

Awesome. I installed1 and played around with this PR today, and this works great!

The only question/concern I have now is: I don't see any way to only run a session with something from --extra-pythons... For example:

❯ cat noxfile.py | grep "lint" --context=1
@nox.session(python="3.9")
def lint(session):
    session.install("pre-commit")
❯ nox -s lint --extra-pythons ""
[snip]
nox > Ran multiple sessions:
nox > * lint-3.9: success
nox > * lint: success

I can imagine wanting to run with the unqualified version (this is especially relevant with like, pip's test session which someone might only wanna run on one interpreter, once). Other than that, I don't have too many thoughts.


1 I quite enjoy being able to do pip install https://github.com/crwilcox/nox/archive/allow-non-specified-python-versions.zip. :)

@cjolowicz
Copy link
Collaborator

cjolowicz commented Dec 18, 2020

I don't see any way to only run a session with something from --extra-pythons.

Hi @pradyunsg would nox -s lint --extra-python python --python python do what you want?

That should run the session only with python from PATH, which could be a pypy installation. For example, I just tried this with the following noxfile:

import nox

@nox.session(python="3.9")
def test(session):
    session.run("python", "-VV")

Below I use pypy as the default Python (via pyenv). By default, the nox session uses CPython 3.9. Passing --extra-python python --python python switches it to use only pypy:

$ pyenv shell pypy3.6-7.3.0 3.9.0

$ python -VV
Python 3.6.9 (1608da62bfc7, Dec 23 2019, 10:50:17)
[PyPy 7.3.0 with GCC 4.2.1 Compatible Apple LLVM 10.0.0 (clang-1000.11.45.5)]

$ python -m venv venv

$ . venv/bin/activate

$ pip install https://github.com/crwilcox/nox/archive/allow-non-specified-python-versions.zip

$ nox -s test
nox > Running session test
nox > Creating virtual environment (virtualenv) using python3.9 in .nox/test
nox > python -VV
Python 3.9.0 (default, Oct  5 2020, 22:21:26)
[Clang 11.0.0 (clang-1100.0.20.17)]
nox > Session test was successful.

$ nox -s test --extra-python python --python python
nox > Running session test-python
nox > Creating virtual environment (virtualenv) using python in .nox/test-python
nox > python -VV
Python 3.6.9 (1608da62bfc7, Dec 23 2019, 10:50:17)
[PyPy 7.3.0 with GCC 4.2.1 Compatible Apple LLVM 10.0.0 (clang-1000.11.45.5)]
nox > Session test-python was successful.

@crwilcox
Copy link
Collaborator Author

You can also run a specific session and add extra pythons which would only run the extra pythons

nox -s lint-custompython --extra-python custompython
❯ nox -l
Sessions defined in /mnt/c/Users/crwilcox/workspace/nox/noxfile.py:

* tests-3.6 -> Run test suite with pytest.
* tests-3.7 -> Run test suite with pytest.
* tests-3.8 -> Run test suite with pytest.
* tests-3.9 -> Run test suite with pytest.
* conda_tests-3.6 -> Run test suite with pytest.
* conda_tests-3.7 -> Run test suite with pytest.
* conda_tests-3.8 -> Run test suite with pytest.
* conda_tests-3.9 -> Run test suite with pytest.
* cover -> Coverage analysis.
* blacken -> Run black code formatter.
* lint
* docs -> Build the documentation.

sessions marked with * are selected, sessions marked with - are skipped.
❯ nox -s tests-3.10 --extra-pythons 3.10
nox > Running session tests-3.10
nox > Session tests-3.10 skipped: Python interpreter 3.10 not found.

@pradyunsg
Copy link
Contributor

AHA! That does indeed work @cjolowicz!

I imagine the documentation would doing the heavy lifting of explaining this, because that wasn't immediately obvious to me (and I didn't look at the docs on this PR, sorry!).

@cjolowicz
Copy link
Collaborator

that wasn't immediately obvious to me

I've been wondering if the combination --extra-python=X.Y --python=X.Y is common enough to warrant a shorthand --force-python=X.Y. Besides supporting a (presumed) common use case, that might also make the relationship of --extra-python and --python more obvious. Possibly in a follow up PR?

The other non-obvious thing here, I guess, would be the use of python instead of a version X.Y. Should this be mentioned in the documentation?

@pradyunsg
Copy link
Contributor

Should this be mentioned in the documentation?

Yes please.

(i really don't have more to say, oops)

@crwilcox
Copy link
Collaborator Author

@cjolowicz do you want the doc changes as part of this pr or should we spin that as a new workitem?

@cjolowicz
Copy link
Collaborator

cjolowicz commented Dec 19, 2020

@crwilcox I think actually all this needs is something at the end of the section about --extra-pythons, along these lines:

This option can be combined with the ``--python`` option
to change the Python interpreter for a session,
replacing any versions listed in the configuration file::

   nox --extra-python 3.10 --python 3.10 -s lint

You can also specify ``python`` instead of a version.
This will run sessions using whichever ``python`` command you have on your ``PATH``::

   nox --extra-python python --python python

In that case, we won't be touching unrelated documentation sections, so it feels like there's no need for a separate PR. Documenting --python=python here somehow feels more relevant than mentioning it in config.rst (which I linked to in my earlier comment).

@crwilcox
Copy link
Collaborator Author

@cjolowicz let me know what you think of the docs add. I think putting it under the additional python header makes good sense.

Copy link
Collaborator

@cjolowicz cjolowicz left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for including this :) Just found a small typo, otherwise LGTM

docs/usage.rst Outdated Show resolved Hide resolved
docs/usage.rst Outdated Show resolved Hide resolved
crwilcox and others added 2 commits December 28, 2020 00:32
Co-authored-by: Claudio Jolowicz <cjolowicz@gmail.com>
Co-authored-by: Claudio Jolowicz <cjolowicz@gmail.com>
@crwilcox
Copy link
Collaborator Author

Oh, good catch! Thanks! If no objections, I will merge this later today/tomorrow. I think this is in a good place 👍

Copy link
Collaborator

@stsewd stsewd left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, thanks! I left a comment about adding more test cases.

("3.5", ["3.8", "3.9"], ["3.5", "3.8", "3.9"]),
(["3.5", "3.9"], [], ["3.5", "3.9"]),
(["3.5", "3.9"], ["3.8"], ["3.5", "3.9", "3.8"]),
(["3.5", "3.9"], ["3.8", "3.4"], ["3.5", "3.9", "3.8", "3.4"]),
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should be good to have a case where an interpreter in extra_pythons is already in python (to test the _unique_list function).

@crwilcox crwilcox merged commit e2db5ed into wntrblm:master Dec 29, 2020
@pradyunsg
Copy link
Contributor

Hurray! Thanks for doing this folks! ^.^

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Development

Successfully merging this pull request may close these issues.

Run session with an unregistered interpreter
6 participants