leapp-repository/SOURCES/0032-pylint-enable-consider-using-with.patch
2025-12-01 09:14:24 +00:00

166 lines
7.6 KiB
Diff

From 006517ea2d69d3f0d9e3de2eb67bfb4d32f20551 Mon Sep 17 00:00:00 2001
From: Tomas Fratrik <tfratrik@redhat.com>
Date: Wed, 13 Aug 2025 10:46:10 +0200
Subject: [PATCH 32/55] pylint: enable consider-using-with
Emitted when a resource-allocating assignment or call could be replaced
by a 'with' block. Enabling this warning enforces using 'with' to ensure
resources are properly released even if an exception occurs.
* ifcfgscanner: use StringIO in tests instead of mock_open for iteration support with 'with open'
Jira: RHELMISC-16038
---
.pylintrc | 1 -
.../ifcfgscanner/libraries/ifcfgscanner.py | 27 +++++++++----------
.../tests/unit_test_ifcfgscanner.py | 8 +++---
.../luksscanner/tests/test_luksdump_parser.py | 8 +++---
.../scansaphana/tests/test_scansaphana.py | 6 ++---
.../system_upgrade/common/libraries/guards.py | 2 +-
6 files changed, 25 insertions(+), 27 deletions(-)
diff --git a/.pylintrc b/.pylintrc
index e54d9a54..fd770061 100644
--- a/.pylintrc
+++ b/.pylintrc
@@ -51,7 +51,6 @@ disable=
super-with-arguments, # required in python 2
raise-missing-from, # no 'raise from' in python 2
use-a-generator, # cannot be modified because of Python2 support
- consider-using-with, # on bunch spaces we cannot change that...
duplicate-string-formatting-argument, # TMP: will be fixed in close future
consider-using-f-string, # sorry, not gonna happen, still have to support py2
use-dict-literal,
diff --git a/repos/system_upgrade/common/actors/ifcfgscanner/libraries/ifcfgscanner.py b/repos/system_upgrade/common/actors/ifcfgscanner/libraries/ifcfgscanner.py
index 683327b3..f0c8b847 100644
--- a/repos/system_upgrade/common/actors/ifcfgscanner/libraries/ifcfgscanner.py
+++ b/repos/system_upgrade/common/actors/ifcfgscanner/libraries/ifcfgscanner.py
@@ -18,23 +18,22 @@ def process_ifcfg(filename, secrets=False):
return None
properties = []
- for line in open(filename).readlines():
- try:
- (name, value) = line.split("#")[0].strip().split("=")
+ with open(filename) as f:
+ for line in f:
+ try:
+ (name, value) = line.split("#")[0].strip().split("=")
+ except ValueError:
+ # We're not interested in lines that are not
+ # simple assignments. Play it safe.
+ continue
+
if secrets:
value = None
- except ValueError:
- # We're not interested in lines that are not
- # simple assignments. Play it safe.
- continue
-
- # Deal with simple quoting. We don't expand anything, nor do
- # multiline strings or anything of that sort.
- if value is not None and len(value) > 1 and value[0] == value[-1]:
- if value.startswith('"') or value.startswith("'"):
+ elif len(value) > 1 and value[0] in ('"', "'") and value[0] == value[-1]:
+ # Deal with simple quoting. We don't expand anything, nor do
+ # multiline strings or anything of that sort.
value = value[1:-1]
-
- properties.append(IfCfgProperty(name=name, value=value))
+ properties.append(IfCfgProperty(name=name, value=value))
return properties
diff --git a/repos/system_upgrade/common/actors/ifcfgscanner/tests/unit_test_ifcfgscanner.py b/repos/system_upgrade/common/actors/ifcfgscanner/tests/unit_test_ifcfgscanner.py
index d3b4846f..d996de84 100644
--- a/repos/system_upgrade/common/actors/ifcfgscanner/tests/unit_test_ifcfgscanner.py
+++ b/repos/system_upgrade/common/actors/ifcfgscanner/tests/unit_test_ifcfgscanner.py
@@ -1,5 +1,6 @@
import errno
import textwrap
+from io import StringIO
from os.path import basename
import mock
@@ -63,8 +64,7 @@ def test_ifcfg1(monkeypatch):
KEY_TYPE=key
""")
- mock_config = mock.mock_open(read_data=ifcfg_file)
- with mock.patch(_builtins_open, mock_config):
+ with mock.patch(_builtins_open, return_value=StringIO(ifcfg_file)):
monkeypatch.setattr(ifcfgscanner, "listdir", _listdir_ifcfg)
monkeypatch.setattr(ifcfgscanner.path, "exists", _exists_ifcfg)
monkeypatch.setattr(api, "produce", produce_mocked())
@@ -110,8 +110,8 @@ def test_ifcfg_key(monkeypatch):
Report ifcfg secrets from keys- file.
"""
- mock_config = mock.mock_open(read_data="KEY_PASSPHRASE1=Hell0")
- with mock.patch(_builtins_open, mock_config):
+ file_data = "KEY_PASSPHRASE1=Hell0"
+ with mock.patch(_builtins_open, side_effect=lambda *a, **k: StringIO(file_data)):
monkeypatch.setattr(ifcfgscanner, "listdir", _listdir_ifcfg)
monkeypatch.setattr(ifcfgscanner.path, "exists", _exists_keys)
monkeypatch.setattr(api, "produce", produce_mocked())
diff --git a/repos/system_upgrade/common/actors/luksscanner/tests/test_luksdump_parser.py b/repos/system_upgrade/common/actors/luksscanner/tests/test_luksdump_parser.py
index 4b190149..f0482eef 100644
--- a/repos/system_upgrade/common/actors/luksscanner/tests/test_luksdump_parser.py
+++ b/repos/system_upgrade/common/actors/luksscanner/tests/test_luksdump_parser.py
@@ -7,8 +7,8 @@ CUR_DIR = os.path.dirname(os.path.abspath(__file__))
def test_luksdump_parser_luks1(current_actor_context):
- f = open(os.path.join(CUR_DIR, 'files/luksDump_nvme0n1p3_luks1.txt'))
- parsed_dict = LuksDumpParser.parse(f.readlines())
+ with open(os.path.join(CUR_DIR, 'files/luksDump_nvme0n1p3_luks1.txt')) as f:
+ parsed_dict = LuksDumpParser.parse(f.readlines())
assert parsed_dict["Version"] == "1"
assert parsed_dict["Cipher name"] == "aes"
@@ -39,8 +39,8 @@ def test_luksdump_parser_luks1(current_actor_context):
def test_luksdump_parser_luks2_tokens(current_actor_context):
- f = open(os.path.join(CUR_DIR, 'files/luksDump_nvme0n1p3_luks2_tokens.txt'))
- parsed_dict = LuksDumpParser.parse(f.readlines())
+ with open(os.path.join(CUR_DIR, 'files/luksDump_nvme0n1p3_luks2_tokens.txt')) as f:
+ parsed_dict = LuksDumpParser.parse(f.readlines())
assert parsed_dict["Version"] == "2"
assert parsed_dict["Epoch"] == "9"
diff --git a/repos/system_upgrade/common/actors/scansaphana/tests/test_scansaphana.py b/repos/system_upgrade/common/actors/scansaphana/tests/test_scansaphana.py
index 0b55c9fb..38a1cae7 100644
--- a/repos/system_upgrade/common/actors/scansaphana/tests/test_scansaphana.py
+++ b/repos/system_upgrade/common/actors/scansaphana/tests/test_scansaphana.py
@@ -77,9 +77,9 @@ class SubprocessCall(object):
assert args[0][0:3] == ['sudo', '-u', self.admusername]
cmd = args[0][3:]
kwargs.pop('checked', None)
- p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
- p.wait()
- return {'exit_code': p.returncode, 'stdout': p.stdout.read()}
+ with subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) as p:
+ stdout, stderr = p.communicate()
+ return {'exit_code': p.returncode, 'stdout': stdout.decode('utf-8'), 'stderr': stderr.decode('utf-8')}
def test_scansaphana_get_instance_status(monkeypatch):
diff --git a/repos/system_upgrade/common/libraries/guards.py b/repos/system_upgrade/common/libraries/guards.py
index c8001817..ea2bf4dd 100644
--- a/repos/system_upgrade/common/libraries/guards.py
+++ b/repos/system_upgrade/common/libraries/guards.py
@@ -34,7 +34,7 @@ def guarded_execution(*guards):
def connection_guard(url='https://example.com'):
def closure():
try:
- urlopen(url)
+ urlopen(url) # pylint: disable=consider-using-with
return None
except URLError as e:
cause = '''Failed to open url '{url}' with error: {error}'''.format(url=url, error=e)
--
2.51.1