From 60f81f2de99c9a1602b7d565cc992fa5cc6f4fa6 Mon Sep 17 00:00:00 2001 From: Mitch Garnaat Date: Thu, 15 Nov 2018 15:24:50 -0800 Subject: [PATCH 1/5] Changed packager to use the scratch_dir passed in from builder rather than spinning up it's own temp directories. Fixes #12 --- .../workflows/python_pip/actions.py | 4 +- .../workflows/python_pip/packager.py | 23 ++-- .../workflows/python_pip/utils.py | 1 - .../workflows/python_pip/test_packager.py | 116 ++++++++++++------ .../unit/workflows/python_pip/test_actions.py | 12 +- .../workflows/python_pip/test_packager.py | 5 +- 6 files changed, 109 insertions(+), 52 deletions(-) diff --git a/aws_lambda_builders/workflows/python_pip/actions.py b/aws_lambda_builders/workflows/python_pip/actions.py index 0c903b0a0..fb270cbdf 100644 --- a/aws_lambda_builders/workflows/python_pip/actions.py +++ b/aws_lambda_builders/workflows/python_pip/actions.py @@ -11,9 +11,10 @@ class PythonPipBuildAction(BaseAction): NAME = 'PythonPipBuildAction' PURPOSE = Purpose.RESOLVE_DEPENDENCIES - def __init__(self, artifacts_dir, manifest_path, runtime): + def __init__(self, artifacts_dir, manifest_path, scratch_dir, runtime): self.artifacts_dir = artifacts_dir self.manifest_path = manifest_path + self.scratch_dir = scratch_dir self.runtime = runtime self.package_builder = PythonPipDependencyBuilder() @@ -22,6 +23,7 @@ def execute(self): self.package_builder.build_dependencies( self.artifacts_dir, self.manifest_path, + self.scratch_dir, self.runtime, ) except PackagerError as ex: diff --git a/aws_lambda_builders/workflows/python_pip/packager.py b/aws_lambda_builders/workflows/python_pip/packager.py index 37c21afa0..d9c78cd74 100644 --- a/aws_lambda_builders/workflows/python_pip/packager.py +++ b/aws_lambda_builders/workflows/python_pip/packager.py @@ -76,13 +76,16 @@ def __init__(self, osutils=None, dependency_builder=None): dependency_builder = DependencyBuilder(self.osutils) self._dependency_builder = dependency_builder - def build_dependencies(self, artifacts_dir_path, requirements_path, - runtime, ui=None, config=None): + def build_dependencies(self, artifacts_dir_path, scratch_dir_path, + requirements_path, runtime, ui=None, config=None): """Builds a python project's dependencies into an artifact directory. :type artifacts_dir_path: str :param artifacts_dir_path: Directory to write dependencies into. + :type scratch_dir_path: str + :param scratch_dir_path: Directory to write temp files into. + :type requirements_path: str :param requirements_path: Path to a requirements.txt file to inspect for a list of dependencies. @@ -114,7 +117,7 @@ def build_dependencies(self, artifacts_dir_path, requirements_path, raise RequirementsFileNotFoundError(requirements_path) self._dependency_builder.build_site_packages( - requirements_path, artifacts_dir_path) + requirements_path, artifacts_dir_path, scratch_dir_path) class DependencyBuilder(object): @@ -151,7 +154,9 @@ def __init__(self, osutils, pip_runner=None): pip_runner = PipRunner(SubprocessPip(osutils)) self._pip = pip_runner - def build_site_packages(self, requirements_filepath, target_directory): + def build_site_packages(self, requirements_filepath, + target_directory, + scratch_directory): """Build site-packages directory for a set of requiremetns. :type requirements_filepath: str @@ -165,15 +170,17 @@ def build_site_packages(self, requirements_filepath, target_directory): This directory should be on the PYTHON_PATH of whichever process wants to use thse dependencies. + :type scratch_directory: str + :param scratch_directory: The directory to write temp files into. + :raises MissingDependencyError: This exception is raised if one or more packages could not be installed. The complete list of missing packages is included in the error object's ``missing`` property. """ if self._has_at_least_one_package(requirements_filepath): - with self._osutils.tempdir() as tempdir: - wheels, packages_without_wheels = self._download_dependencies( - tempdir, requirements_filepath) - self._install_wheels(tempdir, target_directory, wheels) + wheels, packages_without_wheels = self._download_dependencies( + scratch_directory, requirements_filepath) + self._install_wheels(scratch_directory, target_directory, wheels) if packages_without_wheels: raise MissingDependencyError(packages_without_wheels) diff --git a/aws_lambda_builders/workflows/python_pip/utils.py b/aws_lambda_builders/workflows/python_pip/utils.py index 3d465e6ad..2cdd1941c 100644 --- a/aws_lambda_builders/workflows/python_pip/utils.py +++ b/aws_lambda_builders/workflows/python_pip/utils.py @@ -9,7 +9,6 @@ import tempfile import shutil import tarfile -import sys import subprocess diff --git a/tests/functional/workflows/python_pip/test_packager.py b/tests/functional/workflows/python_pip/test_packager.py index 4a45c4ea5..f51c1b4b9 100644 --- a/tests/functional/workflows/python_pip/test_packager.py +++ b/tests/functional/workflows/python_pip/test_packager.py @@ -217,7 +217,7 @@ def _make_appdir_and_dependency_builder(self, reqs, tmpdir, runner): builder = DependencyBuilder(OSUtils(), runner) return appdir, builder - def test_can_build_local_dir_as_whl(self, tmpdir, pip_runner): + def test_can_build_local_dir_as_whl(self, tmpdir, pip_runner, osutils): reqs = ['../foo'] pip, runner = pip_runner appdir, builder = self._make_appdir_and_dependency_builder( @@ -234,13 +234,15 @@ def test_can_build_local_dir_as_whl(self, tmpdir, pip_runner): ) site_packages = os.path.join(appdir, 'site-packages') - builder.build_site_packages(requirements_file, site_packages) + with osutils.tempdir() as scratch_dir: + builder.build_site_packages( + requirements_file, site_packages, scratch_dir) installed_packages = os.listdir(site_packages) pip.validate() assert ['foo'] == installed_packages - def test_can_get_whls_all_manylinux(self, tmpdir, pip_runner): + def test_can_get_whls_all_manylinux(self, tmpdir, pip_runner, osutils): reqs = ['foo', 'bar'] pip, runner = pip_runner appdir, builder = self._make_appdir_and_dependency_builder( @@ -255,14 +257,17 @@ def test_can_get_whls_all_manylinux(self, tmpdir, pip_runner): ) site_packages = os.path.join(appdir, '.chalice.', 'site-packages') - builder.build_site_packages(requirements_file, site_packages) + with osutils.tempdir() as scratch_dir: + builder.build_site_packages( + requirements_file, site_packages, scratch_dir) installed_packages = os.listdir(site_packages) pip.validate() for req in reqs: assert req in installed_packages - def test_can_use_abi3_whl_for_any_python3(self, tmpdir, pip_runner): + def test_can_use_abi3_whl_for_any_python3(self, tmpdir, + pip_runner, osutils): reqs = ['foo', 'bar', 'baz', 'qux'] pip, runner = pip_runner appdir, builder = self._make_appdir_and_dependency_builder( @@ -279,14 +284,16 @@ def test_can_use_abi3_whl_for_any_python3(self, tmpdir, pip_runner): ) site_packages = os.path.join(appdir, '.chalice.', 'site-packages') - builder.build_site_packages(requirements_file, site_packages) + with osutils.tempdir() as scratch_dir: + builder.build_site_packages( + requirements_file, site_packages, scratch_dir) installed_packages = os.listdir(site_packages) pip.validate() for req in reqs: assert req in installed_packages - def test_can_expand_purelib_whl(self, tmpdir, pip_runner): + def test_can_expand_purelib_whl(self, tmpdir, pip_runner, osutils): reqs = ['foo'] pip, runner = pip_runner appdir, builder = self._make_appdir_and_dependency_builder( @@ -301,14 +308,16 @@ def test_can_expand_purelib_whl(self, tmpdir, pip_runner): ) site_packages = os.path.join(appdir, '.chalice.', 'site-packages') - builder.build_site_packages(requirements_file, site_packages) + with osutils.tempdir() as scratch_dir: + builder.build_site_packages( + requirements_file, site_packages, scratch_dir) installed_packages = os.listdir(site_packages) pip.validate() for req in reqs: assert req in installed_packages - def test_can_expand_platlib_whl(self, tmpdir, pip_runner): + def test_can_expand_platlib_whl(self, tmpdir, pip_runner, osutils): reqs = ['foo'] pip, runner = pip_runner appdir, builder = self._make_appdir_and_dependency_builder( @@ -323,14 +332,16 @@ def test_can_expand_platlib_whl(self, tmpdir, pip_runner): ) site_packages = os.path.join(appdir, '.chalice.', 'site-packages') - builder.build_site_packages(requirements_file, site_packages) + with osutils.tempdir() as scratch_dir: + builder.build_site_packages( + requirements_file, site_packages, scratch_dir) installed_packages = os.listdir(site_packages) pip.validate() for req in reqs: assert req in installed_packages - def test_can_expand_platlib_and_purelib(self, tmpdir, pip_runner): + def test_can_expand_platlib_and_purelib(self, tmpdir, pip_runner, osutils): # This wheel installs two importable libraries foo and bar, one from # the wheels purelib and one from its platlib. reqs = ['foo', 'bar'] @@ -350,14 +361,16 @@ def test_can_expand_platlib_and_purelib(self, tmpdir, pip_runner): ) site_packages = os.path.join(appdir, '.chalice.', 'site-packages') - builder.build_site_packages(requirements_file, site_packages) + with osutils.tempdir() as scratch_dir: + builder.build_site_packages( + requirements_file, site_packages, scratch_dir) installed_packages = os.listdir(site_packages) pip.validate() for req in reqs: assert req in installed_packages - def test_does_ignore_data(self, tmpdir, pip_runner): + def test_does_ignore_data(self, tmpdir, pip_runner, osutils): # Make sure the wheel installer does not copy the data directory # up to the root. reqs = ['foo'] @@ -377,7 +390,9 @@ def test_does_ignore_data(self, tmpdir, pip_runner): ) site_packages = os.path.join(appdir, '.chalice.', 'site-packages') - builder.build_site_packages(requirements_file, site_packages) + with osutils.tempdir() as scratch_dir: + builder.build_site_packages( + requirements_file, site_packages, scratch_dir) installed_packages = os.listdir(site_packages) pip.validate() @@ -385,7 +400,7 @@ def test_does_ignore_data(self, tmpdir, pip_runner): assert req in installed_packages assert 'bar' not in installed_packages - def test_does_ignore_include(self, tmpdir, pip_runner): + def test_does_ignore_include(self, tmpdir, pip_runner, osutils): # Make sure the wheel installer does not copy the includes directory # up to the root. reqs = ['foo'] @@ -405,7 +420,9 @@ def test_does_ignore_include(self, tmpdir, pip_runner): ) site_packages = os.path.join(appdir, '.chalice.', 'site-packages') - builder.build_site_packages(requirements_file, site_packages) + with osutils.tempdir() as scratch_dir: + builder.build_site_packages( + requirements_file, site_packages, scratch_dir) installed_packages = os.listdir(site_packages) pip.validate() @@ -413,7 +430,7 @@ def test_does_ignore_include(self, tmpdir, pip_runner): assert req in installed_packages assert 'bar' not in installed_packages - def test_does_ignore_scripts(self, tmpdir, pip_runner): + def test_does_ignore_scripts(self, tmpdir, pip_runner, osutils): # Make sure the wheel isntaller does not copy the scripts directory # up to the root. reqs = ['foo'] @@ -433,7 +450,9 @@ def test_does_ignore_scripts(self, tmpdir, pip_runner): ) site_packages = os.path.join(appdir, '.chalice.', 'site-packages') - builder.build_site_packages(requirements_file, site_packages) + with osutils.tempdir() as scratch_dir: + builder.build_site_packages( + requirements_file, site_packages, scratch_dir) installed_packages = os.listdir(site_packages) pip.validate() @@ -441,7 +460,8 @@ def test_does_ignore_scripts(self, tmpdir, pip_runner): assert req in installed_packages assert 'bar' not in installed_packages - def test_can_expand_platlib_and_platlib_and_root(self, tmpdir, pip_runner): + def test_can_expand_platlib_and_platlib_and_root(self, tmpdir, + pip_runner, osutils): # This wheel installs three import names foo, bar and baz. # they are from the root install directory and the platlib and purelib # subdirectories in the platlib. @@ -463,7 +483,9 @@ def test_can_expand_platlib_and_platlib_and_root(self, tmpdir, pip_runner): ) site_packages = os.path.join(appdir, '.chalice.', 'site-packages') - builder.build_site_packages(requirements_file, site_packages) + with osutils.tempdir() as scratch_dir: + builder.build_site_packages( + requirements_file, site_packages, scratch_dir) installed_packages = os.listdir(site_packages) pip.validate() @@ -486,7 +508,9 @@ def test_can_get_whls_mixed_compat(self, tmpdir, osutils, pip_runner): ) site_packages = os.path.join(appdir, '.chalice.', 'site-packages') - builder.build_site_packages(requirements_file, site_packages) + with osutils.tempdir() as scratch_dir: + builder.build_site_packages( + requirements_file, site_packages, scratch_dir) installed_packages = os.listdir(site_packages) pip.validate() @@ -509,7 +533,9 @@ def test_can_get_py27_whls(self, tmpdir, osutils, pip_runner): ) site_packages = os.path.join(appdir, '.chalice.', 'site-packages') - builder.build_site_packages(requirements_file, site_packages) + with osutils.tempdir() as scratch_dir: + builder.build_site_packages( + requirements_file, site_packages, scratch_dir) installed_packages = os.listdir(site_packages) pip.validate() @@ -534,8 +560,10 @@ def test_does_fail_on_invalid_local_package(self, tmpdir, osutils, ) site_packages = os.path.join(appdir, '.chalice.', 'site-packages') - with pytest.raises(MissingDependencyError) as e: - builder.build_site_packages(requirements_file, site_packages) + with osutils.tempdir() as scratch_dir: + with pytest.raises(MissingDependencyError) as e: + builder.build_site_packages( + requirements_file, site_packages, scratch_dir) installed_packages = os.listdir(site_packages) missing_packages = list(e.value.missing) @@ -559,8 +587,10 @@ def test_does_fail_on_narrow_py27_unicode(self, tmpdir, osutils, ) site_packages = os.path.join(appdir, '.chalice.', 'site-packages') - with pytest.raises(MissingDependencyError) as e: - builder.build_site_packages(requirements_file, site_packages) + with osutils.tempdir() as scratch_dir: + with pytest.raises(MissingDependencyError) as e: + builder.build_site_packages( + requirements_file, site_packages, scratch_dir) installed_packages = os.listdir(site_packages) missing_packages = list(e.value.missing) @@ -583,8 +613,10 @@ def test_does_fail_on_python_1_whl(self, tmpdir, osutils, pip_runner): ) site_packages = os.path.join(appdir, '.chalice.', 'site-packages') - with pytest.raises(MissingDependencyError) as e: - builder.build_site_packages(requirements_file, site_packages) + with osutils.tempdir() as scratch_dir: + with pytest.raises(MissingDependencyError) as e: + builder.build_site_packages( + requirements_file, site_packages, scratch_dir) installed_packages = os.listdir(site_packages) missing_packages = list(e.value.missing) @@ -620,7 +652,9 @@ def test_can_replace_incompat_whl(self, tmpdir, osutils, pip_runner): ] ) site_packages = os.path.join(appdir, '.chalice.', 'site-packages') - builder.build_site_packages(requirements_file, site_packages) + with osutils.tempdir() as scratch_dir: + builder.build_site_packages( + requirements_file, site_packages, scratch_dir) installed_packages = os.listdir(site_packages) pip.validate() @@ -651,7 +685,9 @@ def test_whitelist_sqlalchemy(self, tmpdir, osutils, pip_runner): ] ) site_packages = os.path.join(appdir, '.chalice.', 'site-packages') - builder.build_site_packages(requirements_file, site_packages) + with osutils.tempdir() as scratch_dir: + builder.build_site_packages( + requirements_file, site_packages, scratch_dir) installed_packages = os.listdir(site_packages) pip.validate() @@ -680,7 +716,9 @@ def test_can_build_sdist(self, tmpdir, osutils, pip_runner): ] ) site_packages = os.path.join(appdir, '.chalice.', 'site-packages') - builder.build_site_packages(requirements_file, site_packages) + with osutils.tempdir() as scratch_dir: + builder.build_site_packages( + requirements_file, site_packages, scratch_dir) installed_packages = os.listdir(site_packages) pip.validate() @@ -714,8 +752,10 @@ def test_build_sdist_makes_incompatible_whl(self, tmpdir, osutils, ] ) site_packages = os.path.join(appdir, '.chalice.', 'site-packages') - with pytest.raises(MissingDependencyError) as e: - builder.build_site_packages(requirements_file, site_packages) + with osutils.tempdir() as scratch_dir: + with pytest.raises(MissingDependencyError) as e: + builder.build_site_packages( + requirements_file, site_packages, scratch_dir) installed_packages = os.listdir(site_packages) # bar should succeed and foo should failed. @@ -767,7 +807,9 @@ def test_can_build_package_with_optional_c_speedups_and_no_wheel( ) site_packages = os.path.join(appdir, '.chalice.', 'site-packages') - builder.build_site_packages(requirements_file, site_packages) + with osutils.tempdir() as scratch_dir: + builder.build_site_packages( + requirements_file, site_packages, scratch_dir) installed_packages = os.listdir(site_packages) # Now we should have successfully built the foo package. @@ -812,8 +854,10 @@ def test_build_into_existing_dir_with_preinstalled_packages( os.makedirs(foo) bar = os.path.join(site_packages, 'bar') os.makedirs(bar) - with pytest.raises(MissingDependencyError) as e: - builder.build_site_packages(requirements_file, site_packages) + with osutils.tempdir() as scratch_dir: + with pytest.raises(MissingDependencyError) as e: + builder.build_site_packages( + requirements_file, site_packages, scratch_dir) installed_packages = os.listdir(site_packages) # bar should succeed and foo should failed. diff --git a/tests/unit/workflows/python_pip/test_actions.py b/tests/unit/workflows/python_pip/test_actions.py index bf2d1e1f8..208681a52 100644 --- a/tests/unit/workflows/python_pip/test_actions.py +++ b/tests/unit/workflows/python_pip/test_actions.py @@ -14,18 +14,22 @@ class TestPythonPipBuildAction(TestCase): def test_action_must_call_builder(self, PythonPipDependencyBuilderMock): builder_instance = PythonPipDependencyBuilderMock.return_value - action = PythonPipBuildAction("artifacts", "manifest", "runtime") + action = PythonPipBuildAction("artifacts", "scratch_dir", + "manifest", "runtime") action.execute() - builder_instance.build_dependencies.assert_called_with("artifacts", "manifest", "runtime") + builder_instance.build_dependencies.assert_called_with("artifacts", + "scratch_dir", + "manifest", + "runtime") @patch("aws_lambda_builders.workflows.python_pip.actions.PythonPipDependencyBuilder") def test_must_raise_exception_on_failure(self, PythonPipDependencyBuilderMock): builder_instance = PythonPipDependencyBuilderMock.return_value builder_instance.build_dependencies.side_effect = PackagerError() - action = PythonPipBuildAction("artifacts", "manifest", "runtime") + action = PythonPipBuildAction("artifacts", "scratch_dir", + "manifest", "runtime") with self.assertRaises(ActionFailedError): action.execute() - diff --git a/tests/unit/workflows/python_pip/test_packager.py b/tests/unit/workflows/python_pip/test_packager.py index 0c2b7f21f..01f81a735 100644 --- a/tests/unit/workflows/python_pip/test_packager.py +++ b/tests/unit/workflows/python_pip/test_packager.py @@ -94,10 +94,11 @@ def test_can_call_dependency_builder(self, osutils): dependency_builder=mock_dep_builder, ) builder.build_dependencies( - 'artifacts/path/', 'path/to/requirements.txt', 'python3.6' + 'artifacts/path/', 'scratch_dir/path/', + 'path/to/requirements.txt', 'python3.6' ) mock_dep_builder.build_site_packages.assert_called_once_with( - 'path/to/requirements.txt', 'artifacts/path/') + 'path/to/requirements.txt', 'artifacts/path/', 'scratch_dir/path/') osutils_mock.file_exists.assert_called_once_with( 'path/to/requirements.txt') From 0f5afb428989823233c182aadce0052d998effd2 Mon Sep 17 00:00:00 2001 From: Mitch Garnaat Date: Thu, 15 Nov 2018 15:49:05 -0800 Subject: [PATCH 2/5] Fixing call to PythonPipBuildAction constructor. --- aws_lambda_builders/workflows/python_pip/workflow.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/aws_lambda_builders/workflows/python_pip/workflow.py b/aws_lambda_builders/workflows/python_pip/workflow.py index 800d1fabf..ed393e7bd 100644 --- a/aws_lambda_builders/workflows/python_pip/workflow.py +++ b/aws_lambda_builders/workflows/python_pip/workflow.py @@ -30,6 +30,7 @@ def __init__(self, **kwargs) self.actions = [ - PythonPipBuildAction(artifacts_dir, manifest_path, runtime), + PythonPipBuildAction(artifacts_dir, scratch_dir, + manifest_path, runtime), CopySourceAction(source_dir, artifacts_dir), ] From 212455e984975ce1da71742322861a019d105859 Mon Sep 17 00:00:00 2001 From: Mitch Garnaat Date: Fri, 16 Nov 2018 09:39:49 -0800 Subject: [PATCH 3/5] Update integ test to pass scratch_dir to workflow rather than None. --- tests/integration/workflows/python_pip/test_python_pip.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/integration/workflows/python_pip/test_python_pip.py b/tests/integration/workflows/python_pip/test_python_pip.py index c9807db05..1b433778f 100644 --- a/tests/integration/workflows/python_pip/test_python_pip.py +++ b/tests/integration/workflows/python_pip/test_python_pip.py @@ -34,7 +34,7 @@ def tearDown(self): shutil.rmtree(self.scratch_dir) def test_must_build_python_project(self): - self.builder.build(self.source_dir, self.artifacts_dir, None, self.manifest_path_valid, + self.builder.build(self.source_dir, self.artifacts_dir, self.scratch_dir, self.manifest_path_valid, runtime="python2.7") expected_files = self.test_data_files.union({"numpy", "numpy-1.15.4.data", "numpy-1.15.4.dist-info"}) @@ -44,7 +44,7 @@ def test_must_build_python_project(self): def test_must_fail_to_resolve_dependencies(self): with self.assertRaises(WorkflowFailedError) as ctx: - self.builder.build(self.source_dir, self.artifacts_dir, None, self.manifest_path_invalid, + self.builder.build(self.source_dir, self.artifacts_dir, self.scratch_dir, self.manifest_path_invalid, runtime="python2.7") self.assertIn("Invalid requirement: 'adfasf=1.2.3'", str(ctx.exception)) @@ -52,7 +52,7 @@ def test_must_fail_to_resolve_dependencies(self): def test_must_fail_if_requirements_not_found(self): with self.assertRaises(WorkflowFailedError) as ctx: - self.builder.build(self.source_dir, self.artifacts_dir, None, os.path.join("non", "existent", "manifest"), + self.builder.build(self.source_dir, self.artifacts_dir, self.scratch_dir, os.path.join("non", "existent", "manifest"), runtime="python2.7") self.assertIn("Requirements file not found", str(ctx.exception)) From 8b576bdde5246a34945c824f14d3476d2188da03 Mon Sep 17 00:00:00 2001 From: Mitch Garnaat Date: Fri, 16 Nov 2018 12:38:26 -0800 Subject: [PATCH 4/5] Fix long line in integration test. --- tests/integration/workflows/python_pip/test_python_pip.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/integration/workflows/python_pip/test_python_pip.py b/tests/integration/workflows/python_pip/test_python_pip.py index 1b433778f..338fb230d 100644 --- a/tests/integration/workflows/python_pip/test_python_pip.py +++ b/tests/integration/workflows/python_pip/test_python_pip.py @@ -52,7 +52,9 @@ def test_must_fail_to_resolve_dependencies(self): def test_must_fail_if_requirements_not_found(self): with self.assertRaises(WorkflowFailedError) as ctx: - self.builder.build(self.source_dir, self.artifacts_dir, self.scratch_dir, os.path.join("non", "existent", "manifest"), + self.builder.build(self.source_dir, self.artifacts_dir, + self.scratch_dir, + os.path.join("non", "existent", "manifest"), runtime="python2.7") self.assertIn("Requirements file not found", str(ctx.exception)) From 60552e373cdaf02d6ba51577e4942682197dd4b9 Mon Sep 17 00:00:00 2001 From: Sanath Kumar Ramesh Date: Sun, 18 Nov 2018 19:53:17 -0800 Subject: [PATCH 5/5] Fixing line length --- tests/integration/workflows/python_pip/test_python_pip.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/integration/workflows/python_pip/test_python_pip.py b/tests/integration/workflows/python_pip/test_python_pip.py index 1adce873d..dc432d5ec 100644 --- a/tests/integration/workflows/python_pip/test_python_pip.py +++ b/tests/integration/workflows/python_pip/test_python_pip.py @@ -64,7 +64,8 @@ def test_must_fail_to_resolve_dependencies(self): def test_must_fail_if_requirements_not_found(self): with self.assertRaises(WorkflowFailedError) as ctx: - self.builder.build(self.source_dir, self.artifacts_dir, self.scratch_dir, os.path.join("non", "existent", "manifest"), + self.builder.build(self.source_dir, self.artifacts_dir, self.scratch_dir, + os.path.join("non", "existent", "manifest"), runtime=self.runtime) self.builder.build(self.source_dir, self.artifacts_dir,