Source code for catcher.modules.compose
from os.path import isfile, join
from catcher.modules import Module
from catcher.utils.logger import info
from catcher.utils.module_utils import is_package_installed
[docs]class DockerCompose(Module):
"""
:Docker-compose module:
Will automatically run `docker-compose up -d` before your test and `down` after it if this
module was enabled and you have `docker-compose.yml` file in your directory.
:Enable this module:
- run `pip install catcher[compose]`. It will installs all requirements, if they were not installed.
"""
def __init__(self, resources_dir) -> None:
super().__init__(resources_dir)
self._cmd = None
self._options = {'--detach': True,
'SERVICE': "",
'--no-deps': False,
'--abort-on-container-exit': False,
'--no-recreate': True,
'--remove-orphans': False,
'--always-recreate-deps': False,
'--force-recreate': False,
'--build': False,
'--no-build': False,
'--no-color': False,
'--rmi': 'none',
'--volumes': "",
'--follow': False,
'--timestamps': False,
'--scale': {}
}
[docs] def before(self, *args, **kwargs):
"""
Will run `docker-compose up -d` only in case docker-compose is installed locally
and there is a docker-compose.yml file in resources directory
"""
compose = self.find_resource_file()
if compose and is_package_installed('compose'):
from compose.cli.main import TopLevelCommand, project_from_options
info('Starting docker-compose. Please wait.')
self._options['-f'] = join(self._resources, compose),
self._cmd = TopLevelCommand(project_from_options(self._resources, self._options))
self._cmd.up(self._options)
[docs] def after(self, *args, **kwargs):
if self._cmd:
self._cmd.down(self._options)
[docs] def filter_resource(self, file: str) -> bool:
# use only default docker-compose.yml for now, will change it in future if needed.
return isfile(join(self._resources, file)) and file == 'docker-compose.yml'