aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Maydell <peter.maydell@linaro.org>2021-07-01 10:08:05 +0100
committerPeter Maydell <peter.maydell@linaro.org>2021-07-01 10:08:05 +0100
commitdd62bf14b756821fa293e3465955a41e9d460deb (patch)
tree86e549043122b513008f317f590d9237454c8159
parent1ec2cd0ce2ca94292ce237becc2c21b4eb9edca0 (diff)
parent5c02c865866fdd2d17e8f5507deb4aa1f74bf59f (diff)
downloadqemu-dd62bf14b756821fa293e3465955a41e9d460deb.zip
qemu-dd62bf14b756821fa293e3465955a41e9d460deb.tar.gz
qemu-dd62bf14b756821fa293e3465955a41e9d460deb.tar.bz2
Merge remote-tracking branch 'remotes/jsnow-gitlab/tags/python-pull-request' into staging
Pull request Patch 01/15 fixes the check-python-tox test. # gpg: Signature made Thu 01 Jul 2021 03:01:20 BST # gpg: using RSA key F9B7ABDBBCACDF95BE76CBD07DEF8106AAFC390E # gpg: Good signature from "John Snow (John Huston) <jsnow@redhat.com>" [full] # Primary key fingerprint: FAEB 9711 A12C F475 812F 18F2 88A9 064D 1835 61EB # Subkey fingerprint: F9B7 ABDB BCAC DF95 BE76 CBD0 7DEF 8106 AAFC 390E * remotes/jsnow-gitlab/tags/python-pull-request: python: Fix broken ReST docstrings python: remove auto-generated pyproject.toml file python: Update help text on 'make clean', 'make distclean' python: Update help text on 'make check', 'make develop' python: add 'make check-dev' invocation python: only check qemu/ subdir with flake8 python: Fix .PHONY Make specifiers python: update help text for check-tox python: rename 'venv-check' target to 'check-pipenv' python: Add no-install usage instructions python: README.rst touchups python: Re-lock pipenv at *oldest* supported versions python: Remove global pylint suppressions python: expose typing information via PEP 561 python/qom: Do not use 'err' name at module scope Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
-rw-r--r--.gitlab-ci.d/static_checks.yml2
-rw-r--r--python/.gitignore1
-rw-r--r--python/Makefile89
-rw-r--r--python/Pipfile.lock113
-rw-r--r--python/README.rst47
-rw-r--r--python/qemu/machine/__init__.py6
-rw-r--r--python/qemu/machine/machine.py6
-rw-r--r--python/qemu/machine/py.typed0
-rw-r--r--python/qemu/machine/qtest.py2
-rw-r--r--python/qemu/qmp/__init__.py1
-rw-r--r--python/qemu/qmp/py.typed0
-rw-r--r--python/qemu/qmp/qom.py4
-rw-r--r--python/qemu/qmp/qom_common.py2
-rw-r--r--python/qemu/utils/accel.py2
-rw-r--r--python/qemu/utils/py.typed0
-rw-r--r--python/setup.cfg14
-rwxr-xr-xpython/tests/flake8.sh2
17 files changed, 187 insertions, 104 deletions
diff --git a/.gitlab-ci.d/static_checks.yml b/.gitlab-ci.d/static_checks.yml
index c5fa4fc..b01f6ec 100644
--- a/.gitlab-ci.d/static_checks.yml
+++ b/.gitlab-ci.d/static_checks.yml
@@ -30,7 +30,7 @@ check-python-pipenv:
stage: test
image: $CI_REGISTRY_IMAGE/qemu/python:latest
script:
- - make -C python venv-check
+ - make -C python check-pipenv
variables:
GIT_DEPTH: 1
needs:
diff --git a/python/.gitignore b/python/.gitignore
index 272ed22..c8b0e67 100644
--- a/python/.gitignore
+++ b/python/.gitignore
@@ -14,3 +14,4 @@ qemu.egg-info/
# virtual environments (pipenv et al)
.venv/
.tox/
+.dev-venv/
diff --git a/python/Makefile b/python/Makefile
index b5621b0..ac46ae3 100644
--- a/python/Makefile
+++ b/python/Makefile
@@ -1,48 +1,99 @@
-.PHONY: help venv venv-check check clean distclean develop
+QEMU_VENV_DIR=.dev-venv
+.PHONY: help
help:
@echo "python packaging help:"
@echo ""
- @echo "make venv: Create pipenv's virtual environment."
- @echo " NOTE: Requires Python 3.6 and pipenv."
- @echo " Will download packages from PyPI."
- @echo " Hint: (On Fedora): 'sudo dnf install python36 pipenv'"
+ @echo "make check-pipenv:"
+ @echo " Run tests in pipenv's virtual environment."
+ @echo " These tests use the oldest dependencies."
+ @echo " Requires: Python 3.6 and pipenv."
+ @echo " Hint (Fedora): 'sudo dnf install python3.6 pipenv'"
@echo ""
- @echo "make venv-check: run linters using pipenv's virtual environment."
- @echo " Hint: If you don't know which test to run, run this one!"
+ @echo "make check-tox:"
+ @echo " Run tests against multiple python versions."
+ @echo " These tests use the newest dependencies."
+ @echo " Requires: Python 3.6 - 3.10, and tox."
+ @echo " Hint (Fedora): 'sudo dnf install python3-tox python3.10'"
@echo ""
- @echo "make develop: Install deps for 'make check', and"
- @echo " the qemu libs in editable/development mode."
+ @echo "make check-dev:"
+ @echo " Run tests in a venv against your default python3 version."
+ @echo " These tests use the newest dependencies."
+ @echo " Requires: Python 3.x"
@echo ""
- @echo "make check: run linters using the current environment."
+ @echo "make check:"
+ @echo " Run tests in your *current environment*."
+ @echo " Performs no environment setup of any kind."
@echo ""
- @echo "make check-tox: run linters using multiple python versions."
+ @echo "make develop:"
+ @echo " Install deps needed for for 'make check',"
+ @echo " and install the qemu package in editable mode."
+ @echo " (Can be used in or outside of a venv.)"
@echo ""
- @echo "make clean: remove package build output."
+ @echo "make pipenv"
+ @echo " Creates pipenv's virtual environment (.venv)"
@echo ""
- @echo "make distclean: remove venv files, qemu package forwarder,"
- @echo " built distribution files, and everything"
- @echo " from 'make clean'."
+ @echo "make dev-venv"
+ @echo " Creates a simple venv for check-dev. ($(QEMU_VENV_DIR))"
+ @echo ""
+ @echo "make clean:"
+ @echo " Remove package build output."
+ @echo ""
+ @echo "make distclean:"
+ @echo " remove pipenv/venv files, qemu package forwarder,"
+ @echo " built distribution files, and everything from 'make clean'."
+ @echo ""
+ @echo -e "Have a nice day ^_^\n"
-venv: .venv
+.PHONY: pipenv
+pipenv: .venv
.venv: Pipfile.lock
@PIPENV_VENV_IN_PROJECT=1 pipenv sync --dev --keep-outdated
+ rm -f pyproject.toml
@touch .venv
-venv-check: venv
+.PHONY: check-pipenv
+check-pipenv: pipenv
@pipenv run make check
+.PHONY: dev-venv
+dev-venv: $(QEMU_VENV_DIR) $(QEMU_VENV_DIR)/bin/activate
+$(QEMU_VENV_DIR) $(QEMU_VENV_DIR)/bin/activate: setup.cfg
+ @echo "VENV $(QEMU_VENV_DIR)"
+ @python3 -m venv $(QEMU_VENV_DIR)
+ @( \
+ echo "ACTIVATE $(QEMU_VENV_DIR)"; \
+ . $(QEMU_VENV_DIR)/bin/activate; \
+ echo "INSTALL qemu[devel] $(QEMU_VENV_DIR)"; \
+ make develop 1>/dev/null; \
+ )
+ @touch $(QEMU_VENV_DIR)
+
+.PHONY: check-dev
+check-dev: dev-venv
+ @( \
+ echo "ACTIVATE $(QEMU_VENV_DIR)"; \
+ . $(QEMU_VENV_DIR)/bin/activate; \
+ make check; \
+ )
+
+.PHONY: develop
develop:
- pip3 install -e .[devel]
+ pip3 install --disable-pip-version-check -e .[devel]
+.PHONY: check
check:
@avocado --config avocado.cfg run tests/
+.PHONY: check-tox
check-tox:
@tox
+.PHONY: clean
clean:
python3 setup.py clean --all
+ rm -f pyproject.toml
+.PHONY: distclean
distclean: clean
- rm -rf qemu.egg-info/ .venv/ .tox/ dist/
+ rm -rf qemu.egg-info/ .venv/ .tox/ $(QEMU_VENV_DIR) dist/
diff --git a/python/Pipfile.lock b/python/Pipfile.lock
index 5bb3f1b..8ab41a3 100644
--- a/python/Pipfile.lock
+++ b/python/Pipfile.lock
@@ -31,19 +31,19 @@
},
"astroid": {
"hashes": [
- "sha256:4db03ab5fc3340cf619dbc25e42c2cc3755154ce6009469766d7143d1fc2ee4e",
- "sha256:8a398dfce302c13f14bab13e2b14fe385d32b73f4e4853b9bdfb64598baa1975"
+ "sha256:09bdb456e02564731f8b5957cdd0c98a7f01d2db5e90eb1d794c353c28bfd705",
+ "sha256:6a8a51f64dae307f6e0c9db752b66a7951e282389d8362cc1d39a56f3feeb31d"
],
"markers": "python_version ~= '3.6'",
- "version": "==2.5.6"
+ "version": "==2.6.0"
},
"avocado-framework": {
"hashes": [
- "sha256:42aa7962df98d6b78d4efd9afa2177226dc630f3d83a2a7d5baf7a0a7da7fa1b",
- "sha256:d96ae343abf890e1ef3b3a6af5ce49e35f6bded0715770c4acb325bca555c515"
+ "sha256:3fca7226d7d164f124af8a741e7fa658ff4345a0738ddc32907631fd688b38ed",
+ "sha256:48ac254c0ae2ef0c0ceeb38e3d3df0388718eda8f48b3ab55b30b252839f42b1"
],
- "markers": "python_version >= '3.6'",
- "version": "==88.1"
+ "index": "pypi",
+ "version": "==87.0"
},
"distlib": {
"hashes": [
@@ -61,25 +61,27 @@
},
"flake8": {
"hashes": [
- "sha256:07528381786f2a6237b061f6e96610a4167b226cb926e2aa2b6b1d78057c576b",
- "sha256:bf8fd333346d844f616e8d47905ef3a3384edae6b4e9beb0c5101e25e3110907"
+ "sha256:6a35f5b8761f45c5513e3405f110a86bea57982c3b75b766ce7b65217abe1670",
+ "sha256:c01f8a3963b3571a8e6bd7a4063359aff90749e160778e03817cd9b71c9e07d2"
],
- "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
- "version": "==3.9.2"
+ "index": "pypi",
+ "version": "==3.6.0"
},
"fusepy": {
"hashes": [
- "sha256:72ff783ec2f43de3ab394e3f7457605bf04c8cf288a2f4068b4cde141d4ee6bd"
+ "sha256:10f5c7f5414241bffecdc333c4d3a725f1d6605cae6b4eaf86a838ff49cdaf6c",
+ "sha256:a9f3a3699080ddcf0919fd1eb2cf743e1f5859ca54c2018632f939bdfac269ee"
],
- "version": "==3.0.1"
+ "index": "pypi",
+ "version": "==2.0.4"
},
"importlib-metadata": {
"hashes": [
- "sha256:8c501196e49fb9df5df43833bdb1e4328f64847763ec8a50703148b73784d581",
- "sha256:d7eb1dea6d6a6086f8be21784cc9e3bcfa55872b52309bc5fad53a8ea444465d"
+ "sha256:90bb658cdbbf6d1735b6341ce708fc7024a3e14e99ffdc5783edea9f9b077f83",
+ "sha256:dc15b2969b4ce36305c51eebe62d418ac7791e9a157911d58bfb1f9ccd8e2070"
],
"markers": "python_version < '3.8'",
- "version": "==4.0.1"
+ "version": "==1.7.0"
},
"importlib-resources": {
"hashes": [
@@ -91,11 +93,11 @@
},
"isort": {
"hashes": [
- "sha256:0a943902919f65c5684ac4e0154b1ad4fac6dcaa5d9f3426b732f1c8b5419be6",
- "sha256:2bb1680aad211e3c9944dbce1d4ba09a989f04e238296c87fe2139faa26d655d"
+ "sha256:408e4d75d84f51b64d0824894afee44469eba34a4caee621dc53799f80d71ccc",
+ "sha256:64022dea6a06badfa09b300b4dfe8ba968114a737919e8ed50aea1c288f078aa"
],
- "markers": "python_version >= '3.6' and python_version < '4.0'",
- "version": "==5.8.0"
+ "index": "pypi",
+ "version": "==5.1.2"
},
"lazy-object-proxy": {
"hashes": [
@@ -134,31 +136,23 @@
},
"mypy": {
"hashes": [
- "sha256:0d0a87c0e7e3a9becdfbe936c981d32e5ee0ccda3e0f07e1ef2c3d1a817cf73e",
- "sha256:25adde9b862f8f9aac9d2d11971f226bd4c8fbaa89fb76bdadb267ef22d10064",
- "sha256:28fb5479c494b1bab244620685e2eb3c3f988d71fd5d64cc753195e8ed53df7c",
- "sha256:2f9b3407c58347a452fc0736861593e105139b905cca7d097e413453a1d650b4",
- "sha256:33f159443db0829d16f0a8d83d94df3109bb6dd801975fe86bacb9bf71628e97",
- "sha256:3f2aca7f68580dc2508289c729bd49ee929a436208d2b2b6aab15745a70a57df",
- "sha256:499c798053cdebcaa916eef8cd733e5584b5909f789de856b482cd7d069bdad8",
- "sha256:4eec37370483331d13514c3f55f446fc5248d6373e7029a29ecb7b7494851e7a",
- "sha256:552a815579aa1e995f39fd05dde6cd378e191b063f031f2acfe73ce9fb7f9e56",
- "sha256:5873888fff1c7cf5b71efbe80e0e73153fe9212fafdf8e44adfe4c20ec9f82d7",
- "sha256:61a3d5b97955422964be6b3baf05ff2ce7f26f52c85dd88db11d5e03e146a3a6",
- "sha256:674e822aa665b9fd75130c6c5f5ed9564a38c6cea6a6432ce47eafb68ee578c5",
- "sha256:7ce3175801d0ae5fdfa79b4f0cfed08807af4d075b402b7e294e6aa72af9aa2a",
- "sha256:9743c91088d396c1a5a3c9978354b61b0382b4e3c440ce83cf77994a43e8c521",
- "sha256:9f94aac67a2045ec719ffe6111df543bac7874cee01f41928f6969756e030564",
- "sha256:a26f8ec704e5a7423c8824d425086705e381b4f1dfdef6e3a1edab7ba174ec49",
- "sha256:abf7e0c3cf117c44d9285cc6128856106183938c68fd4944763003decdcfeb66",
- "sha256:b09669bcda124e83708f34a94606e01b614fa71931d356c1f1a5297ba11f110a",
- "sha256:cd07039aa5df222037005b08fbbfd69b3ab0b0bd7a07d7906de75ae52c4e3119",
- "sha256:d23e0ea196702d918b60c8288561e722bf437d82cb7ef2edcd98cfa38905d506",
- "sha256:d65cc1df038ef55a99e617431f0553cd77763869eebdf9042403e16089fe746c",
- "sha256:d7da2e1d5f558c37d6e8c1246f1aec1e7349e4913d8fb3cb289a35de573fe2eb"
+ "sha256:15b948e1302682e3682f11f50208b726a246ab4e6c1b39f9264a8796bb416aa2",
+ "sha256:219a3116ecd015f8dca7b5d2c366c973509dfb9a8fc97ef044a36e3da66144a1",
+ "sha256:3b1fc683fb204c6b4403a1ef23f0b1fac8e4477091585e0c8c54cbdf7d7bb164",
+ "sha256:3beff56b453b6ef94ecb2996bea101a08f1f8a9771d3cbf4988a61e4d9973761",
+ "sha256:7687f6455ec3ed7649d1ae574136835a4272b65b3ddcf01ab8704ac65616c5ce",
+ "sha256:7ec45a70d40ede1ec7ad7f95b3c94c9cf4c186a32f6bacb1795b60abd2f9ef27",
+ "sha256:86c857510a9b7c3104cf4cde1568f4921762c8f9842e987bc03ed4f160925754",
+ "sha256:8a627507ef9b307b46a1fea9513d5c98680ba09591253082b4c48697ba05a4ae",
+ "sha256:8dfb69fbf9f3aeed18afffb15e319ca7f8da9642336348ddd6cab2713ddcf8f9",
+ "sha256:a34b577cdf6313bf24755f7a0e3f3c326d5c1f4fe7422d1d06498eb25ad0c600",
+ "sha256:a8ffcd53cb5dfc131850851cc09f1c44689c2812d0beb954d8138d4f5fc17f65",
+ "sha256:b90928f2d9eb2f33162405f32dde9f6dcead63a0971ca8a1b50eb4ca3e35ceb8",
+ "sha256:c56ffe22faa2e51054c5f7a3bc70a370939c2ed4de308c690e7949230c995913",
+ "sha256:f91c7ae919bbc3f96cd5e5b2e786b2b108343d1d7972ea130f7de27fdd547cf3"
],
- "markers": "python_version >= '3.5'",
- "version": "==0.812"
+ "index": "pypi",
+ "version": "==0.770"
},
"mypy-extensions": {
"hashes": [
@@ -193,27 +187,26 @@
},
"pycodestyle": {
"hashes": [
- "sha256:514f76d918fcc0b55c6680472f0a37970994e07bbb80725808c17089be302068",
- "sha256:c389c1d06bf7904078ca03399a4816f974a1d590090fecea0c63ec26ebaf1cef"
+ "sha256:74abc4e221d393ea5ce1f129ea6903209940c1ecd29e002e8c6933c2b21026e0",
+ "sha256:cbc619d09254895b0d12c2c691e237b2e91e9b2ecf5e84c26b35400f93dcfb83",
+ "sha256:cbfca99bd594a10f674d0cd97a3d802a1fdef635d4361e1a2658de47ed261e3a"
],
- "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
- "version": "==2.7.0"
+ "version": "==2.4.0"
},
"pyflakes": {
"hashes": [
- "sha256:7893783d01b8a89811dd72d7dfd4d84ff098e5eed95cfa8905b22bbffe52efc3",
- "sha256:f5bc8ecabc05bb9d291eb5203d6810b49040f6ff446a756326104746cc00c1db"
+ "sha256:9a7662ec724d0120012f6e29d6248ae3727d821bba522a0e6b356eff19126a49",
+ "sha256:f661252913bc1dbe7fcfcbf0af0db3f42ab65aabd1a6ca68fe5d466bace94dae"
],
- "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
- "version": "==2.3.1"
+ "version": "==2.0.0"
},
"pylint": {
"hashes": [
- "sha256:586d8fa9b1891f4b725f587ef267abe2a1bad89d6b184520c7f07a253dd6e217",
- "sha256:f7e2072654a6b6afdf5e2fb38147d3e2d2d43c89f648637baab63e026481279b"
+ "sha256:082a6d461b54f90eea49ca90fff4ee8b6e45e8029e5dbd72f6107ef84f3779c0",
+ "sha256:a01cd675eccf6e25b3bdb42be184eb46aaf89187d612ba0fb5f93328ed6b0fd5"
],
- "markers": "python_version ~= '3.6'",
- "version": "==2.8.2"
+ "index": "pypi",
+ "version": "==2.8.0"
},
"pyparsing": {
"hashes": [
@@ -245,11 +238,11 @@
},
"tox": {
"hashes": [
- "sha256:307a81ddb82bd463971a273f33e9533a24ed22185f27db8ce3386bff27d324e3",
- "sha256:b0b5818049a1c1997599d42012a637a33f24c62ab8187223fdd318fa8522637b"
+ "sha256:c60692d92fe759f46c610ac04c03cf0169432d1ff8e981e8ae63e068d0954fc3",
+ "sha256:f179cb4043d7dc1339425dd49ab1dd8c916246b0d9173143c1b0af7498a03ab0"
],
- "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
- "version": "==3.23.1"
+ "index": "pypi",
+ "version": "==3.18.0"
},
"typed-ast": {
"hashes": [
diff --git a/python/README.rst b/python/README.rst
index dcf9938..9c1fcea 100644
--- a/python/README.rst
+++ b/python/README.rst
@@ -7,8 +7,7 @@ then by package (e.g. ``qemu/machine``, ``qemu/qmp``, etc).
``setup.py`` is used by ``pip`` to install this tooling to the current
environment. ``setup.cfg`` provides the packaging configuration used by
-``setup.py`` in a setuptools specific format. You will generally invoke
-it by doing one of the following:
+``setup.py``. You will generally invoke it by doing one of the following:
1. ``pip3 install .`` will install these packages to your current
environment. If you are inside a virtual environment, they will
@@ -17,12 +16,13 @@ it by doing one of the following:
2. ``pip3 install --user .`` will install these packages to your user's
local python packages. If you are inside of a virtual environment,
- this will fail; you likely want the first invocation above.
+ this will fail; you want the first invocation above.
-If you append the ``-e`` argument, pip will install in "editable" mode;
-which installs a version of the package that installs a forwarder
-pointing to these files, such that the package always reflects the
-latest version in your git tree.
+If you append the ``--editable`` or ``-e`` argument to either invocation
+above, pip will install in "editable" mode. This installs the package as
+a forwarder ("qemu.egg-link") that points to the source tree. In so
+doing, the installed package always reflects the latest version in your
+source tree.
Installing ".[devel]" instead of "." will additionally pull in required
packages for testing this package. They are not runtime requirements,
@@ -30,16 +30,45 @@ and are not needed to simply use these libraries.
Running ``make develop`` will pull in all testing dependencies and
install QEMU in editable mode to the current environment.
+(It is a shortcut for ``pip3 install -e .[devel]``.)
See `Installing packages using pip and virtual environments
<https://packaging.python.org/guides/installing-using-pip-and-virtual-environments/>`_
for more information.
+Using these packages without installing them
+--------------------------------------------
+
+These packages may be used without installing them first, by using one
+of two tricks:
+
+1. Set your PYTHONPATH environment variable to include this source
+ directory, e.g. ``~/src/qemu/python``. See
+ https://docs.python.org/3/using/cmdline.html#envvar-PYTHONPATH
+
+2. Inside a Python script, use ``sys.path`` to forcibly include a search
+ path prior to importing the ``qemu`` namespace. See
+ https://docs.python.org/3/library/sys.html#sys.path
+
+A strong downside to both approaches is that they generally interfere
+with static analysis tools being able to locate and analyze the code
+being imported.
+
+Package installation also normally provides executable console scripts,
+so that tools like ``qmp-shell`` are always available via $PATH. To
+invoke them without installation, you can invoke e.g.:
+
+``> PYTHONPATH=~/src/qemu/python python3 -m qemu.qmp.qmp_shell``
+
+The mappings between console script name and python module path can be
+found in ``setup.cfg``.
+
+
Files in this directory
-----------------------
-- ``qemu/`` Python package source directory.
+- ``qemu/`` Python 'qemu' namespace package source directory.
- ``tests/`` Python package tests directory.
- ``avocado.cfg`` Configuration for the Avocado test-runner.
Used by ``make check`` et al.
@@ -50,7 +79,7 @@ Files in this directory
- ``PACKAGE.rst`` is used as the README file that is visible on PyPI.org.
- ``Pipfile`` is used by Pipenv to generate ``Pipfile.lock``.
- ``Pipfile.lock`` is a set of pinned package dependencies that this package
- is tested under in our CI suite. It is used by ``make venv-check``.
+ is tested under in our CI suite. It is used by ``make check-pipenv``.
- ``README.rst`` you are here!
- ``VERSION`` contains the PEP-440 compliant version used to describe
this package; it is referenced by ``setup.cfg``.
diff --git a/python/qemu/machine/__init__.py b/python/qemu/machine/__init__.py
index 728f27a..9ccd58e 100644
--- a/python/qemu/machine/__init__.py
+++ b/python/qemu/machine/__init__.py
@@ -4,10 +4,10 @@ QEMU development and testing library.
This library provides a few high-level classes for driving QEMU from a
test suite, not intended for production use.
-- QEMUMachine: Configure and Boot a QEMU VM
- - QEMUQtestMachine: VM class, with a qtest socket.
+ | QEMUQtestProtocol: send/receive qtest messages.
+ | QEMUMachine: Configure and Boot a QEMU VM
+ | +-- QEMUQtestMachine: VM class, with a qtest socket.
-- QEMUQtestProtocol: Connect to, send/receive qtest messages.
"""
# Copyright (C) 2020-2021 John Snow for Red Hat Inc.
diff --git a/python/qemu/machine/machine.py b/python/qemu/machine/machine.py
index b624355..d47ab3d 100644
--- a/python/qemu/machine/machine.py
+++ b/python/qemu/machine/machine.py
@@ -84,6 +84,7 @@ class QEMUMachine:
...
# vm is guaranteed to be shut down here
"""
+ # pylint: disable=too-many-instance-attributes, too-many-public-methods
def __init__(self,
binary: str,
@@ -111,6 +112,8 @@ class QEMUMachine:
@param console_log: (optional) path to console log file
@note: Qemu process is not started until launch() is used.
'''
+ # pylint: disable=too-many-arguments
+
# Direct user configuration
self._binary = binary
@@ -542,7 +545,8 @@ class QEMUMachine:
@param enabled: if False, qmp monitor options will be removed from
the base arguments of the resulting QEMU command
line. Default is True.
- @note: call this function before launch().
+
+ .. note:: Call this function before launch().
"""
self._qmp_set = enabled
diff --git a/python/qemu/machine/py.typed b/python/qemu/machine/py.typed
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/python/qemu/machine/py.typed
diff --git a/python/qemu/machine/qtest.py b/python/qemu/machine/qtest.py
index 9370068..d6d9c6a 100644
--- a/python/qemu/machine/qtest.py
+++ b/python/qemu/machine/qtest.py
@@ -116,6 +116,8 @@ class QEMUQtestMachine(QEMUMachine):
base_temp_dir: str = "/var/tmp",
socket_scm_helper: Optional[str] = None,
sock_dir: Optional[str] = None):
+ # pylint: disable=too-many-arguments
+
if name is None:
name = "qemu-%d" % os.getpid()
if sock_dir is None:
diff --git a/python/qemu/qmp/__init__.py b/python/qemu/qmp/__init__.py
index 376954c..269516a 100644
--- a/python/qemu/qmp/__init__.py
+++ b/python/qemu/qmp/__init__.py
@@ -279,6 +279,7 @@ class QEMUMonitorProtocol:
None). The value passed will set the behavior of the
underneath QMP socket as described in [1].
Default value is set to 15.0.
+
@return QMP greeting dict
@raise OSError on socket connection errors
@raise QMPConnectError if the greeting is not received
diff --git a/python/qemu/qmp/py.typed b/python/qemu/qmp/py.typed
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/python/qemu/qmp/py.typed
diff --git a/python/qemu/qmp/qom.py b/python/qemu/qmp/qom.py
index 7ec7843..8ff28a8 100644
--- a/python/qemu/qmp/qom.py
+++ b/python/qemu/qmp/qom.py
@@ -38,8 +38,8 @@ from .qom_common import QOMCommand
try:
from .qom_fuse import QOMFuse
-except ModuleNotFoundError as err:
- if err.name != 'fuse':
+except ModuleNotFoundError as _err:
+ if _err.name != 'fuse':
raise
else:
assert issubclass(QOMFuse, QOMCommand)
diff --git a/python/qemu/qmp/qom_common.py b/python/qemu/qmp/qom_common.py
index f82b167..a59ae1a 100644
--- a/python/qemu/qmp/qom_common.py
+++ b/python/qemu/qmp/qom_common.py
@@ -156,7 +156,7 @@ class QOMCommand:
"""
Run a fully-parsed subcommand, with error-handling for the CLI.
- :return: The return code from `.run()`.
+ :return: The return code from `run()`.
"""
try:
cmd = cls(args)
diff --git a/python/qemu/utils/accel.py b/python/qemu/utils/accel.py
index 297933d..386ff64 100644
--- a/python/qemu/utils/accel.py
+++ b/python/qemu/utils/accel.py
@@ -36,7 +36,7 @@ def list_accel(qemu_bin: str) -> List[str]:
List accelerators enabled in the QEMU binary.
@param qemu_bin (str): path to the QEMU binary.
- @raise Exception: if failed to run `qemu -accel help`
+ @raise Exception: if failed to run ``qemu -accel help``
@return a list of accelerator names.
"""
if not qemu_bin:
diff --git a/python/qemu/utils/py.typed b/python/qemu/utils/py.typed
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/python/qemu/utils/py.typed
diff --git a/python/setup.cfg b/python/setup.cfg
index 85cecbb..11f71d5 100644
--- a/python/setup.cfg
+++ b/python/setup.cfg
@@ -19,6 +19,7 @@ classifiers =
Programming Language :: Python :: 3.8
Programming Language :: Python :: 3.9
Programming Language :: Python :: 3.10
+ Typing :: Typed
[options]
python_requires = >= 3.6
@@ -27,8 +28,13 @@ packages =
qemu.machine
qemu.utils
+[options.package_data]
+* = py.typed
+
[options.extras_require]
-# Run `pipenv lock --dev` when changing these requirements.
+# For the devel group, When adding new dependencies or bumping the minimum
+# version, use e.g. "pipenv install --dev pylint==3.0.0".
+# Subsequently, edit 'Pipfile' to remove e.g. 'pylint = "==3.0.0'.
devel =
avocado-framework >= 87.0
flake8 >= 3.6.0
@@ -56,8 +62,6 @@ console_scripts =
[flake8]
extend-ignore = E722 # Prefer pylint's bare-except checks to flake8's
exclude = __pycache__,
- .venv,
- .tox,
[mypy]
strict = True
@@ -83,9 +87,7 @@ ignore_missing_imports = True
# --enable=similarities". If you want to run only the classes checker, but have
# no Warning level messages displayed, use "--disable=all --enable=classes
# --disable=W".
-disable=too-many-arguments,
- too-many-instance-attributes,
- too-many-public-methods,
+disable=
[pylint.basic]
# Good variable names which should always be accepted, separated by a comma.
diff --git a/python/tests/flake8.sh b/python/tests/flake8.sh
index 51e0788..1cd7d40 100755
--- a/python/tests/flake8.sh
+++ b/python/tests/flake8.sh
@@ -1,2 +1,2 @@
#!/bin/sh -e
-python3 -m flake8
+python3 -m flake8 qemu/