qemu-block
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v2 1/8] iotests/297: Allow checking all Python test files


From: Vladimir Sementsov-Ogievskiy
Subject: Re: [PATCH v2 1/8] iotests/297: Allow checking all Python test files
Date: Wed, 13 Jan 2021 23:28:13 +0300
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.6.0

13.01.2021 22:27, Vladimir Sementsov-Ogievskiy wrote:
13.01.2021 20:57, Max Reitz wrote:
I.e., all Python files in the qemu-iotests/ directory.

Most files of course do not pass, so there is an extensive skip list for
now.  (The only files that do pass are 209, 254, 283, and iotests.py.)

(Alternatively, we could have the opposite, i.e. an explicit list of
files that we do want to check, but I think it is better to check files
by default.)

I decided to include the list of files checked in the reference output,
so we do not accidentally lose coverage of anything.  That means adding
new Python tests will require a change to 297.out, but that should not
be a problem.

I have a parallel series, "Rework iotests/check", one of its aims is drop
group file, to avoid these endless conflicts in group file when you want
to send series or when you are porting patches to/from downstream.

And you are trying to add one another "group" file :) I don't like the idea.

Why should we loose accidentally the coverage? Logic is extremely simple:
all files except for the list.


Also.. What about checking python in python :) ? I exercised myself,
rewriting it into python. Take it if you like:
(suddenly, pylint warns about "TODO"s, so I just drop a TODO line.. Probably
 we'll have to suppress this warning in 297)



import os
import shutil
import subprocess

import iotests

iotests.script_initialize()


def is_python_file(filename):
    if filename.endswith('.py'):
        return True

    with open(filename) as f:
        try:
            first_line = f.readline()
            if first_line.startswith('#!') and 'python' in first_line:
                return True
        except UnicodeDecodeError:  # ignore core files, etc
            pass

    return False


for linter in ('pylint-3', 'mypy'):
    if shutil.which(linter) is None:
        iotests.notrun(f'{linter} not found')

skip_files = (
    '030', '040', '041', '044', '045', '055', '056', '057', '065', '093',
    '096', '118', '124', '129', '132', '136', '139', '147', '148', '149',
    '151', '152', '155', '163', '165', '169', '194', '196', '199', '202',
    '203', '205', '206', '207', '208', '210', '211', '212', '213', '216',
    '218', '219', '222', '224', '228', '234', '235', '236', '237', '238',
    '240', '242', '245', '246', '248', '255', '256', '257', '258', '260',
    '262', '264', '266', '274', '277', '280', '281', '295', '296', '298',
    '299', '300', '302', '303', '304', '307', 'nbd-fault-injector.py',
    'qcow2.py', 'qcow2_format.py', 'qed.py'
)

files = [f for f in (set(os.listdir('.')) - set(skip_files))
         if os.path.isfile(f) and is_python_file(f)]

# We can pass all files to pylint at once...
subprocess.run(['pylint-3', '--score=n'] + files, check=False)

# ...but mypy needs to be called once per file.  Otherwise, it will
# interpret all given files as belonging together (i.e., they may not
# both define the same classes, etc.; most notably, they must not both
# define the __main__ module).
os.environ['MYPYPATH'] = '../../python/'
for file in files:
    p = subprocess.run(['mypy', '--warn-unused-configs',
                        '--disallow-subclassing-any',
                        '--disallow-any-generics',
                        '--disallow-incomplete-defs',
                        '--disallow-untyped-decorators',
                        '--no-implicit-optional', '--warn-redundant-casts',
                        '--warn-unused-ignores', '--no-implicit-reexport',
                        file], check=False,
                       stdout=subprocess.PIPE,
                       stderr=subprocess.STDOUT)

    if p.returncode != 0:
        print(p.stdout)




--
Best regards,
Vladimir



reply via email to

[Prev in Thread] Current Thread [Next in Thread]