Skip to content

Commit

Permalink
Merge pull request #883 from p12tic/lint-fixes
Browse files Browse the repository at this point in the history
Enable ruff check and fix lint errors
  • Loading branch information
p12tic authored Mar 8, 2024
2 parents 1ba1c36 + ed39523 commit a8db898
Show file tree
Hide file tree
Showing 12 changed files with 87 additions and 65 deletions.
2 changes: 2 additions & 0 deletions .github/workflows/static-checks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,5 +16,7 @@ jobs:
- uses: actions/checkout@v3
- name: Analysing the code with ruff
run: |
set -e
pip install -r test-requirements.txt
ruff format --check
ruff check
2 changes: 1 addition & 1 deletion examples/hello-python/app/web.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# pylint: disable=import-error
# pylint: disable=unused-import
import os
import asyncio # noqa: F401
import os

import aioredis
from aiohttp import web
Expand Down
81 changes: 46 additions & 35 deletions podman_compose.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,21 +7,20 @@
# https://docs.docker.com/compose/django/
# https://docs.docker.com/compose/wordpress/
# TODO: podman pod logs --color -n -f pod_testlogs
import sys
import os
import getpass
import argparse
import itertools
import subprocess
import re
import asyncio.subprocess
import getpass
import glob
import hashlib
import random
import itertools
import json
import glob
import asyncio.subprocess
import signal

import os
import random
import re
import shlex
import signal
import subprocess
import sys
from asyncio import Task

try:
Expand Down Expand Up @@ -126,7 +125,8 @@ def str_to_seconds(txt):
mins = int(mins) if mins else 0
sec = float(sec) if sec else 0
# "podman stop" takes only int
# Error: invalid argument "3.0" for "-t, --time" flag: strconv.ParseUint: parsing "3.0": invalid syntax
# Error: invalid argument "3.0" for "-t, --time" flag: strconv.ParseUint: parsing "3.0":
# invalid syntax
return int(mins * 60.0 + sec)


Expand Down Expand Up @@ -389,7 +389,8 @@ async def assert_volume(compose, mount_dict):
is_ext = vol.get("external", None)
log(f"podman volume inspect {vol_name} || podman volume create {vol_name}")
# TODO: might move to using "volume list"
# podman volume list --format '{{.Name}}\t{{.MountPoint}}' -f 'label=io.podman.compose.project=HERE'
# podman volume list --format '{{.Name}}\t{{.MountPoint}}' \
# -f 'label=io.podman.compose.project=HERE'
try:
_ = (await compose.podman.output([], "volume", ["inspect", vol_name])).decode("utf-8")
except subprocess.CalledProcessError as e:
Expand Down Expand Up @@ -584,7 +585,10 @@ def get_secret_args(compose, cnt, secret):
# having a custom name for the external secret
# has the same problem as well
ext_name = declared_secret.get("name", None)
err_str = 'ERROR: Custom name/target reference "{}" for mounted external secret "{}" is not supported'
err_str = (
'ERROR: Custom name/target reference "{}" '
'for mounted external secret "{}" is not supported'
)
if ext_name and ext_name != secret_name:
raise ValueError(err_str.format(secret_name, ext_name))
if target and target != secret_name:
Expand Down Expand Up @@ -1103,7 +1107,7 @@ def flat_deps(services, with_extends=False):
for c in links_ls:
if ":" in c:
dep_name, dep_alias = c.split(":")
if not "_aliases" in services[dep_name]:
if "_aliases" not in services[dep_name]:
services[dep_name]["_aliases"] = set()
services[dep_name]["_aliases"].add(dep_alias)
for name, srv in services.items():
Expand Down Expand Up @@ -1178,9 +1182,9 @@ async def run(

async def format_out(stdout):
while True:
l = await stdout.readline()
if l:
print(log_formatter, l.decode('utf-8'), end='')
line = await stdout.readline()
if line:
print(log_formatter, line.decode('utf-8'), end='')
if stdout.at_eof():
break

Expand All @@ -1203,14 +1207,14 @@ async def format_out(stdout):

try:
exit_code = await p.wait()
except asyncio.CancelledError as e:
log(f"Sending termination signal")
except asyncio.CancelledError:
log("Sending termination signal")
p.terminate()
try:
async with asyncio.timeout(10):
exit_code = await p.wait()
except TimeoutError:
log(f"container did not shut down after 10 seconds, killing")
log("container did not shut down after 10 seconds, killing")
p.kill()
exit_code = await p.wait()

Expand Down Expand Up @@ -1530,7 +1534,8 @@ def _parse_compose_file(self):
files = args.file
if not files:
log(
"no compose.yaml, docker-compose.yml or container-compose.yml file found, pass files with -f"
"no compose.yaml, docker-compose.yml or container-compose.yml file found, "
"pass files with -f"
)
sys.exit(-1)
ex = map(os.path.exists, files)
Expand Down Expand Up @@ -1620,7 +1625,8 @@ def _parse_compose_file(self):
if not project_name:
project_name = compose.get("name", None)
if project_name is None:
# More strict then actually needed for simplicity: podman requires [a-zA-Z0-9][a-zA-Z0-9_.-]*
# More strict then actually needed for simplicity:
# podman requires [a-zA-Z0-9][a-zA-Z0-9_.-]*
project_name = (
self.environ.get("COMPOSE_PROJECT_NAME", None) or dir_basename.lower()
)
Expand Down Expand Up @@ -1743,11 +1749,11 @@ def _parse_compose_file(self):

def _resolve_profiles(self, defined_services, requested_profiles=None):
"""
Returns a service dictionary (key = service name, value = service config) compatible with the requested_profiles
list.
Returns a service dictionary (key = service name, value = service config) compatible with
the requested_profiles list.
The returned service dictionary contains all services which do not include/reference a profile in addition to
services that match the requested_profiles.
The returned service dictionary contains all services which do not include/reference a
profile in addition to services that match the requested_profiles.
:param defined_services: The service dictionary
:param requested_profiles: The profiles requested using the --profile arg.
Expand Down Expand Up @@ -2258,8 +2264,9 @@ async def compose_up(compose: PodmanCompose, args):
done, tasks = await asyncio.wait(tasks, return_when=asyncio.FIRST_COMPLETED)
if args.abort_on_container_exit:
if not exiting:
# If 2 containers exit at the exact same time, the cancellation of the other ones cause the status
# to overwrite. Sleeping for 1 seems to fix this and make it match docker-compose
# If 2 containers exit at the exact same time, the cancellation of the other ones
# cause the status to overwrite. Sleeping for 1 seems to fix this and make it match
# docker-compose
await asyncio.sleep(1)
[_.cancel() for _ in tasks if not _.cancelling() and not _.cancelled()]
t: Task
Expand Down Expand Up @@ -2729,7 +2736,8 @@ def compose_up_parse(parser):
parser.add_argument(
"--no-recreate",
action="store_true",
help="If containers already exist, don't recreate them. Incompatible with --force-recreate and -V.",
help="If containers already exist, don't recreate them. Incompatible with --force-recreate "
"and -V.",
)
parser.add_argument(
"--no-build",
Expand All @@ -2754,8 +2762,8 @@ def compose_up_parse(parser):
"--timeout",
type=int,
default=None,
help="Use this timeout in seconds for container shutdown when attached or when containers are already running. \
(default: 10)",
help="Use this timeout in seconds for container shutdown when attached or when containers "
"are already running. (default: 10)",
)
parser.add_argument(
"-V",
Expand All @@ -2772,14 +2780,16 @@ def compose_up_parse(parser):
"--scale",
metavar="SERVICE=NUM",
action="append",
help="Scale SERVICE to NUM instances. Overrides the `scale` setting in the Compose file if present.",
help="Scale SERVICE to NUM instances. Overrides the `scale` setting in the Compose file if "
"present.",
)
parser.add_argument(
"--exit-code-from",
metavar="SERVICE",
type=str,
default=None,
help="Return the exit code of the selected service container. Implies --abort-on-container-exit.",
help="Return the exit code of the selected service container. "
"Implies --abort-on-container-exit.",
)


Expand Down Expand Up @@ -3021,7 +3031,8 @@ def compose_build_up_parse(parser):
)
parser.add_argument(
"--pull-always",
help="attempt to pull a newer version of the image, Raise an error even if the image is present locally.",
help="attempt to pull a newer version of the image, Raise an error even if the image is "
"present locally.",
action="store_true",
)
parser.add_argument(
Expand Down
10 changes: 6 additions & 4 deletions pytests/test_can_merge_build.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
# SPDX-License-Identifier: GPL-2.0

import copy
import os
import argparse
import yaml
import os
import unittest

import yaml
from parameterized import parameterized
from podman_compose import normalize_service, PodmanCompose

from podman_compose import PodmanCompose
from podman_compose import normalize_service


class TestMergeBuild(unittest.TestCase):
Expand Down
9 changes: 6 additions & 3 deletions pytests/test_can_merge_cmd_ent.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
# SPDX-License-Identifier: GPL-2.0

import argparse
import copy
import os
import argparse
import yaml
import unittest

import yaml
from parameterized import parameterized
from podman_compose import normalize_service, PodmanCompose

from podman_compose import PodmanCompose
from podman_compose import normalize_service

test_keys = ["command", "entrypoint"]

Expand Down
13 changes: 6 additions & 7 deletions pytests/test_normalize_final_build.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,15 @@
# pylint: disable=protected-access

import argparse
import copy
import os
import yaml
import unittest

import yaml
from parameterized import parameterized
from podman_compose import (
normalize_final,
normalize_service_final,
PodmanCompose,
)

from podman_compose import PodmanCompose
from podman_compose import normalize_final
from podman_compose import normalize_service_final

cwd = os.path.abspath(".")

Expand Down
1 change: 1 addition & 0 deletions setup.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# SPDX-License-Identifier: GPL-2.0

import os

from setuptools import setup

try:
Expand Down
7 changes: 4 additions & 3 deletions tests/test_podman_compose.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
# SPDX-License-Identifier: GPL-2.0

from pathlib import Path
import os
import unittest
from pathlib import Path

from .test_utils import RunSubprocessMixin


Expand Down Expand Up @@ -77,8 +78,8 @@ def test_extends_w_file_subdir(self):
def test_extends_w_empty_service(self):
"""
Test that podman-compose can execute podman-compose -f <file> up with extended File which
includes an empty service. (e.g. if the file is used as placeholder for more complex configurations.)
:return:
includes an empty service. (e.g. if the file is used as placeholder for more complex
configurations.)
"""
main_path = Path(__file__).parent.parent

Expand Down
10 changes: 6 additions & 4 deletions tests/test_podman_compose_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,13 @@

# pylint: disable=redefined-outer-name
import os
import unittest

from parameterized import parameterized

from .test_podman_compose import podman_compose_path
from .test_podman_compose import test_path
from .test_utils import RunSubprocessMixin
import unittest
from parameterized import parameterized


def profile_compose_file():
Expand Down Expand Up @@ -61,8 +63,8 @@ def test_config_profiles(self, profiles, expected_services):
"""
Tests podman-compose
:param profiles: The enabled profiles for the parameterized test.
:param expected_services: Dictionary used to model the expected "enabled" services in the profile.
Key = service name, Value = True if the service is enabled, otherwise False.
:param expected_services: Dictionary used to model the expected "enabled" services in the
profile. Key = service name, Value = True if the service is enabled, otherwise False.
"""
config_cmd = ["coverage", "run", podman_compose_path(), "-f", profile_compose_file()]
config_cmd.extend(profiles)
Expand Down
3 changes: 1 addition & 2 deletions tests/test_podman_compose_include.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
# SPDX-License-Identifier: GPL-2.0

from pathlib import Path
import subprocess
import unittest
from pathlib import Path

from .test_utils import RunSubprocessMixin

Expand Down
5 changes: 2 additions & 3 deletions tests/test_podman_compose_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@

# pylint: disable=redefined-outer-name
import os
import time
import unittest

from .test_podman_compose import podman_compose_path
Expand Down Expand Up @@ -51,8 +50,8 @@ def test_run(self):
out, _ = self.run_subprocess_assert_returncode(run_cmd)
self.assertIn(b'127.0.0.1\tlocalhost', out)

# Run it again to make sure we can run it twice. I saw an issue where a second run, with the container left up,
# would fail
# Run it again to make sure we can run it twice. I saw an issue where a second run, with
# the container left up, would fail
run_cmd = [
"coverage",
"run",
Expand Down
9 changes: 6 additions & 3 deletions tests/test_podman_compose_up_down.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,13 @@

# pylint: disable=redefined-outer-name
import os
import unittest

from parameterized import parameterized

from .test_podman_compose import podman_compose_path
from .test_podman_compose import test_path
from .test_utils import RunSubprocessMixin
from parameterized import parameterized
import unittest


def profile_compose_file():
Expand All @@ -23,7 +25,8 @@ def profile_compose_file():
class TestUpDown(unittest.TestCase, RunSubprocessMixin):
def tearDown(self):
"""
Ensures that the services within the "profile compose file" are removed between each test case.
Ensures that the services within the "profile compose file" are removed between each test
case.
"""
# run the test case

Expand Down

0 comments on commit a8db898

Please sign in to comment.