[virt-tools-list] [virt-bootstrap] [PATCH v3 04/24] Use explicit import

Cedric Bosdonnat cbosdonnat at suse.com
Wed Aug 2 15:11:54 UTC 2017


On Wed, 2017-08-02 at 13:08 +0100, Radostin Stoyanov wrote:
> Reduce the number of import statements and improve readability.
> Update the unit tests to match these changes.
> ---
>  setup.py                     | 13 ++++++-------
>  src/virtBootstrap/sources.py | 11 ++++++++---
>  src/virtBootstrap/utils.py   | 32 ++++++++++++++++++++++--------
>  tests/test_docker_source.py  |  4 ++--
>  tests/test_utils.py          | 46 ++++++++++++++++++++++++++------------------
>  5 files changed, 67 insertions(+), 39 deletions(-)
> 
> diff --git a/setup.py b/setup.py
> index 2f299b6..2d06144 100755
> --- a/setup.py
> +++ b/setup.py
> @@ -9,9 +9,8 @@ based on setuptools.
>  import codecs
>  import os
>  import sys
> -from subprocess import call
> -from setuptools import Command
> -from setuptools import setup
> +import subprocess
> +import setuptools
>  
>  
>  def read(fname):
> @@ -23,7 +22,7 @@ def read(fname):
>          return fobj.read()
>  
>  
> -class CheckPylint(Command):
> +class CheckPylint(setuptools.Command):
>      """
>      Check python source files with pylint and pycodestyle.
>      """
> @@ -55,7 +54,7 @@ class CheckPylint(Command):
>  
>          print(">>> Running pycodestyle ...")
>          cmd = "pycodestyle "
> -        if (call(cmd + files, shell=True) != 0):
> +        if (subprocess.call(cmd + files, shell=True) != 0):
>              res = 1
>  
>          print(">>> Running pylint ...")
> @@ -63,13 +62,13 @@ class CheckPylint(Command):
>          if self.errors_only:
>              args = "-E"
>          cmd = "pylint %s --output-format=%s " % (args, format(output_format))
> -        if (call(cmd + files, shell=True) != 0):
> +        if (subprocess.call(cmd + files, shell=True) != 0):
>              res = 1
>  
>          sys.exit(res)
>  
>  
> -setup(
> +setuptools.setup(
>      name='virt-bootstrap',
>      version='0.1.0',
>      author='Cedric Bosdonnat',
> diff --git a/src/virtBootstrap/sources.py b/src/virtBootstrap/sources.py
> index f4bae72..40b66f9 100644
> --- a/src/virtBootstrap/sources.py
> +++ b/src/virtBootstrap/sources.py
> @@ -25,7 +25,7 @@ import shutil
>  import getpass
>  import os
>  import logging
> -from subprocess import CalledProcessError, PIPE, Popen
> +import subprocess
>  
>  from virtBootstrap import utils
>  
> @@ -259,12 +259,17 @@ class DockerSource(object):
>          """
>          Parse the output from skopeo copy to track download progress.
>          """
> -        proc = Popen(cmd, stdout=PIPE, stderr=PIPE, universal_newlines=True)
> +        proc = subprocess.Popen(
> +            cmd,
> +            stdout=subprocess.PIPE,
> +            stderr=subprocess.PIPE,
> +            universal_newlines=True
> +        )
>  
>          # Without `make_async`, `fd.read` in `read_async` blocks.
>          utils.make_async(proc.stdout)
>          if not self.parse_output(proc):
> -            raise CalledProcessError(proc.returncode, ' '.join(cmd))
> +            raise subprocess.CalledProcessError(proc.returncode, ' '.join(cmd))
>  
>      def validate_image_layers(self):
>          """
> diff --git a/src/virtBootstrap/utils.py b/src/virtBootstrap/utils.py
> index dbe4677..63ef57a 100644
> --- a/src/virtBootstrap/utils.py
> +++ b/src/virtBootstrap/utils.py
> @@ -27,12 +27,12 @@ import fcntl
>  import hashlib
>  import json
>  import os
> +import subprocess
>  import sys
>  import tempfile
>  import logging
>  import re
>  
> -from subprocess import CalledProcessError, PIPE, Popen
>  import passlib.hosts
>  
>  # pylint: disable=invalid-name
> @@ -80,7 +80,11 @@ def execute(cmd):
>      cmd_str = ' '.join(cmd)
>      logger.debug("Call command:\n%s", cmd_str)
>  
> -    proc = Popen(cmd, stdout=PIPE, stderr=PIPE)
> +    proc = subprocess.Popen(
> +        cmd,
> +        stdout=subprocess.PIPE,
> +        stderr=subprocess.PIPE
> +    )
>      output, err = proc.communicate()
>  
>      if output:
> @@ -89,7 +93,7 @@ def execute(cmd):
>          logger.debug("Stderr:\n%s", err.decode('utf-8'))
>  
>      if proc.returncode != 0:
> -        raise CalledProcessError(proc.returncode, cmd_str)
> +        raise subprocess.CalledProcessError(proc.returncode, cmd_str)
>  
>  
>  def safe_untar(src, dest):
> @@ -170,8 +174,12 @@ def get_mime_type(path):
>      """
>          Get the mime type of a file.
>      """
> -    return (Popen(["/usr/bin/file", "--mime-type", path], stdout=PIPE)
> -            .stdout.read().decode('utf-8').split()[1])
> +    return (
> +        subprocess.Popen(
> +            ["/usr/bin/file", "--mime-type", path],
> +            stdout=subprocess.PIPE
> +        ).stdout.read().decode('utf-8').split()[1]
> +    )
>  
>  
>  def create_qcow2(tar_file, layer_file, backing_file=None, size=DEF_QCOW2_SIZE):
> @@ -273,7 +281,11 @@ def get_image_details(src, raw=False,
>          cmd.append('--tls-verify=false')
>      if username and password:
>          cmd.append("--creds=%s:%s" % (username, password))
> -    proc = Popen(cmd, stdout=PIPE, stderr=PIPE)
> +    proc = subprocess.Popen(
> +        cmd,
> +        stdout=subprocess.PIPE,
> +        stderr=subprocess.PIPE
> +    )
>      output, error = proc.communicate()
>      if error:
>          raise ValueError("Image could not be retrieved:",
> @@ -396,8 +408,12 @@ def write_progress(prog):
>      """
>      # Get terminal width
>      try:
> -        terminal_width = int(Popen(["stty", "size"], stdout=PIPE).stdout
> -                             .read().decode('utf-8').split()[1])
> +        terminal_width = int(
> +            subprocess.Popen(
> +                ["stty", "size"],
> +                stdout=subprocess.PIPE
> +            ).stdout.read().decode('utf-8').split()[1]
> +        )
>      except Exception:
>          terminal_width = 80
>      # Prepare message
> diff --git a/tests/test_docker_source.py b/tests/test_docker_source.py
> index 8108e31..4c52173 100644
> --- a/tests/test_docker_source.py
> +++ b/tests/test_docker_source.py
> @@ -375,7 +375,7 @@ class TestDockerSource(unittest.TestCase):
>          """
>          m_self = mock.Mock(spec=sources.DockerSource)
>          m_self.parse_output.return_value = parse_output_return
> -        with mock.patch.multiple('virtBootstrap.sources',
> +        with mock.patch.multiple('virtBootstrap.sources.subprocess',
>                                   Popen=mock.DEFAULT,
>                                   PIPE=mock.DEFAULT) as mocked:
>              with mock.patch('virtBootstrap.utils.make_async') as m_make_async:
> @@ -402,7 +402,7 @@ class TestDockerSource(unittest.TestCase):
>          Ensures that read_skopeo_progress() raise CalledProcessError
>          when parse_output() returns false.
>          """
> -        with self.assertRaises(sources.CalledProcessError):
> +        with self.assertRaises(sources.subprocess.CalledProcessError):
>              self._mock_read_skopeo_progress('test', False)
>  
>      ###################################
> diff --git a/tests/test_utils.py b/tests/test_utils.py
> index aa9bdc2..0b6ccc0 100644
> --- a/tests/test_utils.py
> +++ b/tests/test_utils.py
> @@ -90,12 +90,12 @@ class TestUtils(unittest.TestCase):
>          """
>          with mock.patch.multiple(utils,
>                                   logger=mock.DEFAULT,
> -                                 Popen=mock.DEFAULT) as mocked:
> +                                 subprocess=mock.DEFAULT) as mocked:
>              cmd = ['foo']
>              output, err = 'test_out', 'test_err'
>  
> -            mocked['Popen'].return_value.returncode = 0
> -            (mocked['Popen'].return_value
> +            mocked['subprocess'].Popen.return_value.returncode = 0
> +            (mocked['subprocess'].Popen.return_value
>               .communicate.return_value) = (output.encode(), err.encode())
>  
>              utils.execute(cmd)
> @@ -108,10 +108,10 @@ class TestUtils(unittest.TestCase):
>          Ensures that execute() raise CalledProcessError exception when the
>          exit code of process is not 0.
>          """
> -        with mock.patch('virtBootstrap.utils.Popen') as m_popen:
> +        with mock.patch('virtBootstrap.utils.subprocess.Popen') as m_popen:
>              m_popen.return_value.returncode = 1
>              m_popen.return_value.communicate.return_value = (b'output', b'err')
> -            with self.assertRaises(utils.CalledProcessError):
> +            with self.assertRaises(utils.subprocess.CalledProcessError):
>                  utils.execute(['foo'])
>  
>      ###################################
> @@ -191,7 +191,7 @@ class TestUtils(unittest.TestCase):
>      ###################################
>      # Tests for: get_mime_type()
>      ###################################
> -    @mock.patch('virtBootstrap.utils.Popen')
> +    @mock.patch('virtBootstrap.utils.subprocess.Popen')
>      def test_utils_get_mime_type(self, m_popen):
>          """
>          Ensures that get_mime_type() returns the detected MIME type
> @@ -202,8 +202,10 @@ class TestUtils(unittest.TestCase):
>          stdout = ('%s: %s' % (path, mime)).encode()
>          m_popen.return_value.stdout.read.return_value = stdout
>          self.assertEqual(utils.get_mime_type(path), mime)
> -        m_popen.assert_called_once_with(["/usr/bin/file", "--mime-type", path],
> -                                        stdout=utils.PIPE)
> +        m_popen.assert_called_once_with(
> +            ["/usr/bin/file", "--mime-type", path],
> +            stdout=utils.subprocess.PIPE
> +        )
>  
>      ###################################
>      # Tests for: untar_layers()
> @@ -356,7 +358,7 @@ class TestUtils(unittest.TestCase):
>      ###################################
>      # Tests for: get_image_details()
>      ###################################
> -    @mock.patch('virtBootstrap.utils.Popen')
> +    @mock.patch('virtBootstrap.utils.subprocess.Popen')
>      def test_utils_get_image_details_raise_error_on_fail(self, m_popen):
>          """
>          Ensures that get_image_details() throws ValueError exception
> @@ -367,7 +369,7 @@ class TestUtils(unittest.TestCase):
>          with self.assertRaises(ValueError):
>              utils.get_image_details(src)
>  
> -    @mock.patch('virtBootstrap.utils.Popen')
> +    @mock.patch('virtBootstrap.utils.subprocess.Popen')
>      def test_utils_get_image_details_return_json_obj_on_success(self, m_popen):
>          """
>          Ensures that get_image_details() returns python dictionary which
> @@ -393,7 +395,7 @@ class TestUtils(unittest.TestCase):
>                 '--tls-verify=false',
>                 "--creds=%s:%s" % (username, password)]
>  
> -        with mock.patch.multiple(utils,
> +        with mock.patch.multiple(utils.subprocess,
>                                   Popen=mock.DEFAULT,
>                                   PIPE=mock.DEFAULT) as mocked:
>              mocked['Popen'].return_value.communicate.return_value = [b'{}',
> @@ -457,7 +459,11 @@ class TestUtils(unittest.TestCase):
>          Ensures that make_async() sets O_NONBLOCK flag on PIPE.
>          """
>  
> -        pipe = utils.Popen(["echo"], stdout=utils.PIPE).stdout
> +        pipe = utils.subprocess.Popen(
> +            ["echo"],
> +            stdout=utils.subprocess.PIPE
> +        ).stdout
> +
>          fd = pipe.fileno()
>          F_GETFL = utils.fcntl.F_GETFL
>          O_NONBLOCK = utils.os.O_NONBLOCK
> @@ -661,17 +667,18 @@ class TestUtils(unittest.TestCase):
>          terminal_width = 120
>          prog = {'status': 'status', 'value': 0}
>          with mock.patch.multiple(utils,
> -                                 Popen=mock.DEFAULT,
> -                                 PIPE=mock.DEFAULT,
> +                                 subprocess=mock.DEFAULT,
>                                   sys=mock.DEFAULT) as mocked:
>  
> -            (mocked['Popen'].return_value.stdout
> +            (mocked['subprocess'].Popen.return_value.stdout
>               .read.return_value) = ("20 %s" % terminal_width).encode()
>  
>              utils.write_progress(prog)
>  
> -        mocked['Popen'].assert_called_once_with(["stty", "size"],
> -                                                stdout=mocked['PIPE'])
> +        mocked['subprocess'].Popen.assert_called_once_with(
> +            ["stty", "size"],
> +            stdout=mocked['subprocess'].PIPE
> +        )
>          output_message = mocked['sys'].stdout.write.call_args[0][0]
>          mocked['sys'].stdout.write.assert_called_once()
>          self.assertEqual(len(output_message), terminal_width + 1)
> @@ -685,9 +692,10 @@ class TestUtils(unittest.TestCase):
>          """
>          default_terminal_width = 80
>          prog = {'status': 'status', 'value': 0}
> -        with mock.patch.multiple(utils, Popen=mock.DEFAULT,
> +        with mock.patch.multiple(utils,
> +                                 subprocess=mock.DEFAULT,
>                                   sys=mock.DEFAULT) as mocked:
> -            mocked['Popen'].side_effect = Exception()
> +            mocked['subprocess'].Popen.side_effect = Exception()
>              utils.write_progress(prog)
>  
>          self.assertEqual(len(mocked['sys'].stdout.write.call_args[0][0]),

ACK

--
Cedric




More information about the virt-tools-list mailing list