diff --git a/.cookiecutterrc b/.cookiecutterrc index 1bb95bf..769883d 100644 --- a/.cookiecutterrc +++ b/.cookiecutterrc @@ -35,4 +35,4 @@ default_context: project_slug: 'osparc-python-runner' project_type: 'computational' release_date: '2020' - version: '2.0.0' + version: '1.4.0' diff --git a/.github/workflows/github-ci.yml b/.github/workflows/github-ci.yml index 297494b..af5e077 100644 --- a/.github/workflows/github-ci.yml +++ b/.github/workflows/github-ci.yml @@ -1,27 +1,6 @@ name: build/deploy osparc-python-runner -on: - push: - branches: - - "*" - tags-ignore: - - "*" - paths-ignore: - - "*.md" - - "*.png" - - "*.svg" - - "docs/**" - - ".vscode/**" - pull_request: - branches: - - "*" - paths-ignore: - - "*.md" - - "*.png" - - "*.svg" - - "docs/**" - - ".vscode/**" - - ".vscode-template/**" +on: ["push", "pull_request"] env: # secrets can be set in settings/secrets on github @@ -36,7 +15,7 @@ jobs: strategy: matrix: python: ["3.8"] - os: [ubuntu-20.04] + os: [ubuntu-22.04] node: [10] fail-fast: false steps: @@ -85,3 +64,4 @@ jobs: run: | ./ci/helpers/dockerhub_login.bash make push-version + diff --git a/VERSION b/VERSION index 227cea2..88c5fb8 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.0.0 +1.4.0 diff --git a/VERSION_INTEGRATION b/VERSION_INTEGRATION index 9084fa2..3eefcb9 100644 --- a/VERSION_INTEGRATION +++ b/VERSION_INTEGRATION @@ -1 +1 @@ -1.1.0 +1.0.0 diff --git a/docker-compose-meta.yml b/docker-compose-meta.yml index c5c4ac8..809b686 100644 --- a/docker-compose-meta.yml +++ b/docker-compose-meta.yml @@ -17,21 +17,24 @@ services: input data file", "type": "data:*/*"}, "input_5": {"displayOrder": 5, "label": "Additional input data - optional", "description": "Any additional input data file", "type": "data:*/*"}}}' - io.simcore.integration-version: '{"integration-version": "1.1.0"}' + io.simcore.integration-version: '{"integration-version": "1.0.0"}' io.simcore.key: '{"key": "simcore/services/comp/osparc-python-runner"}' io.simcore.name: '{"name": "oSparc Python Runner"}' io.simcore.outputs: '{"outputs": {"output_1": {"displayOrder": 1, "label": "Output data", "description": "The data produced by the script and saved - under OUTPUT_FOLDER/output_1 as output_1.zip", "type": "data:*/*"}, "output_2": - {"displayOrder": 2, "label": "Output data", "description": "The data produced - by the script and saved under OUTPUT_FOLDER/output_2 as output_2.zip", "type": - "data:*/*"}, "output_3": {"displayOrder": 3, "label": "Output data", "description": - "The data produced by the script and saved under OUTPUT_FOLDER/output_3 - as output_3.zip", "type": "data:*/*"}, "output_4": {"displayOrder": 4, "label": + under OUTPUT_FOLDER/output_1 as output_1.zip", "type": "data:*/*", "fileToKeyMap": + {"output_1.zip": "output_1"}}, "output_2": {"displayOrder": 2, "label": "Output data", "description": "The data produced by the script and saved - under OUTPUT_FOLDER/output_4 as output_4.zip", "type": "data:*/*"}}}' + under OUTPUT_FOLDER/output_2 as output_2.zip", "type": "data:*/*", "fileToKeyMap": + {"output_2.zip": "output_2"}}, "output_3": {"displayOrder": 3, "label": + "Output data", "description": "The data produced by the script and saved + under OUTPUT_FOLDER/output_3 as output_3.zip", "type": "data:*/*", "fileToKeyMap": + {"output_3.zip": "output_3"}}, "output_4": {"displayOrder": 4, "label": + "Output data", "description": "The data produced by the script and saved + under OUTPUT_FOLDER/output_4 as output_4.zip", "type": "data:*/*", "fileToKeyMap": + {"output_4.zip": "output_4"}}}}' io.simcore.type: '{"type": "computational"}' - io.simcore.version: '{"version": "2.0.0"}' + io.simcore.version: '{"version": "1.4.0"}' org.label-schema.build-date: ${BUILD_DATE} org.label-schema.schema-version: '1.0' org.label-schema.vcs-ref: ${VCS_REF} diff --git a/metadata/metadata.yml b/metadata/metadata.yml index 306431c..1c83dc1 100644 --- a/metadata/metadata.yml +++ b/metadata/metadata.yml @@ -1,8 +1,8 @@ name: oSparc Python Runner key: simcore/services/comp/osparc-python-runner type: computational -integration-version: 1.1.0 -version: 2.0.0 +integration-version: 1.0.0 +version: 1.4.0 description: oSparc Python Runner contact: anderegg@itis.swiss authors: @@ -44,18 +44,26 @@ outputs: label: Output data description: The data produced by the script and saved under OUTPUT_FOLDER/output_1 as output_1.zip type: data:*/* + fileToKeyMap: + output_1.zip: output_1 output_2: displayOrder: 2 label: Output data description: The data produced by the script and saved under OUTPUT_FOLDER/output_2 as output_2.zip type: data:*/* + fileToKeyMap: + output_2.zip: output_2 output_3: displayOrder: 3 label: Output data description: The data produced by the script and saved under OUTPUT_FOLDER/output_3 as output_3.zip type: data:*/* + fileToKeyMap: + output_3.zip: output_3 output_4: displayOrder: 4 label: Output data description: The data produced by the script and saved under OUTPUT_FOLDER/output_4 as output_4.zip type: data:*/* + fileToKeyMap: + output_4.zip: output_4 diff --git a/requirements.in b/requirements.in index ade9caf..90e1c24 100644 --- a/requirements.in +++ b/requirements.in @@ -8,7 +8,6 @@ black coverage docker jsonschema -pylint pytest pytest-cookies pytest-cov diff --git a/requirements.txt b/requirements.txt index 64d7929..e62b2bb 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,11 +4,9 @@ # # pip-compile --output-file=requirements.txt # -arrow==1.2.3 +arrow==1.2.2 # via jinja2-time -astroid==2.15.4 - # via pylint -attrs==23.1.0 +attrs==21.4.0 # via # jsonschema # referencing @@ -20,33 +18,29 @@ bump2version==1.0.1 # via bumpversion bumpversion==0.6.0 # via -r requirements.in -certifi==2023.7.22 +certifi==2021.10.8 # via requests -chardet==5.0.0 +chardet==4.0.0 # via binaryornot -charset-normalizer==2.1.1 +charset-normalizer==2.0.12 # via requests -click==8.1.3 +click==8.1.0 # via # black # cookiecutter cookiecutter==2.1.1 # via pytest-cookies -coverage[toml]==6.4.4 +coverage[toml]==6.3.2 # via # -r requirements.in # pytest-cov -dill==0.3.6 - # via pylint -docker==6.1.3 +docker==6.0.0 # via -r requirements.in -idna==3.4 +idna==3.3 # via requests iniconfig==1.1.1 # via pytest -isort==5.10.1 - # via pylint -jinja2==3.1.2 +jinja2==3.1.1 # via # cookiecutter # jinja2-time @@ -54,14 +48,8 @@ jinja2-time==0.2.0 # via cookiecutter jsonschema==4.19.0 # via -r requirements.in -jsonschema-specifications==2023.6.1 - # via jsonschema -lazy-object-proxy==1.7.1 - # via astroid markupsafe==2.1.1 # via jinja2 -mccabe==0.7.0 - # via pylint mypy-extensions==0.4.3 # via black packaging==23.0 @@ -70,17 +58,19 @@ packaging==23.0 # docker # pytest # pytest-sugar -pathspec==0.10.1 +pathspec==0.9.0 + # via black +platformdirs==2.5.1 # via black -platformdirs==2.5.2 - # via - # black - # pylint pluggy==1.0.0 # via pytest -pylint==2.17.3 - # via -r requirements.in -pytest==7.4.0 +py==1.11.0 + # via pytest +pyparsing==3.0.7 + # via packaging +pyrsistent==0.18.1 + # via jsonschema +pytest==7.1.3 # via # -r requirements.in # pytest-cookies @@ -100,17 +90,13 @@ pytest-sugar==0.9.7 # via -r requirements.in python-dateutil==2.8.2 # via arrow -python-slugify==6.1.2 +python-slugify==6.1.1 # via cookiecutter pyyaml==6.0.1 # via # -r requirements.in # cookiecutter -referencing==0.29.1 - # via - # jsonschema - # jsonschema-specifications -requests==2.31.0 +requests==2.27.1 # via # cookiecutter # docker @@ -120,17 +106,18 @@ rpds-py==0.8.10 # referencing six==1.16.0 # via python-dateutil -termcolor==2.2.0 +termcolor==1.1.0 # via pytest-sugar text-unidecode==1.3 # via python-slugify -tomlkit==0.11.4 - # via pylint -urllib3==1.26.12 +tomli==2.0.1 + # via + # black + # coverage + # pytest +urllib3==1.26.9 # via # docker # requests -websocket-client==1.4.1 +websocket-client==1.3.2 # via docker -wrapt==1.14.1 - # via astroid diff --git a/service.cli/run b/service.cli/run index 9e917ee..2810032 100755 --- a/service.cli/run +++ b/service.cli/run @@ -19,14 +19,6 @@ INPUT_4=$INPUT_FOLDER/input_4 export INPUT_4 INPUT_5=$INPUT_FOLDER/input_5 export INPUT_5 -OUTPUT_1=$OUTPUT_FOLDER/output_1 -export OUTPUT_1 -OUTPUT_2=$OUTPUT_FOLDER/output_2 -export OUTPUT_2 -OUTPUT_3=$OUTPUT_FOLDER/output_3 -export OUTPUT_3 -OUTPUT_4=$OUTPUT_FOLDER/output_4 -export OUTPUT_4 exec execute.sh \ No newline at end of file diff --git a/src/osparc_python_runner/main.py b/src/osparc_python_runner/main.py index 8a20223..2dbd34a 100644 --- a/src/osparc_python_runner/main.py +++ b/src/osparc_python_runner/main.py @@ -1,15 +1,28 @@ import json import logging import os +import shutil import subprocess import sys from pathlib import Path +from typing import Dict logging.basicConfig(level=logging.INFO) logger = logging.getLogger("osparc-python-main") -INPUT_1 = Path(os.environ["INPUT_1"]) +ENVIRONS = ["INPUT_FOLDER", "OUTPUT_FOLDER"] +try: + INPUT_FOLDER, OUTPUT_FOLDER = [Path(os.environ[v]) for v in ENVIRONS] +except KeyError: + raise ValueError("Required env vars {ENVIRONS} were not set") + +# NOTE: sync with schema in metadata!! +NUM_INPUTS = 5 +NUM_OUTPUTS = 4 +OUTPUT_SUBFOLDER_ENV_TEMPLATE = "OUTPUT_{}" +OUTPUT_SUBFOLDER_TEMPLATE = "output_{}" +OUTPUT_FILE_TEMPLATE = "output_{}.zip" def _find_user_code_entrypoint(code_dir: Path) -> Path: @@ -45,44 +58,59 @@ def _ensure_pip_requirements(code_dir: Path) -> Path: f"pipreqs --savepath={requirements} --force {code_dir}".split(), shell=False, check=True, - cwd=INPUT_1, + cwd=INPUT_FOLDER, ) # TODO log subprocess.run else: requirements = requirements[0] - logger.info("Found: %s", requirements) + logger.info(f"Found: {requirements}") return requirements -def _show_io_environments() -> None: - for io_type in ["input", "output"]: - logger.info( - "%s ENVs available: %s", - io_type.capitalize(), - json.dumps( - list( - filter( - lambda x, io_type=io_type: f"{io_type.upper()}_" in x, - os.environ, - ) - ), - indent=2, - ), - ) +# TODO: Next version of integration will take care of this and maybe the ENVs as well +def _ensure_output_subfolders_exist() -> Dict[str, str]: + output_envs = {} + for n in range(1, NUM_OUTPUTS + 1): + output_sub_folder_env = f"OUTPUT_{n}" + output_sub_folder = OUTPUT_FOLDER / OUTPUT_SUBFOLDER_TEMPLATE.format(n) + # NOTE: exist_ok for forward compatibility in case they are already created + output_sub_folder.mkdir(parents=True, exist_ok=True) + output_envs[output_sub_folder_env] = f"{output_sub_folder}" + logger.info( + "Output ENVs available: %s", + json.dumps(output_envs, indent=2), + ) + return output_envs + + +def _ensure_input_environment() -> Dict[str, str]: + input_envs = { + f"INPUT_{n}": os.environ[f"INPUT_{n}"] for n in range(1, NUM_INPUTS + 1) + } + logger.info( + "Input ENVs available: %s", + json.dumps(input_envs, indent=2), + ) + return input_envs def setup(): - _show_io_environments() + input_envs = _ensure_input_environment() + output_envs = _ensure_output_subfolders_exist() logger.info("Available data:") os.system("ls -tlah") - user_code_entrypoint = _find_user_code_entrypoint(INPUT_1) - requirements_txt = _ensure_pip_requirements(INPUT_1) + user_code_entrypoint = _find_user_code_entrypoint(INPUT_FOLDER) + requirements_txt = _ensure_pip_requirements(INPUT_FOLDER) logger.info("Preparing launch script ...") venv_dir = Path.home() / ".venv" + bash_input_env_export = [f"export {env}={path}" for env, path in input_envs.items()] + bash_output_env_export = [ + f"export {env}='{path}'" for env, path in output_envs.items() + ] script = [ "#!/bin/sh", "set -o errexit", @@ -92,16 +120,30 @@ def setup(): f'python3 -m venv --system-site-packages --symlinks --upgrade "{venv_dir}"', f'"{venv_dir}/bin/pip" install -U pip wheel setuptools', f'"{venv_dir}/bin/pip" install -r "{requirements_txt}"', + "\n".join(bash_input_env_export), + "\n".join(bash_output_env_export), f'echo "Executing code {user_code_entrypoint.name}..."', f'"{venv_dir}/bin/python3" "{user_code_entrypoint}"', 'echo "DONE ..."', ] main_script_path = Path("main.sh") - main_script_path.write_text("\n".join(script), encoding="utf-8") + main_script_path.write_text("\n".join(script)) def teardown(): - logger.info("Completed") + logger.info("Zipping output...") + for n in range(1, NUM_OUTPUTS + 1): + output_path = OUTPUT_FOLDER / f"output_{n}" + archive_file_path = OUTPUT_FOLDER / OUTPUT_FILE_TEMPLATE.format(n) + logger.info("Zipping %s into %s...", output_path, archive_file_path) + shutil.make_archive( + f"{(archive_file_path.parent / archive_file_path.stem)}", + format="zip", + root_dir=output_path, + logger=logger, + ) + logger.info("Zipping %s into %s done", output_path, archive_file_path) + logger.info("Zipping done.") if __name__ == "__main__": diff --git a/tests/integration/test_docker_container.py b/tests/integration/test_docker_container.py index dec3e79..8e99f9e 100644 --- a/tests/integration/test_docker_container.py +++ b/tests/integration/test_docker_container.py @@ -8,13 +8,12 @@ import shutil from pathlib import Path from pprint import pformat -from typing import Dict, Iterator +from typing import Dict -import docker -import docker.errors -import docker.models.containers import pytest +import docker + _FOLDER_NAMES = ["input", "output"] _CONTAINER_FOLDER = Path("/home/scu/data") @@ -52,30 +51,28 @@ def validation_folders(validation_dir: Path) -> Dict[str, Path]: return {folder: (validation_dir / folder) for folder in _FOLDER_NAMES} -@pytest.fixture +@pytest.fixture(params=["1.0.0"]) def docker_container( validation_folders: Dict[str, Path], host_folders: Dict[str, Path], docker_client: docker.DockerClient, docker_image_key: str, container_variables: Dict, -) -> Iterator[docker.models.containers.Container]: + request, +) -> docker.models.containers.Container: # copy files to input folder, copytree needs to not have the input folder around. host_folders["input"].rmdir() shutil.copytree(validation_folders["input"], host_folders["input"]) assert Path(host_folders["input"]).exists() - # prepare output folders - host_folders["output"].rmdir() - for output_folder in validation_folders["output"].glob("*"): - if not output_folder.is_dir(): - continue - # create the same folder in the output - host_output_folder = host_folders["output"] / output_folder.name - host_output_folder.mkdir(parents=True) - assert host_output_folder.exists() + if request.param == "1.0.0": + # NOTE: in this version all the files are copied in a flat file system (e.g. input_1 unzipped in /inputs, same for input_2, ...) + for file_path in host_folders["input"].glob("*"): + if file_path.is_dir(): + for file_inside_folder in file_path.glob("*"): + shutil.move(f"{file_inside_folder}", host_folders["input"]) + file_path.rmdir() # run the container (this may take some time) - container = None try: volumes = { host_folders[folder]: { @@ -91,7 +88,6 @@ def docker_container( volumes=volumes, environment=container_variables, ) - assert isinstance(container, docker.models.containers.Container) response = container.wait() if response["StatusCode"] > 0: logs = container.logs(timestamps=True) @@ -109,7 +105,6 @@ def docker_container( yield container except docker.errors.ContainerError as exc: # the container did not run correctly - assert isinstance(container, docker.models.containers.Container) pytest.fail( "The container stopped with exit code {}\n\n\ncommand:\n {}, \n\n\nlog:\n{}".format( exc.exit_status, @@ -122,9 +117,7 @@ def docker_container( ) finally: # cleanup - if container: - assert isinstance(container, docker.models.containers.Container) - container.remove() + container.remove() def _convert_to_simcore_labels(image_labels: Dict) -> Dict: @@ -142,37 +135,36 @@ def _convert_to_simcore_labels(image_labels: Dict) -> Dict: def test_run_container( - validation_folders: Dict[str, Path], - host_folders: Dict[str, Path], + validation_folders: Dict, + host_folders: Dict, docker_container: docker.models.containers.Container, ): for folder in _FOLDER_NAMES: - # test if the files that should be there are actually there and correct - list_of_files = [ - x.relative_to(validation_folders[folder]) - for x in validation_folders[folder].rglob("*") - if x.is_file() and not ".gitkeep" in x.name - ] - for file_name in list_of_files: - assert Path( - host_folders[folder] / file_name - ).exists(), f"missing {file_name=} in {host_folders[folder]=}" - match, mismatch, errors = filecmp.cmpfiles( - host_folders[folder], - validation_folders[folder], - list_of_files, - shallow=False, - ) - assert match - assert not mismatch - # assert not mismatch, "wrong/incorrect files in {}".format(host_folders[folder]) - assert not errors, "missing files in {}".format(host_folders[folder]) + if folder != "input": + # test if the files that should be there are actually there and correct + list_of_files = [ + x.name + for x in validation_folders[folder].iterdir() + if not ".gitkeep" in x.name + ] + for file_name in list_of_files: + assert Path( + host_folders[folder] / file_name + ).exists(), f"missing {file_name=} in {host_folders[folder]=}" + match, mismatch, errors = filecmp.cmpfiles( + host_folders[folder], + validation_folders[folder], + list_of_files, + shallow=False, + ) + # assert not mismatch, "wrong/incorrect files in {}".format(host_folders[folder]) + assert not errors, "missing files in {}".format(host_folders[folder]) # check the output is correct based on container labels output_cfg = {} output_cfg_file = Path(host_folders["output"] / "outputs.json") if output_cfg_file.exists(): - with output_cfg_file.open(encoding="utf-8") as fp: + with output_cfg_file.open() as fp: output_cfg = json.load(fp) container_labels = docker_container.labels diff --git a/tests/integration/test_docker_image.py b/tests/integration/test_docker_image.py index ca01a0b..3ba272f 100644 --- a/tests/integration/test_docker_image.py +++ b/tests/integration/test_docker_image.py @@ -39,7 +39,7 @@ def _convert_to_simcore_labels(image_labels: Dict) -> Dict: # FIXTURES @pytest.fixture def osparc_service_labels_jsonschema(tmp_path) -> Dict: - url = "https://raw.githubusercontent.com/ITISFoundation/osparc-simcore/master/api/specs/common/schemas/node-meta-v0.0.1.json" + url = "https://raw.githubusercontent.com/ITISFoundation/osparc-simcore/master/api/specs/director/schemas/node-meta-v0.0.1.json" file_name = tmp_path / "service_label.json" _download_url(url, file_name) with file_name.open() as fp: diff --git a/tools/run_creator.py b/tools/run_creator.py index 077694c..3ab7c6c 100644 --- a/tools/run_creator.py +++ b/tools/run_creator.py @@ -36,33 +36,18 @@ def get_input_config(metadata_file: Path) -> Dict: return inputs -def get_output_config(metadata_file: Path) -> Dict: - inputs = {} - with metadata_file.open() as fp: - metadata = yaml.safe_load(fp) - if "outputs" in metadata: - inputs = metadata["outputs"] - return inputs - - def main(args=None) -> int: try: parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--metadata", help="The metadata yaml of the node", + type=Path, required=False, default="/metadata/metadata.yml") parser.add_argument( - "--metadata", - help="The metadata yaml of the node", - type=Path, - required=False, - default="/metadata/metadata.yml", - ) - parser.add_argument( - "--runscript", help="The run script", type=Path, required=True - ) + "--runscript", help="The run script", type=Path, required=True) options = parser.parse_args(args) # generate variables for input - input_script = [ - """#!/bin/sh + input_script = [""" +#!/bin/sh #--------------------------------------------------------------- # AUTO-GENERATED CODE, do not modify this will be overwritten!!! #--------------------------------------------------------------- @@ -73,32 +58,26 @@ def main(args=None) -> int: cd "$(dirname "$0")" json_input=$INPUT_FOLDER/inputs.json """ - ] + ] input_config = get_input_config(options.metadata) for input_key, input_value in input_config.items(): if "data:" in input_value["type"]: - folder_name = input_key - input_script.append(f"{input_key.upper()}=$INPUT_FOLDER/{folder_name}") - input_script.append(f"export {input_key.upper()}") - else: + filename = input_key + if "fileToKeyMap" in input_value and len(input_value["fileToKeyMap"]) > 0: + filename, _ = next( + iter(input_value["fileToKeyMap"].items())) input_script.append( - f"{input_key.upper()}=$(< \"$json_input\" jq '.{input_key}')" - ) - input_script.append(f"export {input_key.upper()}") - for output_key, output_value in get_output_config(options.metadata).items(): - if "data:" in output_value["type"]: - folder_name = output_key + f"{str(input_key).upper()}=$INPUT_FOLDER/{str(filename)}") + input_script.append(f"export {str(input_key).upper()}") + else: input_script.append( - f"{output_key.upper()}=$OUTPUT_FOLDER/{folder_name}" - ) - input_script.append(f"export {output_key.upper()}") - input_script.extend( - [ - """ + f"{str(input_key).upper()}=$(< \"$json_input\" jq '.{input_key}')") + input_script.append(f"export {str(input_key).upper()}") + + input_script.extend([""" exec execute.sh """ - ] - ) + ]) # write shell script shell_script = str("\n").join(input_script) diff --git a/validation/input/input_1/input_script_1.py b/validation/input/input_1/input_script_1.py index 8c4c970..3857597 100644 --- a/validation/input/input_1/input_script_1.py +++ b/validation/input/input_1/input_script_1.py @@ -29,20 +29,9 @@ def test_progress(): time.sleep(0.001) -def test_inputs(): - assert (Path(os.environ["INPUT_1"]) / "input_script_1.py").exists() - assert (Path(os.environ["INPUT_1"]) / "requirements.txt").exists() - - -def test_outputs(): - """write a file in each output, checks that write access is granted""" - for output_folder_env in (f"OUTPUT_{i}" for i in range(1, 5)): - folder = Path(os.environ[output_folder_env]) - assert folder.exists() - for number in range(1, 3): - file = Path(folder) / f"some_output_{number}_file" - file.write_text(f"Hello this is file {number}") - assert file.exists() +def test_cwd(): + assert (Path(os.environ["INPUT_FOLDER"]) / "input_script_1.py").exists() + assert (Path(os.environ["INPUT_FOLDER"]) / "requirements.txt").exists() if __name__ == "__main__": diff --git a/validation/input/input_2/input_2 b/validation/input/input_2 similarity index 100% rename from validation/input/input_2/input_2 rename to validation/input/input_2 diff --git a/validation/input/input_3/.gitkeep b/validation/input/input_3 similarity index 100% rename from validation/input/input_3/.gitkeep rename to validation/input/input_3 diff --git a/validation/input/input_4/.gitkeep b/validation/input/input_4 similarity index 100% rename from validation/input/input_4/.gitkeep rename to validation/input/input_4 diff --git a/validation/input/input_5/.gitkeep b/validation/input/input_5 similarity index 100% rename from validation/input/input_5/.gitkeep rename to validation/input/input_5 diff --git a/validation/output/output_1.zip b/validation/output/output_1.zip new file mode 100644 index 0000000..2a3e03d Binary files /dev/null and b/validation/output/output_1.zip differ diff --git a/validation/output/output_1/some_output_1_file b/validation/output/output_1/some_output_1_file deleted file mode 100644 index 8da588a..0000000 --- a/validation/output/output_1/some_output_1_file +++ /dev/null @@ -1 +0,0 @@ -Hello this is file 1 \ No newline at end of file diff --git a/validation/output/output_1/some_output_2_file b/validation/output/output_1/some_output_2_file deleted file mode 100644 index 417657c..0000000 --- a/validation/output/output_1/some_output_2_file +++ /dev/null @@ -1 +0,0 @@ -Hello this is file 2 \ No newline at end of file diff --git a/validation/output/output_2.zip b/validation/output/output_2.zip new file mode 100644 index 0000000..5680cf1 Binary files /dev/null and b/validation/output/output_2.zip differ diff --git a/validation/output/output_2/some_output_1_file b/validation/output/output_2/some_output_1_file deleted file mode 100644 index 8da588a..0000000 --- a/validation/output/output_2/some_output_1_file +++ /dev/null @@ -1 +0,0 @@ -Hello this is file 1 \ No newline at end of file diff --git a/validation/output/output_2/some_output_2_file b/validation/output/output_2/some_output_2_file deleted file mode 100644 index 417657c..0000000 --- a/validation/output/output_2/some_output_2_file +++ /dev/null @@ -1 +0,0 @@ -Hello this is file 2 \ No newline at end of file diff --git a/validation/output/output_3.zip b/validation/output/output_3.zip new file mode 100644 index 0000000..3172e9d Binary files /dev/null and b/validation/output/output_3.zip differ diff --git a/validation/output/output_3/some_output_1_file b/validation/output/output_3/some_output_1_file deleted file mode 100644 index 8da588a..0000000 --- a/validation/output/output_3/some_output_1_file +++ /dev/null @@ -1 +0,0 @@ -Hello this is file 1 \ No newline at end of file diff --git a/validation/output/output_3/some_output_2_file b/validation/output/output_3/some_output_2_file deleted file mode 100644 index 417657c..0000000 --- a/validation/output/output_3/some_output_2_file +++ /dev/null @@ -1 +0,0 @@ -Hello this is file 2 \ No newline at end of file diff --git a/validation/output/output_4.zip b/validation/output/output_4.zip new file mode 100644 index 0000000..2f6b2ea Binary files /dev/null and b/validation/output/output_4.zip differ diff --git a/validation/output/output_4/some_output_1_file b/validation/output/output_4/some_output_1_file deleted file mode 100644 index 8da588a..0000000 --- a/validation/output/output_4/some_output_1_file +++ /dev/null @@ -1 +0,0 @@ -Hello this is file 1 \ No newline at end of file diff --git a/validation/output/output_4/some_output_2_file b/validation/output/output_4/some_output_2_file deleted file mode 100644 index 417657c..0000000 --- a/validation/output/output_4/some_output_2_file +++ /dev/null @@ -1 +0,0 @@ -Hello this is file 2 \ No newline at end of file diff --git a/versioning/integration.cfg b/versioning/integration.cfg index 310dddc..bed2967 100644 --- a/versioning/integration.cfg +++ b/versioning/integration.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 1.1.0 +current_version = 1.0.0 commit = False message = integration version: {current_version} → {new_version} tag = False diff --git a/versioning/service.cfg b/versioning/service.cfg index cd676aa..44754b8 100644 --- a/versioning/service.cfg +++ b/versioning/service.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 2.0.0 +current_version = 1.4.0 commit = False message = service/kernel version: {current_version} → {new_version} tag = False