typecheck-runner 0.1.0__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.
@@ -0,0 +1,24 @@
1
+ This software was developed by employees of the National Institute of Standards
2
+ and Technology (NIST), an agency of the Federal Government. Pursuant to title 17
3
+ United States Code Section 105, works of NIST employees are not subject to
4
+ copyright protection in the United States and are considered to be in the public
5
+ domain. Permission to freely use, copy, modify, and distribute this software and
6
+ its documentation without fee is hereby granted, provided that this notice and
7
+ disclaimer of warranty appears in all copies.
8
+
9
+ THE SOFTWARE IS PROVIDED 'AS IS' WITHOUT ANY WARRANTY OF ANY KIND, EITHER
10
+ EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, ANY WARRANTY
11
+ THAT THE SOFTWARE WILL CONFORM TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF
12
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND FREEDOM FROM
13
+ INFRINGEMENT, AND ANY WARRANTY THAT THE DOCUMENTATION WILL CONFORM TO THE
14
+ SOFTWARE, OR ANY WARRANTY THAT THE SOFTWARE WILL BE ERROR FREE. IN NO EVENT
15
+ SHALL NIST BE LIABLE FOR ANY DAMAGES, INCLUDING, BUT NOT LIMITED TO, DIRECT,
16
+ INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES, ARISING OUT OF, RESULTING FROM, OR
17
+ IN ANY WAY CONNECTED WITH THIS SOFTWARE, WHETHER OR NOT BASED UPON WARRANTY,
18
+ CONTRACT, TORT, OR OTHERWISE, WHETHER OR NOT INJURY WAS SUSTAINED BY PERSONS OR
19
+ PROPERTY OR OTHERWISE, AND WHETHER OR NOT LOSS WAS SUSTAINED FROM, OR AROSE OUT
20
+ OF THE RESULTS OF, OR USE OF, THE SOFTWARE OR SERVICES PROVIDED HEREUNDER.
21
+
22
+ Distributions of NIST software should also include copyright and licensing
23
+ statements of any third-party software that are legally bundled with the code in
24
+ compliance with the conditions of those licenses.
@@ -0,0 +1,259 @@
1
+ Metadata-Version: 2.4
2
+ Name: typecheck-runner
3
+ Version: 0.1.0
4
+ Summary: Unified api to multiple typecheckers
5
+ Keywords: typecheck-runner
6
+ Author: William P. Krekelberg
7
+ Author-email: William P. Krekelberg <wpk@nist.gov>
8
+ License-Expression: NIST-PD
9
+ License-File: LICENSE
10
+ Classifier: Development Status :: 2 - Pre-Alpha
11
+ Classifier: Operating System :: OS Independent
12
+ Classifier: Programming Language :: Python
13
+ Classifier: Programming Language :: Python :: 3 :: Only
14
+ Classifier: Programming Language :: Python :: 3.10
15
+ Classifier: Programming Language :: Python :: 3.11
16
+ Classifier: Programming Language :: Python :: 3.12
17
+ Classifier: Programming Language :: Python :: 3.13
18
+ Classifier: Programming Language :: Python :: 3.14
19
+ Classifier: Programming Language :: Python :: Implementation :: CPython
20
+ Classifier: Programming Language :: Python :: Implementation :: PyPy
21
+ Classifier: Topic :: Utilities
22
+ Classifier: Typing :: Typed
23
+ Requires-Dist: packaging>=25.0
24
+ Requires-Python: >=3.10
25
+ Project-URL: Homepage, https://github.com/wpk-nist-gov/typecheck-runner
26
+ Description-Content-Type: text/markdown
27
+
28
+ <!-- markdownlint-disable MD041 -->
29
+
30
+ <!-- prettier-ignore-start -->
31
+ [![Repo][repo-badge]][repo-link]
32
+ [![PyPI license][license-badge]][license-link]
33
+ [![PyPI version][pypi-badge]][pypi-link]
34
+ [![Code style: ruff][ruff-badge]][ruff-link]
35
+ [![uv][uv-badge]][uv-link]
36
+
37
+ <!--
38
+ For more badges, see
39
+ https://shields.io/category/other
40
+ https://naereen.github.io/badges/
41
+ [pypi-badge]: https://badge.fury.io/py/typecheck-runner
42
+ -->
43
+
44
+ [ruff-badge]: https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json
45
+ [ruff-link]: https://github.com/astral-sh/ruff
46
+ [uv-badge]: https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json
47
+ [uv-link]: https://github.com/astral-sh/uv
48
+ [pypi-badge]: https://img.shields.io/pypi/v/typecheck-runner
49
+ [pypi-link]: https://pypi.org/project/typecheck-runner
50
+ [repo-badge]: https://img.shields.io/badge/--181717?logo=github&logoColor=ffffff
51
+ [repo-link]: https://github.com/wpk-nist-gov/typecheck-runner
52
+ [license-badge]: https://img.shields.io/pypi/l/typecheck-runner?color=informational
53
+ [license-link]: https://github.com/wpk-nist-gov/typecheck-runner/blob/main/LICENSE
54
+ [changelog-link]: https://github.com/wpk-nist-gov/typecheck-runner/blob/main/CHANGELOG.md
55
+
56
+ <!-- other links -->
57
+
58
+ [mypy]: https://github.com/python/mypy
59
+ [pyright]: https://github.com/microsoft/pyright
60
+ [basedpyright]: https://github.com/DetachHead/basedpyright
61
+ [ty]: https://github.com/astral-sh/ty
62
+ [pyrefly]: https://github.com/microsoft/pyright
63
+ <!-- [pre-commit]: https://pre-commit.com/ -->
64
+ <!-- [prek]: https://github.com/j178/prek -->
65
+
66
+ <!-- prettier-ignore-end -->
67
+
68
+ # `typecheck-runner`
69
+
70
+ A unified way to run globally installed typecheckers against a specified virtual
71
+ environment.
72
+
73
+ ## Overview
74
+
75
+ I prefer to invoke globally managed type checkers against specified virtual
76
+ environments. For cases where python versions are checked against (with, for
77
+ example tox or nox), this prevents each virtual environment from having to
78
+ contain a type checker. Each type checker ([mypy], [pyright], [basedpyright],
79
+ [ty], and [pyrefly]) has it's own particular flags to specify the python
80
+ executable and the python version. `typecheck-runner` unifies these flags. Also,
81
+ by default, `typecheck-runner` invokes the type checker using
82
+ [`uvx`](https://docs.astral.sh/uv/guides/tools/), which installs the type
83
+ checker if needed.
84
+
85
+ ## Usage
86
+
87
+ ### Install into virtual environment
88
+
89
+ The easiest way to use `typecheck-runner` is to install it into the virtual
90
+ environment you'd like to test against using something like
91
+
92
+ ```bash
93
+ pip install typecheck-runner
94
+ ```
95
+
96
+ from the virtual environment of interest. To invoke a type checker against the
97
+ virtual environment, assuming the python executable of the virtual environment
98
+ is located at `/path/to/venv/bin` with python version `3.13`, use
99
+
100
+ ```bash
101
+ typecheck-runner --check mypy
102
+ # runs: uvx mypy --python-version=3.13 --python-executable=/path/to/venv/bin
103
+ ```
104
+
105
+ Where the commented line shows the command run. Specifying `--no-uvx` will
106
+ instead invoke the type checker without `uvx`, so the type checker must already
107
+ be installed.
108
+
109
+ You can specify multiple checkers with multiple `--check` flags. To specify
110
+ options to `uvx` for each checker, pass options after `--uvx-delimiter` which
111
+ defaults to `--`. For example:
112
+
113
+ ```bash
114
+ typecheck-runner --check "mypy --verbose -- --reinstall"
115
+ # runs: uvx --reinstall mypy --verbose
116
+ ```
117
+
118
+ You can specify `uvx` options to all checkers using the `--uvx-options` flag.
119
+
120
+ ### Specify virtual environment
121
+
122
+ You can also use a globally installed `typecheck-runner` and specify which
123
+ virtual environment to test over using `--venv` or `--infer-venv` options. For
124
+ example, you can use:
125
+
126
+ ```bash
127
+ uvx typecheck-runner --venv .venv --check mypy
128
+ # run for example (if .venv current directory with version 3.14)
129
+ # uvx mypy --python-version=3.14 --python-executable=.venv/bin/python
130
+ ```
131
+
132
+ Using `--infer-venv` will attempt to infer the virtual environment from, in
133
+ order, environment variables `VIRTUAL_ENV`, `CONDA_PREFIX`, and finally `.venv`
134
+ in current directory.
135
+
136
+ ## Options
137
+
138
+ <!-- markdownlint-disable-next-line MD013 -->
139
+ <!-- [[[cog
140
+ import sys
141
+ sys.path.insert(0, ".")
142
+ from tools.cog_utils import wrap_command, get_pyproject, run_command, cat_lines
143
+ sys.path.pop(0)
144
+ ]]] -->
145
+ <!-- [[[end]]] -->
146
+
147
+ <!-- prettier-ignore-start -->
148
+ <!-- markdownlint-disable MD013 -->
149
+ <!-- [[[cog run_command("typecheck-runner --help", include_cmd=False, wrapper="restructuredtext")]]] -->
150
+
151
+ ```restructuredtext
152
+ usage: typecheck-runner [-h] [--version] [-c CHECKERS]
153
+ [--python-executable PYTHON_EXECUTABLE]
154
+ [--python-version PYTHON_VERSION] [--no-python-executable]
155
+ [--no-python-version] [--venv VENV] [--infer-venv]
156
+ [--constraints CONSTRAINTS] [-v] [--allow-errors] [--fail-fast]
157
+ [--dry-run] [--no-uvx] [--uvx-options UVX_OPTIONS]
158
+ [--uvx-delimiter UVX_DELIMITER]
159
+ [args ...]
160
+
161
+ Run executable using uvx.
162
+
163
+ positional arguments:
164
+ args Extra files/arguments passed to all checkers.
165
+
166
+ options:
167
+ -h, --help show this help message and exit
168
+ --version Display version.
169
+ -c, --check CHECKERS Checker to run. This can be a string with options to the
170
+ checker. For example, ``--check "mypy --verbose"`` runs the
171
+ checker the command ``mypy --verbose``. Options after
172
+ ``uvx_delimiter`` (default ``"--"``, see ``--uvx-delimiter``
173
+ options) are treated as ``uvx`` options. For example, passing
174
+ ``--check "mypy --verbose -- --reinstall"`` will run ``uvx
175
+ --reinstall mypy --verbose``. Can be specified multiple times.
176
+ --python-executable PYTHON_EXECUTABLE
177
+ Path to python executable. Defaults to ``sys.executable``. This
178
+ is passed to ``--python-executable`` (mypy), ``--pythonpath`` in
179
+ ((based)pyright), ``--python`` (ty), ``--python-interpreter-
180
+ path`` (pyrefly), and ignored for pylint.
181
+ --python-version PYTHON_VERSION
182
+ Python version (x.y) to typecheck against. Defaults to
183
+ ``{sys.version_info.major}.{sys.version_info.minor}``. This is
184
+ passed to ``--pythonversion`` in pyright and ``--python-
185
+ version`` otherwise.
186
+ --no-python-executable
187
+ Do not infer ``python_executable``
188
+ --no-python-version Do not infer ``python_version``.
189
+ --venv VENV Use specified vitualenvironment location
190
+ --infer-venv Infer virtual environment location. Checks in order environment
191
+ variables ``VIRTUAL_ENV``, ``CONDA_PREFIX``, directory
192
+ ``.venv``.
193
+ --constraints CONSTRAINTS
194
+ Constraints (requirements.txt) specs for checkers. Can specify
195
+ multiple times. Passed to ``uvx --constraints=...``.
196
+ -v, --verbose Set verbosity level. Pass multiple times to up level.
197
+ --allow-errors If passed, return ``0`` regardless of checker status.
198
+ --fail-fast Exit on first failed checker. Default is to run all checkers,
199
+ even if they fail.
200
+ --dry-run Perform dry run.
201
+ --no-uvx If ``--no-uvx`` is passed, assume typecheckers are in the
202
+ current python environment. Default is to invoke typecheckers
203
+ using `uvx`.
204
+ --uvx-options UVX_OPTIONS
205
+ Extra options to pass to ``uvx``. Note that you may have to
206
+ escape the first option. For example, ``--uvx-options
207
+ "\--verbose --reinstall"
208
+ --uvx-delimiter UVX_DELIMITER
209
+ Delimiter between typechecker command arguments and ``uvx``
210
+ arguments. See ``--check`` option.
211
+ ```
212
+
213
+ <!-- [[[end]]] -->
214
+ <!-- prettier-ignore-end -->
215
+
216
+ ## Status
217
+
218
+ This package is actively used by the author. Please feel free to create a pull
219
+ request for wanted features and suggestions!
220
+
221
+ <!-- end-docs -->
222
+
223
+ ## Installation
224
+
225
+ <!-- start-installation -->
226
+
227
+ Use one of the following
228
+
229
+ ```bash
230
+ pip install typecheck-runner
231
+ uv pip install typecheck-runner
232
+ uv add typecheck-runner
233
+ ...
234
+ ```
235
+
236
+ <!-- end-installation -->
237
+
238
+ ## What's new?
239
+
240
+ See [changelog][changelog-link].
241
+
242
+ ## License
243
+
244
+ This is free software. See [LICENSE][license-link].
245
+
246
+ ## Related work
247
+
248
+ Any other stuff to mention....
249
+
250
+ ## Contact
251
+
252
+ The author can be reached at <wpk@nist.gov>.
253
+
254
+ ## Credits
255
+
256
+ This package was created using
257
+ [Cookiecutter](https://github.com/audreyr/cookiecutter) with the
258
+ [usnistgov/cookiecutter-nist-python](https://github.com/usnistgov/cookiecutter-nist-python)
259
+ template.
@@ -0,0 +1,232 @@
1
+ <!-- markdownlint-disable MD041 -->
2
+
3
+ <!-- prettier-ignore-start -->
4
+ [![Repo][repo-badge]][repo-link]
5
+ [![PyPI license][license-badge]][license-link]
6
+ [![PyPI version][pypi-badge]][pypi-link]
7
+ [![Code style: ruff][ruff-badge]][ruff-link]
8
+ [![uv][uv-badge]][uv-link]
9
+
10
+ <!--
11
+ For more badges, see
12
+ https://shields.io/category/other
13
+ https://naereen.github.io/badges/
14
+ [pypi-badge]: https://badge.fury.io/py/typecheck-runner
15
+ -->
16
+
17
+ [ruff-badge]: https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json
18
+ [ruff-link]: https://github.com/astral-sh/ruff
19
+ [uv-badge]: https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json
20
+ [uv-link]: https://github.com/astral-sh/uv
21
+ [pypi-badge]: https://img.shields.io/pypi/v/typecheck-runner
22
+ [pypi-link]: https://pypi.org/project/typecheck-runner
23
+ [repo-badge]: https://img.shields.io/badge/--181717?logo=github&logoColor=ffffff
24
+ [repo-link]: https://github.com/wpk-nist-gov/typecheck-runner
25
+ [license-badge]: https://img.shields.io/pypi/l/typecheck-runner?color=informational
26
+ [license-link]: https://github.com/wpk-nist-gov/typecheck-runner/blob/main/LICENSE
27
+ [changelog-link]: https://github.com/wpk-nist-gov/typecheck-runner/blob/main/CHANGELOG.md
28
+
29
+ <!-- other links -->
30
+
31
+ [mypy]: https://github.com/python/mypy
32
+ [pyright]: https://github.com/microsoft/pyright
33
+ [basedpyright]: https://github.com/DetachHead/basedpyright
34
+ [ty]: https://github.com/astral-sh/ty
35
+ [pyrefly]: https://github.com/microsoft/pyright
36
+ <!-- [pre-commit]: https://pre-commit.com/ -->
37
+ <!-- [prek]: https://github.com/j178/prek -->
38
+
39
+ <!-- prettier-ignore-end -->
40
+
41
+ # `typecheck-runner`
42
+
43
+ A unified way to run globally installed typecheckers against a specified virtual
44
+ environment.
45
+
46
+ ## Overview
47
+
48
+ I prefer to invoke globally managed type checkers against specified virtual
49
+ environments. For cases where python versions are checked against (with, for
50
+ example tox or nox), this prevents each virtual environment from having to
51
+ contain a type checker. Each type checker ([mypy], [pyright], [basedpyright],
52
+ [ty], and [pyrefly]) has it's own particular flags to specify the python
53
+ executable and the python version. `typecheck-runner` unifies these flags. Also,
54
+ by default, `typecheck-runner` invokes the type checker using
55
+ [`uvx`](https://docs.astral.sh/uv/guides/tools/), which installs the type
56
+ checker if needed.
57
+
58
+ ## Usage
59
+
60
+ ### Install into virtual environment
61
+
62
+ The easiest way to use `typecheck-runner` is to install it into the virtual
63
+ environment you'd like to test against using something like
64
+
65
+ ```bash
66
+ pip install typecheck-runner
67
+ ```
68
+
69
+ from the virtual environment of interest. To invoke a type checker against the
70
+ virtual environment, assuming the python executable of the virtual environment
71
+ is located at `/path/to/venv/bin` with python version `3.13`, use
72
+
73
+ ```bash
74
+ typecheck-runner --check mypy
75
+ # runs: uvx mypy --python-version=3.13 --python-executable=/path/to/venv/bin
76
+ ```
77
+
78
+ Where the commented line shows the command run. Specifying `--no-uvx` will
79
+ instead invoke the type checker without `uvx`, so the type checker must already
80
+ be installed.
81
+
82
+ You can specify multiple checkers with multiple `--check` flags. To specify
83
+ options to `uvx` for each checker, pass options after `--uvx-delimiter` which
84
+ defaults to `--`. For example:
85
+
86
+ ```bash
87
+ typecheck-runner --check "mypy --verbose -- --reinstall"
88
+ # runs: uvx --reinstall mypy --verbose
89
+ ```
90
+
91
+ You can specify `uvx` options to all checkers using the `--uvx-options` flag.
92
+
93
+ ### Specify virtual environment
94
+
95
+ You can also use a globally installed `typecheck-runner` and specify which
96
+ virtual environment to test over using `--venv` or `--infer-venv` options. For
97
+ example, you can use:
98
+
99
+ ```bash
100
+ uvx typecheck-runner --venv .venv --check mypy
101
+ # run for example (if .venv current directory with version 3.14)
102
+ # uvx mypy --python-version=3.14 --python-executable=.venv/bin/python
103
+ ```
104
+
105
+ Using `--infer-venv` will attempt to infer the virtual environment from, in
106
+ order, environment variables `VIRTUAL_ENV`, `CONDA_PREFIX`, and finally `.venv`
107
+ in current directory.
108
+
109
+ ## Options
110
+
111
+ <!-- markdownlint-disable-next-line MD013 -->
112
+ <!-- [[[cog
113
+ import sys
114
+ sys.path.insert(0, ".")
115
+ from tools.cog_utils import wrap_command, get_pyproject, run_command, cat_lines
116
+ sys.path.pop(0)
117
+ ]]] -->
118
+ <!-- [[[end]]] -->
119
+
120
+ <!-- prettier-ignore-start -->
121
+ <!-- markdownlint-disable MD013 -->
122
+ <!-- [[[cog run_command("typecheck-runner --help", include_cmd=False, wrapper="restructuredtext")]]] -->
123
+
124
+ ```restructuredtext
125
+ usage: typecheck-runner [-h] [--version] [-c CHECKERS]
126
+ [--python-executable PYTHON_EXECUTABLE]
127
+ [--python-version PYTHON_VERSION] [--no-python-executable]
128
+ [--no-python-version] [--venv VENV] [--infer-venv]
129
+ [--constraints CONSTRAINTS] [-v] [--allow-errors] [--fail-fast]
130
+ [--dry-run] [--no-uvx] [--uvx-options UVX_OPTIONS]
131
+ [--uvx-delimiter UVX_DELIMITER]
132
+ [args ...]
133
+
134
+ Run executable using uvx.
135
+
136
+ positional arguments:
137
+ args Extra files/arguments passed to all checkers.
138
+
139
+ options:
140
+ -h, --help show this help message and exit
141
+ --version Display version.
142
+ -c, --check CHECKERS Checker to run. This can be a string with options to the
143
+ checker. For example, ``--check "mypy --verbose"`` runs the
144
+ checker the command ``mypy --verbose``. Options after
145
+ ``uvx_delimiter`` (default ``"--"``, see ``--uvx-delimiter``
146
+ options) are treated as ``uvx`` options. For example, passing
147
+ ``--check "mypy --verbose -- --reinstall"`` will run ``uvx
148
+ --reinstall mypy --verbose``. Can be specified multiple times.
149
+ --python-executable PYTHON_EXECUTABLE
150
+ Path to python executable. Defaults to ``sys.executable``. This
151
+ is passed to ``--python-executable`` (mypy), ``--pythonpath`` in
152
+ ((based)pyright), ``--python`` (ty), ``--python-interpreter-
153
+ path`` (pyrefly), and ignored for pylint.
154
+ --python-version PYTHON_VERSION
155
+ Python version (x.y) to typecheck against. Defaults to
156
+ ``{sys.version_info.major}.{sys.version_info.minor}``. This is
157
+ passed to ``--pythonversion`` in pyright and ``--python-
158
+ version`` otherwise.
159
+ --no-python-executable
160
+ Do not infer ``python_executable``
161
+ --no-python-version Do not infer ``python_version``.
162
+ --venv VENV Use specified vitualenvironment location
163
+ --infer-venv Infer virtual environment location. Checks in order environment
164
+ variables ``VIRTUAL_ENV``, ``CONDA_PREFIX``, directory
165
+ ``.venv``.
166
+ --constraints CONSTRAINTS
167
+ Constraints (requirements.txt) specs for checkers. Can specify
168
+ multiple times. Passed to ``uvx --constraints=...``.
169
+ -v, --verbose Set verbosity level. Pass multiple times to up level.
170
+ --allow-errors If passed, return ``0`` regardless of checker status.
171
+ --fail-fast Exit on first failed checker. Default is to run all checkers,
172
+ even if they fail.
173
+ --dry-run Perform dry run.
174
+ --no-uvx If ``--no-uvx`` is passed, assume typecheckers are in the
175
+ current python environment. Default is to invoke typecheckers
176
+ using `uvx`.
177
+ --uvx-options UVX_OPTIONS
178
+ Extra options to pass to ``uvx``. Note that you may have to
179
+ escape the first option. For example, ``--uvx-options
180
+ "\--verbose --reinstall"
181
+ --uvx-delimiter UVX_DELIMITER
182
+ Delimiter between typechecker command arguments and ``uvx``
183
+ arguments. See ``--check`` option.
184
+ ```
185
+
186
+ <!-- [[[end]]] -->
187
+ <!-- prettier-ignore-end -->
188
+
189
+ ## Status
190
+
191
+ This package is actively used by the author. Please feel free to create a pull
192
+ request for wanted features and suggestions!
193
+
194
+ <!-- end-docs -->
195
+
196
+ ## Installation
197
+
198
+ <!-- start-installation -->
199
+
200
+ Use one of the following
201
+
202
+ ```bash
203
+ pip install typecheck-runner
204
+ uv pip install typecheck-runner
205
+ uv add typecheck-runner
206
+ ...
207
+ ```
208
+
209
+ <!-- end-installation -->
210
+
211
+ ## What's new?
212
+
213
+ See [changelog][changelog-link].
214
+
215
+ ## License
216
+
217
+ This is free software. See [LICENSE][license-link].
218
+
219
+ ## Related work
220
+
221
+ Any other stuff to mention....
222
+
223
+ ## Contact
224
+
225
+ The author can be reached at <wpk@nist.gov>.
226
+
227
+ ## Credits
228
+
229
+ This package was created using
230
+ [Cookiecutter](https://github.com/audreyr/cookiecutter) with the
231
+ [usnistgov/cookiecutter-nist-python](https://github.com/usnistgov/cookiecutter-nist-python)
232
+ template.