Exemple #1
0
class InstallRuntimeDependenciesTest(unittest.TestCase):
    def setUp(self):
        self.project = Project("unittest", ".")
        self.project.set_property("dir_install_logs", "any_directory")
        self.logger = mock(Logger)
        when(pybuilder.plugins.python.install_dependencies_plugin
             ).execute_command(any_value(), any_value(),
                               shell=True).thenReturn(0)

    def tearDown(self):
        unstub()

    def test_should_install_multiple_dependencies(self):
        self.project.depends_on("spam")
        self.project.depends_on("eggs")
        self.project.depends_on_requirements("requirements.txt")

        install_runtime_dependencies(self.logger, self.project)

        verify(pybuilder.plugins.python.install_dependencies_plugin
               ).execute_command("pip install 'spam'", any_value(), shell=True)
        verify(pybuilder.plugins.python.install_dependencies_plugin
               ).execute_command("pip install 'eggs'", any_value(), shell=True)
        verify(pybuilder.plugins.python.install_dependencies_plugin
               ).execute_command("pip install '-rrequirements.txt'",
                                 any_value(),
                                 shell=True)
class InstallDependenciesTest(unittest.TestCase):

    def setUp(self):
        self.project = Project("unittest", ".")
        self.project.set_property("dir_install_logs", "any_directory")
        self.logger = mock(Logger)
        when(
            pybuilder.plugins.python.install_dependencies_plugin).execute_command(any_value(), any_value(),
                                                                                  shell=True).thenReturn(0)

    def tearDown(self):
        unstub()

    def test_should_install_single_dependency_without_version(self):
        self.project.depends_on("spam")
        self.project.build_depends_on("eggs")

        install_dependencies(self.logger, self.project)

        verify(
            pybuilder.plugins.python.install_dependencies_plugin).execute_command("pip install 'spam'",
                                                                                  any_value(), shell=True)
        verify(
            pybuilder.plugins.python.install_dependencies_plugin).execute_command("pip install 'eggs'",
                                                                                  any_value(), shell=True)
    class InstallDependenciesTest(unittest.TestCase):
        def setUp(self):
            self.project = Project("unittest", ".")
            self.project.set_property("dir_install_logs", "any_directory")
            self.logger = mock(Logger)
            initialize_install_dependencies_plugin(self.project)
            when(pybuilder.plugins.python.install_dependencies_plugin
                 ).execute_command(any_value(),
                                   any_value(),
                                   env=any_value(),
                                   shell=False).thenReturn(0)

        def tearDown(self):
            unstub()

        def test_should_install_single_dependency_without_version(self):
            self.project.depends_on("spam")
            self.project.build_depends_on("eggs")

            install_dependencies(self.logger, self.project)

            verify(pybuilder.plugins.python.install_dependencies_plugin
                   ).execute_command([PIP_EXECUTABLE, "install", 'spam'],
                                     any_value(),
                                     shell=False)
            verify(pybuilder.plugins.python.install_dependencies_plugin
                   ).execute_command([PIP_EXECUTABLE, "install", 'eggs'],
                                     any_value(),
                                     shell=False)
def create_project():
    project = Project("/")
    project.build_depends_on("testingframework")
    project.depends_on("sometool")
    project.depends_on(
        "pyassert",
        url=
        "https://github.com/downloads/halimath/pyassert/pyassert-0.2.2.tar.gz")
    project.name = "Spam and Eggs"
    project.version = "1.2.3"
    project.summary = "This is a simple integration-test for distutils plugin."
    project.description = "As you might have guessed we have nothing to say here."
    project.authors = [
        Author("Udo Juettner", "*****@*****.**"),
        Author("Michael Gruber", "*****@*****.**")
    ]
    project.license = "WTFPL"
    project.url = "http://github.com/pybuilder/pybuilder"
    project.explicit_namespaces = ["foo.bar", "quick.brown.fox"]

    def return_dummy_list():
        return ["spam", "eggs"]

    project.list_scripts = return_dummy_list
    project.list_packages = return_dummy_list
    project.list_modules = return_dummy_list

    project.set_property(
        "distutils_classifiers",
        ["Development Status :: 5 - Beta", "Environment :: Console"])
    project.install_file("dir", "file1")
    project.install_file("dir", "file2")
    project.include_file("spam", "eggs")

    return project
def create_project():
    project = Project("/")
    project.build_depends_on("testingframework")
    project.depends_on("sometool")
    project.depends_on(
        "pyassert", url="https://github.com/downloads/halimath/pyassert/pyassert-0.2.2.tar.gz")
    project.name = "Spam and Eggs"
    project.version = "1.2.3"
    project.summary = "This is a simple integration-test for distutils plugin."
    project.description = "As you might have guessed we have nothing to say here."
    project.authors = [
        Author("Udo Juettner", "*****@*****.**"), Author("Michael Gruber", "*****@*****.**")]
    project.license = "WTFPL"
    project.url = "http://github.com/pybuilder/pybuilder"

    def return_dummy_list():
        return ["spam", "eggs"]

    project.list_scripts = return_dummy_list
    project.list_packages = return_dummy_list
    project.list_modules = return_dummy_list

    project.set_property("distutils_classifiers", [
        "Development Status :: 5 - Beta", "Environment :: Console"])
    project.install_file("dir", "file1")
    project.install_file("dir", "file2")
    project.include_file("spam", "eggs")

    return project
Exemple #6
0
def set_properties(project: Project):
    # Dependencies
    project.depends_on("gevent")

    project.build_depends_on("wsaccel")
    project.build_depends_on("ujson")
    project.build_depends_on("websocket-client", "~=0.0")
    project.build_depends_on("gunicorn")

    # Cram Configuration
    project.set_property("cram_fail_if_no_tests", False)

    # Disable flake8
    project.set_property("flake8_break_build", False)

    # Integration Tests Coverage is disabled since there are no integration tests
    project.set_property("unittest_coverage_threshold_warn", 0)
    project.set_property("unittest_coverage_branch_threshold_warn", 0)
    project.set_property("unittest_coverage_branch_partial_threshold_warn", 0)
    project.set_property("unittest_coverage_allow_non_imported_modules", True)
    project.set_property("integrationtest_coverage_threshold_warn", 0)
    project.set_property("integrationtest_coverage_branch_threshold_warn", 0)
    project.set_property(
        "integrationtest_coverage_branch_partial_threshold_warn", 0)
    project.set_property("integrationtest_coverage_allow_non_imported_modules",
                         True)

    project.set_property("pybuilder_header_plugin_break_build", False)

    project.set_property("copy_resources_target", "$dir_dist")
    project.get_property("copy_resources_glob").append("LICENSE")
    project.get_property("filter_resources_glob").append(
        "**/geventwebsocket/__init__.py")

    # Distutils
    project.set_property(
        "distutils_classifiers",
        project.get_property("distutils_classifiers") + [
            'Programming Language :: Python :: 3.3',
            'Programming Language :: Python :: 3.4',
            'Programming Language :: Python :: 3.5',
            'Programming Language :: Python :: 3.6',
            'Topic :: Software Development :: Libraries',
            'Topic :: Software Development :: Libraries :: Python Modules',
            'Topic :: Internet',
        ])

    project.set_property("pdoc_module_name", "geventwebsocket")
Exemple #7
0
    class InstallDependenciesTest(unittest.TestCase):
        def setUp(self):
            self.project = Project("unittest", ".")
            self.project.set_property("dir_install_logs", "any_directory")
            self.logger = Mock(Logger)
            initialize_install_dependencies_plugin(self.project)

        @patch("pybuilder.plugins.python.install_dependencies_plugin.execute_command", return_value=0)
        def test_should_install_single_dependency_without_version(self, exec_command, get_package_version):
            self.project.depends_on("spam")
            self.project.build_depends_on("eggs")

            install_dependencies(self.logger, self.project)

            exec_command(PIP_EXEC_STANZA + ["install", 'spam'], ANY, shell=False)
            exec_command(PIP_EXEC_STANZA + ["install", 'eggs'], ANY, shell=False)
Exemple #8
0
def set_properties(project: Project):
    # Dependencies
    project.depends_on("kombu", "4.0.2")

    project.build_depends_on("sqlalchemy")
    project.build_depends_on("django")
    project.build_depends_on("karellen-sqlite", "~=0.0.0")
    project.build_depends_on("unittest2")

    # Cram Configuration
    project.set_property("cram_fail_if_no_tests", False)

    # Disable flake8
    project.set_property("flake8_break_build", False)

    # Integration Tests Coverage is disabled since there are no integration tests
    project.set_property("unittest_coverage_threshold_warn", 0)
    project.set_property("unittest_coverage_branch_threshold_warn", 0)
    project.set_property("unittest_coverage_branch_partial_threshold_warn", 0)
    project.set_property("unittest_coverage_allow_non_imported_modules", True)
    project.set_property("integrationtest_coverage_threshold_warn", 0)
    project.set_property("integrationtest_coverage_branch_threshold_warn", 0)
    project.set_property(
        "integrationtest_coverage_branch_partial_threshold_warn", 0)
    project.set_property("integrationtest_coverage_allow_non_imported_modules",
                         True)

    project.set_property("pybuilder_header_plugin_break_build", False)

    project.set_property("copy_resources_target", "$dir_dist/karellen")
    project.get_property("copy_resources_glob").append("LICENSE.bsd3")
    project.get_property("copy_resources_glob").append("LICENSE.apache")
    project.include_file("karellen", "LICENSE.bsd3")
    project.include_file("karellen", "LICENSE.apache")

    # Distutils
    project.set_property(
        "distutils_classifiers",
        project.get_property("distutils_classifiers") + [
            'Programming Language :: Python :: 3.3',
            'Programming Language :: Python :: 3.4',
            'Topic :: Software Development :: Libraries',
            'Topic :: Software Development :: Libraries :: Python Modules',
            'Topic :: Internet',
        ])

    project.set_property("pdoc_module_name", "karellen.kombu")
class DependencyLinksTest(unittest.TestCase):
    def setUp(self):
        self.project = Project(".")

    def test_should_return_empty_string_when_no_link_dependency_is_given(self):
        self.assertEqual("", build_dependency_links_string(self.project))

    def test_should_return_dependency_link(self):
        self.project.depends_on("pyassert", url="https://github.com/downloads/halimath/pyassert/pyassert-0.2.2.tar.gz")
        self.assertEqual(
            'dependency_links = [ "https://github.com/downloads/halimath/pyassert/pyassert-0.2.2.tar.gz" ],',
            build_dependency_links_string(self.project),
        )

    def test_should_return_dependency_links(self):
        self.project.depends_on(
            "pyassert1", url="https://github.com/downloads/halimath/pyassert/pyassert1-0.2.2.tar.gz"
        )
        self.project.depends_on(
            "pyassert2", url="https://github.com/downloads/halimath/pyassert/pyassert2-0.2.2.tar.gz"
        )
        self.assertEqual(
            'dependency_links = [ "https://github.com/downloads/halimath/pyassert/pyassert1-0.2.2.tar.gz",'
            ' "https://github.com/downloads/halimath/pyassert/pyassert2-0.2.2.tar.gz" ],',
            build_dependency_links_string(self.project),
        )
Exemple #10
0
    class InstallRuntimeDependenciesTest(unittest.TestCase):
        def setUp(self):
            self.project = Project("unittest", ".")
            self.project.set_property("dir_install_logs", "any_directory")
            self.logger = Mock(Logger)
            initialize_install_dependencies_plugin(self.project)

        @patch("pybuilder.plugins.python.install_dependencies_plugin.execute_command", return_value=0)
        def test_should_install_multiple_dependencies(self, exec_command, get_package_version):
            self.project.depends_on("spam")
            self.project.depends_on("eggs")
            self.project.depends_on_requirements("requirements.txt")

            install_runtime_dependencies(self.logger, self.project)

            exec_command(PIP_EXEC_STANZA + ["install", 'spam'], ANY, shell=False)
            exec_command(PIP_EXEC_STANZA + ["install", 'eggs'], ANY, shell=False)
            exec_command(PIP_EXEC_STANZA + ["install", '-r', 'requirements.txt'], ANY, shell=False)

        @patch("pybuilder.plugins.python.install_dependencies_plugin.execute_command", return_value=0)
        def test_should_install_multiple_dependencies_locally(self, exec_command, get_package_version):
            self.project.depends_on("spam")
            self.project.depends_on("eggs")
            self.project.depends_on("foo")
            self.project.set_property("install_dependencies_local_mapping", {
                "spam": "any-dir",
                "eggs": "any-other-dir"
            })

            install_runtime_dependencies(self.logger, self.project)

            exec_command(PIP_EXEC_STANZA + ["install", "-t", "any-dir", 'spam'], ANY, shell=False)
            exec_command(PIP_EXEC_STANZA + ["install", "-t", "any-other-dir", 'eggs'], ANY, shell=False)
            exec_command(PIP_EXEC_STANZA + ["install", 'foo'], ANY, shell=False)
    class InstallRuntimeDependenciesTest(unittest.TestCase):
        def setUp(self):
            self.project = Project("unittest", ".")
            self.project.set_property("dir_install_logs", "any_directory")
            self.logger = mock(Logger)
            initialize_install_dependencies_plugin(self.project)
            when(pybuilder.plugins.python.install_dependencies_plugin
                 ).execute_command(any_value(), any_value(),
                                   shell=False).thenReturn(0)

        def tearDown(self):
            unstub()

        def test_should_install_multiple_dependencies(self):
            self.project.depends_on("spam")
            self.project.depends_on("eggs")
            self.project.depends_on_requirements("requirements.txt")

            install_runtime_dependencies(self.logger, self.project)

            verify(pybuilder.plugins.python.install_dependencies_plugin
                   ).execute_command([PIP_EXECUTABLE, "install", 'spam'],
                                     any_value(),
                                     shell=False)
            verify(pybuilder.plugins.python.install_dependencies_plugin
                   ).execute_command([PIP_EXECUTABLE, "install", 'eggs'],
                                     any_value(),
                                     shell=False)
            verify(pybuilder.plugins.python.install_dependencies_plugin
                   ).execute_command(
                       [PIP_EXECUTABLE, "install", '-r', 'requirements.txt'],
                       any_value(),
                       shell=False)

        def test_should_install_multiple_dependencies_locally(self):
            self.project.depends_on("spam")
            self.project.depends_on("eggs")
            self.project.depends_on("foo")
            self.project.set_property("install_dependencies_local_mapping", {
                "spam": "any-dir",
                "eggs": "any-other-dir"
            })

            install_runtime_dependencies(self.logger, self.project)

            verify(pybuilder.plugins.python.install_dependencies_plugin
                   ).execute_command(
                       [PIP_EXECUTABLE, "install", "-t", "any-dir", 'spam'],
                       any_value(),
                       shell=False)
            verify(
                pybuilder.plugins.python.install_dependencies_plugin
            ).execute_command(
                [PIP_EXECUTABLE, "install", "-t", "any-other-dir", 'eggs'],
                any_value(),
                shell=False)
            verify(pybuilder.plugins.python.install_dependencies_plugin
                   ).execute_command([PIP_EXECUTABLE, "install", 'foo'],
                                     any_value(),
                                     shell=False)
class DependencyLinksTest(unittest.TestCase):
    def setUp(self):
        self.project = Project(".")

    def test_should_return_empty_string_when_no_link_dependency_is_given(self):
        self.assertEqual("", build_dependency_links_string(self.project))

    def test_should_return_dependency_link(self):
        self.project.depends_on(
            "pyassert",
            url=
            "https://github.com/downloads/halimath/pyassert/pyassert-0.2.2.tar.gz"
        )
        self.assertEqual(
            'dependency_links = [ "https://github.com/downloads/halimath/pyassert/pyassert-0.2.2.tar.gz" ],',
            build_dependency_links_string(self.project))

    def test_should_return_dependency_links(self):
        self.project.depends_on(
            "pyassert1",
            url=
            "https://github.com/downloads/halimath/pyassert/pyassert1-0.2.2.tar.gz"
        )
        self.project.depends_on(
            "pyassert2",
            url=
            "https://github.com/downloads/halimath/pyassert/pyassert2-0.2.2.tar.gz"
        )
        self.assertEqual(
            'dependency_links = [ "https://github.com/downloads/halimath/pyassert/pyassert1-0.2.2.tar.gz",'
            ' "https://github.com/downloads/halimath/pyassert/pyassert2-0.2.2.tar.gz" ],',
            build_dependency_links_string(self.project))
Exemple #13
0
class InstallDependenciesTest(unittest.TestCase):
    def setUp(self):
        self.project = Project("unittest", ".")
        self.project.set_property("install_env", "whatever")
        self.project.set_property("dir_install_logs", "any_directory")
        self.project.set_property("dir_target", "/any_target_directory")
        self.logger = Mock(Logger)

        self.reactor = Mock()
        self.pyb_env = Mock()
        self.pyb_env.executable = ["a/b"]
        self.pyb_env.env_dir = "a"
        self.pyb_env.execute_command.return_value = 0
        self.reactor.python_env_registry = {"whatever": self.pyb_env}

        initialize_install_dependencies_plugin(self.project)

    @patch("pybuilder.install_utils.tail_log")
    @patch("pybuilder.install_utils.open")
    @patch("pybuilder.install_utils.create_constraint_file")
    @patch("pybuilder.install_utils.get_packages_info", return_value={})
    def test_should_install_single_dependency_without_version(self, *_):
        self.project.depends_on("spam")
        self.project.build_depends_on("eggs")

        install_dependencies(self.logger, self.project, self.reactor)

        exec_cmd = self.pyb_env.execute_command
        call_stanza = self.pyb_env.executable + PIP_MODULE_STANZA + [
            "install", "-c", ANY
        ]

        exec_cmd.assert_called_with(call_stanza + ["eggs", "spam"],
                                    outfile_name=ANY,
                                    error_file_name=ANY,
                                    env=ANY,
                                    cwd=None,
                                    shell=False,
                                    no_path_search=True)
Exemple #14
0
def set_properties(project: Project):
    project.depends_on("pybuilder")

    project.set_property('flake8_break_build', True)
    project.set_property('flake8_include_test_sources', True)
    project.set_property('flake8_include_scripts', True)
    project.set_property('flake8_max_line_length', 130)

    project.set_property("copy_resources_target", "$dir_dist/pybuilder-pipenv")
    project.get_property("copy_resources_glob").append("LICENSE")
    project.include_file("pybuilder-pipenv", "LICENSE")

    project.set_property("distutils_classifiers", [
        'Programming Language :: Python',
        'Programming Language :: Python :: Implementation :: CPython',
        'Programming Language :: Python :: Implementation :: PyPy',
        'Programming Language :: Python :: 3',
        'Programming Language :: Python :: 3.5',
        'Programming Language :: Python :: 3.6',
        'Programming Language :: Python :: 3.7',
        'Development Status :: 4 - Beta', 'Intended Audience :: Developers',
        'License :: OSI Approved :: GNU General Public License (GPL)',
        'Topic :: Software Development :: Build Tools'
    ])
class InstallRuntimeDependenciesTest(unittest.TestCase):
    def setUp(self):
        self.project = Project("unittest", ".")
        self.project.set_property("dir_install_logs", "any_directory")
        self.logger = mock(Logger)
        when(pybuilder.plugins.python.install_dependencies_plugin).execute_command(
            any_value(), any_value(), shell=True
        ).thenReturn(0)

    def tearDown(self):
        unstub()

    def test_should_install_multiple_dependencies(self):
        self.project.depends_on("spam")
        self.project.depends_on("eggs")
        self.project.depends_on_requirements("requirements.txt")

        install_runtime_dependencies(self.logger, self.project)

        verify(pybuilder.plugins.python.install_dependencies_plugin).execute_command(
            "pip install 'spam'", any_value(), shell=True
        )
        verify(pybuilder.plugins.python.install_dependencies_plugin).execute_command(
            "pip install 'eggs'", any_value(), shell=True
        )
        verify(pybuilder.plugins.python.install_dependencies_plugin).execute_command(
            "pip install '-rrequirements.txt'", any_value(), shell=True
        )

    def test_should_install_multiple_dependencies_locally(self):
        self.project.depends_on("spam")
        self.project.depends_on("eggs")
        self.project.depends_on("foo")
        self.project.set_property("install_dependencies_local_mapping", {"spam": "any-dir", "eggs": "any-other-dir"})

        install_runtime_dependencies(self.logger, self.project)

        verify(pybuilder.plugins.python.install_dependencies_plugin).execute_command(
            "pip install -t any-dir 'spam'", any_value(), shell=True
        )
        verify(pybuilder.plugins.python.install_dependencies_plugin).execute_command(
            "pip install -t any-other-dir 'eggs'", any_value(), shell=True
        )

        verify(pybuilder.plugins.python.install_dependencies_plugin).execute_command(
            "pip install 'foo'", any_value(), shell=True
        )
class InstallDependenciesTest(unittest.TestCase):
    def setUp(self):
        self.project = Project(".")

    def test_should_leave_user_specified_properties_when_initializing_plugin(
            self):

        expected_properties = {
            "distutils_commands": ["foo", "bar"],
            "distutils_issue8876_workaround_enabled":
            True,
            "distutils_classifiers":
            ["Development Status :: 3 - Beta", "Programming Language :: Rust"],
            "distutils_use_setuptools":
            False
        }

        for property_name, property_value in expected_properties.items():
            self.project.set_property(property_name, property_value)

            initialize_distutils_plugin(self.project)

        for property_name, property_value in expected_properties.items():
            self.assertEqual(self.project.get_property("distutils_commands"),
                             ["foo", "bar"])
            self.assertEqual(
                self.project.get_property(
                    "distutils_issue8876_workaround_enabled"), True)
            self.assertEqual(
                self.project.get_property("distutils_classifiers"), [
                    "Development Status :: 3 - Beta",
                    "Programming Language :: Rust"
                ])
            self.assertEqual(
                self.project.get_property("distutils_use_setuptools"), False)

    def test_should_return_empty_string_when_no_dependency_is_given(self):
        self.assertEqual("[]", build_install_dependencies_string(self.project))

    def test_should_return_single_dependency_string(self):
        self.project.depends_on("spam")
        self.assertEqual("['spam']",
                         build_install_dependencies_string(self.project))

    def test_should_return_single_dependency_string_with_version(self):
        self.project.depends_on("spam", "0.7")
        self.assertEqual("['spam>=0.7']",
                         build_install_dependencies_string(self.project))

    def test_should_return_multiple_dependencies_string_with_versions(self):
        self.project.depends_on("spam", "0.7")
        self.project.depends_on("eggs")
        self.assertEqual(
            "[\n            'eggs',\n            'spam>=0.7'\n        ]",
            build_install_dependencies_string(self.project))

    def test_should_not_insert_url_dependency_into_install_requires(self):
        self.project.depends_on("spam")
        self.project.depends_on(
            "pyassert",
            url=
            "https://github.com/downloads/halimath/pyassert/pyassert-0.2.2.tar.gz"
        )

        self.assertEqual("['spam']",
                         build_install_dependencies_string(self.project))

    def test_should_not_insert_default_version_operator_when_project_contains_operator_in_version(
            self):
        self.project.depends_on("spam", "==0.7")
        self.assertEqual("['spam==0.7']",
                         build_install_dependencies_string(self.project))

    @patch("pybuilder.plugins.python.distutils_plugin.open", create=True)
    def test_should_quote_requirements(self, mock_open):
        mock_open.return_value = MagicMock(spec=TYPE_FILE)
        handle = mock_open.return_value.__enter__.return_value
        handle.readlines.return_value = ["foo", "bar"]
        self.project.depends_on_requirements("requirements.txt")

        self.assertEqual("[\n            'foo',\n            'bar'\n        ]",
                         build_install_dependencies_string(self.project))

    @patch("pybuilder.plugins.python.distutils_plugin.open", create=True)
    def test_should_ignore_empty_requirement_lines(self, mock_open):
        mock_open.return_value = MagicMock(spec=TYPE_FILE)
        handle = mock_open.return_value.__enter__.return_value
        handle.readlines.return_value = ["", "foo", "bar"]
        self.project.depends_on_requirements("requirements.txt")

        self.assertEqual("[\n            'foo',\n            'bar'\n        ]",
                         build_install_dependencies_string(self.project))

    @patch("pybuilder.plugins.python.distutils_plugin.open", create=True)
    def test_should_ignore_comments_from_requirements(self, mock_open):
        mock_open.return_value = MagicMock(spec=TYPE_FILE)
        handle = mock_open.return_value.__enter__.return_value
        handle.readlines.return_value = ["#comment", "bar"]
        self.project.depends_on_requirements("requirements.txt")

        self.assertEqual("['bar']",
                         build_install_dependencies_string(self.project))

    @patch("pybuilder.plugins.python.distutils_plugin.open", create=True)
    def test_should_ignore_comments_with_leading_space_from_requirements(
            self, mock_open):
        mock_open.return_value = MagicMock(spec=TYPE_FILE)
        handle = mock_open.return_value.__enter__.return_value
        handle.readlines.return_value = [" # comment", "bar"]
        self.project.depends_on_requirements("requirements.txt")

        self.assertEqual("['bar']",
                         build_install_dependencies_string(self.project))

    @patch("pybuilder.plugins.python.distutils_plugin.open", create=True)
    def test_should_ignore_editable_urls_from_requirements(self, mock_open):
        mock_open.return_value = MagicMock(spec=TYPE_FILE)
        handle = mock_open.return_value.__enter__.return_value
        handle.readlines.return_value = [
            "foo",
            "-e git+https://github.com/someuser/someproject.git#egg=some_package"
        ]
        self.project.depends_on_requirements("requirements.txt")

        self.assertEqual("['foo']",
                         build_install_dependencies_string(self.project))

    @patch("pybuilder.plugins.python.distutils_plugin.open", create=True)
    def test_should_ignore_expanded_editable_urls_from_requirements(
            self, mock_open):
        mock_open.return_value = MagicMock(spec=TYPE_FILE)
        handle = mock_open.return_value.__enter__.return_value
        handle.readlines.return_value = [
            "foo",
            "--editable git+https://github.com/someuser/someproject.git#egg=some_package"
        ]
        self.project.depends_on_requirements("requirements.txt")

        self.assertEqual("['foo']",
                         build_install_dependencies_string(self.project))
class DependencyLinksTest(unittest.TestCase):
    def setUp(self):
        self.project = Project(".")

    def test_should_return_empty_string_when_no_link_dependency_is_given(self):
        self.assertEqual("[]", build_dependency_links_string(self.project))

    def test_should_return_dependency_link(self):
        self.project.depends_on(
            "pyassert",
            url=
            "https://github.com/downloads/halimath/pyassert/pyassert-0.2.2.tar.gz"
        )
        self.assertEqual(
            "['https://github.com/downloads/halimath/pyassert/pyassert-0.2.2.tar.gz']",
            build_dependency_links_string(self.project))

    def test_should_return_dependency_links(self):
        self.project.depends_on(
            "pyassert1",
            url=
            "https://github.com/downloads/halimath/pyassert/pyassert1-0.2.2.tar.gz"
        )
        self.project.depends_on(
            "pyassert2",
            url=
            "https://github.com/downloads/halimath/pyassert/pyassert2-0.2.2.tar.gz"
        )
        self.assertEqual(
            "[\n            'https://github.com/downloads/halimath/pyassert/pyassert1-0.2.2.tar.gz',\n"
            "            'https://github.com/downloads/halimath/pyassert/pyassert2-0.2.2.tar.gz'\n"
            "        ]", build_dependency_links_string(self.project))

    @patch("pybuilder.plugins.python.distutils_plugin.open", create=True)
    def test_should_use_editable_urls_from_requirements_as_dependency_links(
            self, mock_open):
        mock_open.return_value = MagicMock(spec=TYPE_FILE)
        handle = mock_open.return_value.__enter__.return_value
        handle.readlines.return_value = [
            "-e git+https://github.com/someuser/someproject.git#egg=some_package",
            "-e svn+https://github.com/someuser/someproject#egg=some_package"
        ]
        self.project.depends_on_requirements("requirements.txt")

        self.assertEqual(
            "[\n            'git+https://github.com/someuser/someproject.git#egg=some_package',\n"
            "            'svn+https://github.com/someuser/someproject#egg=some_package'\n"
            "        ]", build_dependency_links_string(self.project))

    @patch("pybuilder.plugins.python.distutils_plugin.open", create=True)
    def test_should_use_expanded_editable_urls_from_requirements_as_dependency_links(
            self, mock_open):
        mock_open.return_value = MagicMock(spec=TYPE_FILE)
        handle = mock_open.return_value.__enter__.return_value
        handle.readlines.return_value = [
            "--editable git+https://github.com/someuser/someproject.git#egg=some_package",
            "--editable svn+https://github.com/someuser/someproject#egg=some_package"
        ]
        self.project.depends_on_requirements("requirements.txt")

        self.assertEqual(
            "[\n            'git+https://github.com/someuser/someproject.git#egg=some_package',\n"
            "            'svn+https://github.com/someuser/someproject#egg=some_package'\n"
            "        ]", build_dependency_links_string(self.project))

    @patch("pybuilder.plugins.python.distutils_plugin.open", create=True)
    def test_should_use_editable_urls_from_requirements_combined_with_url_dependencies(
            self, mock_open):
        mock_open.return_value = MagicMock(spec=TYPE_FILE)
        handle = mock_open.return_value.__enter__.return_value
        handle.readlines.return_value = [
            "-e svn+https://github.com/someuser/someproject#egg=some_package"
        ]
        self.project.depends_on("jedi",
                                url="git+https://github.com/davidhalter/jedi")
        self.project.depends_on_requirements("requirements.txt")

        self.assertEqual(
            "[\n            'git+https://github.com/davidhalter/jedi',\n"
            "            'svn+https://github.com/someuser/someproject#egg=some_package'\n"
            "        ]", build_dependency_links_string(self.project))
Exemple #18
0
class InstallRuntimeDependenciesTest(unittest.TestCase):
    def setUp(self):
        self.project = Project("unittest", ".")
        self.project.set_property("install_env", "whatever")
        self.project.set_property("dir_install_logs", "any_directory")
        self.project.set_property("dir_target", "/any_target_directory")
        self.logger = Mock(Logger)

        self.reactor = Mock()
        self.pyb_env = Mock()
        self.pyb_env.executable = ["a/b"]
        self.pyb_env.env_dir = "a"
        self.pyb_env.execute_command.return_value = 0
        self.reactor.python_env_registry = {"whatever": self.pyb_env}

        initialize_install_dependencies_plugin(self.project)

    @patch("pybuilder.install_utils.tail_log")
    @patch("pybuilder.install_utils.open")
    @patch("pybuilder.install_utils.create_constraint_file")
    @patch("pybuilder.install_utils.get_packages_info", return_value={})
    def test_should_install_multiple_dependencies(self, *_):
        self.project.depends_on("spam")
        self.project.depends_on("eggs")
        self.project.depends_on_requirements("requirements.txt")

        install_runtime_dependencies(self.logger, self.project, self.reactor)

        exec_cmd = self.pyb_env.execute_command
        call_stanza = self.pyb_env.executable + PIP_MODULE_STANZA + [
            "install", "-c", ANY
        ]
        exec_cmd.assert_called_with(call_stanza +
                                    ["eggs", "spam", "-r", "requirements.txt"],
                                    outfile_name=ANY,
                                    error_file_name=ANY,
                                    env=ANY,
                                    cwd=None,
                                    shell=False,
                                    no_path_search=True)

    @patch("pybuilder.install_utils.tail_log")
    @patch("pybuilder.install_utils.open")
    @patch("pybuilder.install_utils.create_constraint_file")
    @patch("pybuilder.install_utils.get_packages_info", return_value={})
    def test_should_install_multiple_dependencies_locally(self, *_):
        self.project.depends_on("spam")
        self.project.depends_on("eggs")
        self.project.depends_on("foo")
        self.project.set_property("install_dependencies_local_mapping", {
            "spam": "any-dir",
            "eggs": "any-other-dir"
        })

        install_runtime_dependencies(self.logger, self.project, self.reactor)

        exec_cmd = self.pyb_env.execute_command
        call_stanza = self.pyb_env.executable + PIP_MODULE_STANZA + [
            "install", "-c", ANY
        ]

        exec_cmd.assert_has_calls([
            call(call_stanza + ["-t", "any-other-dir", "eggs"],
                 outfile_name=ANY,
                 error_file_name=ANY,
                 env=ANY,
                 cwd=None,
                 shell=False,
                 no_path_search=True),
            call(call_stanza + ["-t", "any-dir", "spam"],
                 outfile_name=ANY,
                 error_file_name=ANY,
                 env=ANY,
                 cwd=None,
                 shell=False,
                 no_path_search=True),
            call(call_stanza + ["foo"],
                 outfile_name=ANY,
                 error_file_name=ANY,
                 env=ANY,
                 cwd=None,
                 shell=False,
                 no_path_search=True)
        ],
                                  any_order=True)
class InstallDependenciesTest(unittest.TestCase):
    def setUp(self):
        self.project = Project(".")

    def test_should_leave_user_specified_properties_when_initializing_plugin(self):

        expected_properties = {
            "distutils_commands": ["foo", "bar"],
            "distutils_issue8876_workaround_enabled": True,
            "distutils_classifiers": [
                "Development Status :: 3 - Beta",
                "Programming Language :: Rust"
            ],
            "distutils_use_setuptools": False
        }

        for property_name, property_value in expected_properties.items():
            self.project.set_property(property_name, property_value)

            initialize_distutils_plugin(self.project)

        for property_name, property_value in expected_properties.items():
            self.assertEquals(
                self.project.get_property("distutils_commands"), ["foo", "bar"])
            self.assertEquals(
                self.project.get_property("distutils_issue8876_workaround_enabled"), True)
            self.assertEquals(
                self.project.get_property("distutils_classifiers"), ["Development Status :: 3 - Beta",
                                                                     "Programming Language :: Rust"])
            self.assertEquals(
                self.project.get_property("distutils_use_setuptools"), False)

    def test_should_return_empty_string_when_no_dependency_is_given(self):
        self.assertEqual("[]", build_install_dependencies_string(self.project))

    def test_should_return_single_dependency_string(self):
        self.project.depends_on("spam")
        self.assertEqual(
            "['spam']", build_install_dependencies_string(self.project))

    def test_should_return_single_dependency_string_with_version(self):
        self.project.depends_on("spam", "0.7")
        self.assertEqual(
            "['spam>=0.7']", build_install_dependencies_string(self.project))

    def test_should_return_multiple_dependencies_string_with_versions(self):
        self.project.depends_on("spam", "0.7")
        self.project.depends_on("eggs")
        self.assertEqual(
            "[\n            'eggs',\n            'spam>=0.7'\n        ]",
            build_install_dependencies_string(self.project))

    def test_should_not_insert_url_dependency_into_install_requires(self):
        self.project.depends_on("spam")
        self.project.depends_on(
            "pyassert", url="https://github.com/downloads/halimath/pyassert/pyassert-0.2.2.tar.gz")

        self.assertEqual(
            "['spam']", build_install_dependencies_string(self.project))

    def test_should_not_insert_default_version_operator_when_project_contains_operator_in_version(self):
        self.project.depends_on("spam", "==0.7")
        self.assertEqual(
            "['spam==0.7']", build_install_dependencies_string(self.project))

    @patch("pybuilder.plugins.python.distutils_plugin.open", create=True)
    def test_should_quote_requirements(self, mock_open):
        mock_open.return_value = MagicMock(spec=TYPE_FILE)
        handle = mock_open.return_value.__enter__.return_value
        handle.readlines.return_value = ["foo", "bar"]
        self.project.depends_on_requirements("requirements.txt")

        self.assertEqual(
            "[\n            'foo',\n            'bar'\n        ]", build_install_dependencies_string(self.project))

    @patch("pybuilder.plugins.python.distutils_plugin.open", create=True)
    def test_should_ignore_empty_requirement_lines(self, mock_open):
        mock_open.return_value = MagicMock(spec=TYPE_FILE)
        handle = mock_open.return_value.__enter__.return_value
        handle.readlines.return_value = ["", "foo", "bar"]
        self.project.depends_on_requirements("requirements.txt")

        self.assertEqual(
            "[\n            'foo',\n            'bar'\n        ]", build_install_dependencies_string(self.project))

    @patch("pybuilder.plugins.python.distutils_plugin.open", create=True)
    def test_should_ignore_comments_from_requirements(self, mock_open):
        mock_open.return_value = MagicMock(spec=TYPE_FILE)
        handle = mock_open.return_value.__enter__.return_value
        handle.readlines.return_value = ["#comment", "bar"]
        self.project.depends_on_requirements("requirements.txt")

        self.assertEqual(
            "['bar']", build_install_dependencies_string(self.project))

    @patch("pybuilder.plugins.python.distutils_plugin.open", create=True)
    def test_should_ignore_comments_with_leading_space_from_requirements(self, mock_open):
        mock_open.return_value = MagicMock(spec=TYPE_FILE)
        handle = mock_open.return_value.__enter__.return_value
        handle.readlines.return_value = [" # comment", "bar"]
        self.project.depends_on_requirements("requirements.txt")

        self.assertEqual(
            "['bar']", build_install_dependencies_string(self.project))

    @patch("pybuilder.plugins.python.distutils_plugin.open", create=True)
    def test_should_ignore_editable_urls_from_requirements(self, mock_open):
        mock_open.return_value = MagicMock(spec=TYPE_FILE)
        handle = mock_open.return_value.__enter__.return_value
        handle.readlines.return_value = [
            "foo", "-e git+https://github.com/someuser/someproject.git#egg=some_package"]
        self.project.depends_on_requirements("requirements.txt")

        self.assertEqual(
            "['foo']", build_install_dependencies_string(self.project))

    @patch("pybuilder.plugins.python.distutils_plugin.open", create=True)
    def test_should_ignore_expanded_editable_urls_from_requirements(self, mock_open):
        mock_open.return_value = MagicMock(spec=TYPE_FILE)
        handle = mock_open.return_value.__enter__.return_value
        handle.readlines.return_value = [
            "foo", "--editable git+https://github.com/someuser/someproject.git#egg=some_package"]
        self.project.depends_on_requirements("requirements.txt")

        self.assertEqual(
            "['foo']", build_install_dependencies_string(self.project))
class TestPrepareDependenciesDir(TestCase):
    """Testcases for prepare_dependencies_dir()"""

    def setUp(self):
        self.patch_popen = mock.patch("pybuilder_aws_plugin.lambda_tasks.subprocess.Popen")
        self.mock_popen = self.patch_popen.start()
        self.mock_process = mock.Mock()
        self.mock_process.returncode = 0
        self.mock_popen.return_value = self.mock_process
        self.input_project = Project(".")
        self.mock_logger = mock.Mock()

    def tearDown(self):
        self.patch_popen.stop()

    def test_prepare_dependencies_no_excludes(self):
        """Test prepare_dependencies_dir() w/o excludes."""
        for dependency in ["a", "b", "c"]:
            self.input_project.depends_on(dependency)
        prepare_dependencies_dir(self.mock_logger, self.input_project, "targetdir")
        self.assertEqual(
            list(self.mock_popen.call_args_list),
            [
                mock.call(["pip", "install", "--target", "targetdir", "a"], stdout=subprocess.PIPE),
                mock.call(["pip", "install", "--target", "targetdir", "b"], stdout=subprocess.PIPE),
                mock.call(["pip", "install", "--target", "targetdir", "c"], stdout=subprocess.PIPE),
            ],
        )
        self.assertEqual(self.mock_popen.return_value.communicate.call_count, 3)
        self.assertNotEqual(self.mock_popen.return_value.communicate.call_count, 1)

    def test_prepare_dependencies_with_excludes(self):
        """Test prepare_dependencies_dir() w/ excludes."""
        for dependency in ["a", "b", "c", "d", "e"]:
            self.input_project.depends_on(dependency)
        prepare_dependencies_dir(self.mock_logger, self.input_project, "targetdir", excludes=["b", "e", "a"])
        self.assertEqual(
            list(self.mock_popen.call_args_list),
            [
                mock.call(["pip", "install", "--target", "targetdir", "c"], stdout=subprocess.PIPE),
                mock.call(["pip", "install", "--target", "targetdir", "d"], stdout=subprocess.PIPE),
            ],
        )
        self.assertEqual(self.mock_popen.return_value.communicate.call_count, 2)
        self.assertNotEqual(self.mock_popen.return_value.communicate.call_count, 1)

    def test_prepare_dependencies_with_custom_index_url(self):
        self.input_project.depends_on("a")
        self.input_project.set_property("install_dependencies_index_url", "http://example.domain")
        prepare_dependencies_dir(self.mock_logger, self.input_project, "targetdir")
        self.assertEqual(
            list(self.mock_popen.call_args_list),
            [
                mock.call(
                    ["pip", "install", "--target", "targetdir", "--index-url", "http://example.domain", "a"],
                    stdout=subprocess.PIPE,
                )
            ],
        )

    def test_prepare_dependencies_reports_errors(self):
        self.input_project.depends_on("a")
        self.mock_process.returncode = 1
        self.assertRaises(Exception, prepare_dependencies_dir, self.mock_logger, self.input_project, "targetdir")
Exemple #21
0
class InstallDependenciesTest(unittest.TestCase):

    def setUp(self):
        self.project = Project(".")

    def test_should_return_empty_string_when_no_dependency_is_given(self):
        self.assertEqual("", build_install_dependencies_string(self.project))

    def test_should_return_single_dependency_string(self):
        self.project.depends_on("spam")
        self.assertEqual(
            'install_requires = [ "spam" ],', build_install_dependencies_string(self.project))

    def test_should_return_single_dependency_string_with_version(self):
        self.project.depends_on("spam", "0.7")
        self.assertEqual(
            'install_requires = [ "spam>=0.7" ],', build_install_dependencies_string(self.project))

    def test_should_return_multiple_dependencies_string_with_versions(self):
        self.project.depends_on("spam", "0.7")
        self.project.depends_on("eggs")
        self.assertEqual(
            'install_requires = [ "eggs", "spam>=0.7" ],', build_install_dependencies_string(self.project))

    def test_should_not_insert_url_dependency_into_install_requires(self):
        self.project.depends_on("spam")
        self.project.depends_on(
            "pyassert", url="https://github.com/downloads/halimath/pyassert/pyassert-0.2.2.tar.gz")

        self.assertEqual(
            'install_requires = [ "spam" ],', build_install_dependencies_string(self.project))

    def test_should_not_insert_default_version_operator_when_project_contains_operator_in_version(self):
        self.project.depends_on("spam", "==0.7")
        self.assertEqual(
            'install_requires = [ "spam==0.7" ],', build_install_dependencies_string(self.project))

    @patch("pybuilder.plugins.python.distutils_plugin.open", create=True)
    def test_should_quote_requirements(self, mock_open):
        mock_open.return_value = MagicMock(spec=TYPE_FILE)
        handle = mock_open.return_value.__enter__.return_value
        handle.readlines.return_value = ["foo", "bar"]
        self.project.depends_on_requirements("requirements.txt")

        self.assertEqual(
            'install_requires = [ "foo", "bar" ],', build_install_dependencies_string(self.project))

    @patch("pybuilder.plugins.python.distutils_plugin.open", create=True)
    def test_should_ignore_empty_requirement_lines(self, mock_open):
        mock_open.return_value = MagicMock(spec=TYPE_FILE)
        handle = mock_open.return_value.__enter__.return_value
        handle.readlines.return_value = ["", "foo", "bar"]
        self.project.depends_on_requirements("requirements.txt")

        self.assertEqual(
            'install_requires = [ "foo", "bar" ],', build_install_dependencies_string(self.project))

    @patch("pybuilder.plugins.python.distutils_plugin.open", create=True)
    def test_should_ignore_comments_from_requirements(self, mock_open):
        mock_open.return_value = MagicMock(spec=TYPE_FILE)
        handle = mock_open.return_value.__enter__.return_value
        handle.readlines.return_value = ["#comment", "bar"]
        self.project.depends_on_requirements("requirements.txt")

        self.assertEqual(
            'install_requires = [ "bar" ],', build_install_dependencies_string(self.project))

    @patch("pybuilder.plugins.python.distutils_plugin.open", create=True)
    def test_should_ignore_comments_with_leading_space_from_requirements(self, mock_open):
        mock_open.return_value = MagicMock(spec=TYPE_FILE)
        handle = mock_open.return_value.__enter__.return_value
        handle.readlines.return_value = [" # comment", "bar"]
        self.project.depends_on_requirements("requirements.txt")

        self.assertEqual(
            'install_requires = [ "bar" ],', build_install_dependencies_string(self.project))
Exemple #22
0
class TestPrepareDependenciesDir(TestCase):
    """Testcases for prepare_dependencies_dir()"""
    def setUp(self):
        self.patch_popen = mock.patch(
            "pybuilder_emr_plugin.emr_tasks.subprocess.Popen")
        self.mock_popen = self.patch_popen.start()
        self.mock_process = mock.Mock()
        self.mock_process.returncode = 0
        self.mock_popen.return_value = self.mock_process
        self.input_project = Project(".")
        self.mock_logger = mock.Mock()

    def tearDown(self):
        self.patch_popen.stop()

    def test_prepare_dependencies_no_excludes(self):
        """Test prepare_dependencies_dir() w/o excludes."""
        for dependency in ["a", "b", "c"]:
            self.input_project.depends_on(dependency)
        prepare_dependencies_dir(self.mock_logger, self.input_project,
                                 "targetdir")
        self.assertEqual(list(self.mock_popen.call_args_list), [
            mock.call(["pip", "install", "--target", "targetdir", "a"],
                      stdout=subprocess.PIPE),
            mock.call(["pip", "install", "--target", "targetdir", "b"],
                      stdout=subprocess.PIPE),
            mock.call(["pip", "install", "--target", "targetdir", "c"],
                      stdout=subprocess.PIPE)
        ])
        self.assertEqual(self.mock_popen.return_value.communicate.call_count,
                         3)
        self.assertNotEqual(
            self.mock_popen.return_value.communicate.call_count, 1)

    def test_prepare_dependencies_with_excludes(self):
        """Test prepare_dependencies_dir() w/ excludes."""
        for dependency in ["a", "b", "c", "d", "e"]:
            self.input_project.depends_on(dependency)
        prepare_dependencies_dir(self.mock_logger,
                                 self.input_project,
                                 "targetdir",
                                 excludes=["b", "e", "a"])
        self.assertEqual(list(self.mock_popen.call_args_list), [
            mock.call(["pip", "install", "--target", "targetdir", "c"],
                      stdout=subprocess.PIPE),
            mock.call(["pip", "install", "--target", "targetdir", "d"],
                      stdout=subprocess.PIPE)
        ])
        self.assertEqual(self.mock_popen.return_value.communicate.call_count,
                         2)
        self.assertNotEqual(
            self.mock_popen.return_value.communicate.call_count, 1)

    def test_prepare_dependencies_with_custom_index_url(self):
        self.input_project.depends_on("a")
        self.input_project.set_property("install_dependencies_index_url",
                                        "http://example.domain")
        prepare_dependencies_dir(self.mock_logger, self.input_project,
                                 "targetdir")
        self.assertEqual(list(self.mock_popen.call_args_list), [
            mock.call([
                "pip", "install", "--target", "targetdir", "--index-url",
                "http://example.domain", "a"
            ],
                      stdout=subprocess.PIPE),
        ])

    def test_prepare_dependencies_reports_errors(self):
        self.input_project.depends_on("a")
        self.mock_process.returncode = 1
        self.assertRaises(Exception, prepare_dependencies_dir,
                          self.mock_logger, self.input_project, "targetdir")
Exemple #23
0
class ProjectValidationTest(unittest.TestCase):

    def setUp(self):
        self.project = Project(basedir="/imaginary", name="Unittest")

    def test_should_validate_empty_project(self):
        validation_messages = self.project.validate()
        assert_that(validation_messages).is_empty()

    def test_should_not_validate_project_with_duplicate_dependency_but_different_versions(self):
        self.project.depends_on('spam', version='1')
        self.project.depends_on('spam', version='2')
        validation_messages = self.project.validate()
        assert_that(validation_messages).contains(
            "Runtime dependency 'spam' has been defined multiple times.")

    def test_should_not_validate_project_with_duplicate_dependency_when_version_is_given_for_one(self):
        self.project.depends_on('spam')
        self.project.depends_on('spam', version='2')
        validation_messages = self.project.validate()
        assert_that(validation_messages).contains(
            "Runtime dependency 'spam' has been defined multiple times.")

    def test_should_not_validate_project_with_duplicate_dependency_when_urls_are_different(self):
        self.project.depends_on('spam', url='y')
        self.project.depends_on('spam', url='x')
        validation_messages = self.project.validate()
        assert_that(validation_messages).contains(
            "Runtime dependency 'spam' has been defined multiple times.")

    def test_should_not_validate_project_with_duplicate_dependency_when_url_is_given_for_one(self):
        self.project.depends_on('spam')
        self.project.depends_on('spam', url='x')
        validation_messages = self.project.validate()
        assert_that(validation_messages).contains(
            "Runtime dependency 'spam' has been defined multiple times.")

    def test_should_not_validate_project_with_duplicate_dependency_for_more_than_two_times(self):
        self.project.depends_on('spam', version='1')
        self.project.depends_on('spam', version='2')
        self.project.depends_on('spam', version='3')
        validation_messages = self.project.validate()

        assert_that(validation_messages).contains(
            "Runtime dependency 'spam' has been defined multiple times.")
        assert_that(len(validation_messages)).equals(1)

    def test_should_not_validate_project_with_duplicate_build_dependency_but_different_versions(self):
        self.project.build_depends_on('spam', version='1')
        self.project.build_depends_on('spam', version='2')
        validation_messages = self.project.validate()
        assert_that(validation_messages).contains(
            "Build dependency 'spam' has been defined multiple times.")

    def test_should_not_validate_project_with_duplicate_build_dependency_when_version_is_given_for_one(self):
        self.project.build_depends_on('spam')
        self.project.build_depends_on('spam', version='2')
        validation_messages = self.project.validate()
        assert_that(validation_messages).contains(
            "Build dependency 'spam' has been defined multiple times.")

    def test_should_not_validate_project_with_duplicate_build_dependency_when_urls_are_different(self):
        self.project.build_depends_on('spam', url='y')
        self.project.build_depends_on('spam', url='x')
        validation_messages = self.project.validate()
        assert_that(validation_messages).contains(
            "Build dependency 'spam' has been defined multiple times.")

    def test_should_not_validate_project_with_duplicate_build_dependency_when_url_is_given_for_one(self):
        self.project.build_depends_on('spam')
        self.project.build_depends_on('spam', url='x')
        validation_messages = self.project.validate()
        assert_that(validation_messages).contains(
            "Build dependency 'spam' has been defined multiple times.")

    def test_should_not_validate_project_with_duplicate_build_dependency_for_more_than_two_times(self):
        self.project.build_depends_on('spam', version='1')
        self.project.build_depends_on('spam', version='2')
        self.project.build_depends_on('spam', version='3')
        validation_messages = self.project.validate()

        assert_that(validation_messages).contains(
            "Build dependency 'spam' has been defined multiple times.")
        assert_that(len(validation_messages)).equals(1)

    def test_should_not_validate_project_with_runtime_dependency_being_also_given_as_build_dependency(self):
        self.project.depends_on('spam')
        self.project.build_depends_on('spam')
        validation_messages = self.project.validate()

        assert_that(validation_messages).contains(
            "Runtime dependency 'spam' has also been given as build dependency.")
        assert_that(len(validation_messages)).equals(1)
class InstallDependenciesTest(unittest.TestCase):

    def setUp(self):
        self.project = Project(".")

    def test_should_return_empty_string_when_no_dependency_is_given(self):
        self.assertEqual("", build_install_dependencies_string(self.project))

    def test_should_return_single_dependency_string(self):
        self.project.depends_on("spam")
        self.assertEqual(
            'install_requires = [ "spam" ],', build_install_dependencies_string(self.project))

    def test_should_return_single_dependency_string_with_version(self):
        self.project.depends_on("spam", "0.7")
        self.assertEqual(
            'install_requires = [ "spam>=0.7" ],', build_install_dependencies_string(self.project))

    def test_should_return_multiple_dependencies_string_with_versions(self):
        self.project.depends_on("spam", "0.7")
        self.project.depends_on("eggs")
        self.assertEqual(
            'install_requires = [ "eggs", "spam>=0.7" ],', build_install_dependencies_string(self.project))

    def test_should_not_insert_url_dependency_into_install_requires(self):
        self.project.depends_on("spam")
        self.project.depends_on(
            "pyassert", url="https://github.com/downloads/halimath/pyassert/pyassert-0.2.2.tar.gz")

        self.assertEqual(
            'install_requires = [ "spam" ],', build_install_dependencies_string(self.project))

    def test_should_not_insert_default_version_operator_when_project_contains_operator_in_version(self):
        self.project.depends_on("spam", "==0.7")
        self.assertEqual(
            'install_requires = [ "spam==0.7" ],', build_install_dependencies_string(self.project))
Exemple #25
0
class ProjectTest(unittest.TestCase):
    def setUp(self):
        self.project = Project(basedir="/imaginary", name="Unittest")

    @patch("pybuilder.core.basename", return_value="imaginary")
    def test_should_pick_directory_name_for_project_name_when_name_is_not_given(
            self, os_path_basename):
        project = Project(basedir="/imaginary")

        self.assertEqual("imaginary", project.name)
        os_path_basename.assert_called_with("/imaginary")

    def test_get_property_should_return_default_value_when_property_is_not_set(
            self):
        self.assertEqual("spam", self.project.get_property("spam", "spam"))

    def test_get_property_should_return_property_value_when_property_is_set(
            self):
        self.project.set_property("spam", "eggs")
        self.assertEqual("eggs", self.project.get_property("spam", "spam"))

    def test_has_property_should_return_false_when_property_is_not_set(self):
        self.assertFalse(self.project.has_property("spam"))

    def test_has_property_should_return_true_when_property_is_set(self):
        self.project.set_property("spam", "eggs")
        self.assertTrue(self.project.has_property("spam"))

    def test_set_property_if_unset_should_set_property_when_property_is_not_set(
            self):
        self.project.set_property_if_unset("spam", "spam")
        self.assertEqual("spam", self.project.get_property("spam"))

    def test_set_property_if_unset_should_not_set_property_when_property_is_already_set(
            self):
        self.project.set_property("spam", "eggs")
        self.project.set_property_if_unset("spam", "spam")
        self.assertEqual("eggs", self.project.get_property("spam"))

    def test_expand_should_raise_exception_when_property_is_not_set(self):
        self.assertRaises(MissingPropertyException, self.project.expand,
                          "$spam")

    def test_expand_should_return_expanded_string_when_property_is_set(self):
        self.project.set_property("spam", "eggs")
        self.assertEqual("eggs", self.project.expand("$spam"))

    def test_expand_should_return_expanded_string_when_two_properties_are_found_and_set(
            self):
        self.project.set_property("spam", "spam")
        self.project.set_property("eggs", "eggs")
        self.assertEqual("spam and eggs",
                         self.project.expand("$spam and $eggs"))

    def test_expand_should_expand_property_with_value_being_an_property_expression(
            self):
        self.project.set_property("spam", "spam")
        self.project.set_property("eggs", "$spam")
        self.assertEqual("spam", self.project.expand("$eggs"))

    def test_expand_should_raise_exception_when_first_expansion_leads_to_property_reference_and_property_is_undefined(
            self):
        self.project.set_property("eggs", "$spam")
        self.assertRaises(MissingPropertyException, self.project.expand,
                          "$eggs")

    def test_expand_path_should_return_expanded_path(self):
        self.project.set_property("spam", "spam")
        self.project.set_property("eggs", "eggs")
        self.assertEqual(np(jp(self.project.basedir, "spam", "eggs")),
                         self.project.expand_path("$spam/$eggs"))

    def test_expand_path_should_return_expanded_path_and_additional_parts_when_additional_parts_are_given(
            self):
        self.project.set_property("spam", "spam")
        self.project.set_property("eggs", "eggs")
        self.assertEqual(
            np(jp(self.project.basedir, "spam", "eggs", "foo", "bar")),
            self.project.expand_path("$spam/$eggs", "foo", "bar"))

    def test_should_raise_exception_when_getting_mandatory_propert_and_property_is_not_found(
            self):
        self.assertRaises(MissingPropertyException,
                          self.project.get_mandatory_property, "i_dont_exist")

    def test_should_return_property_value_when_getting_mandatory_propert_and_property_exists(
            self):
        self.project.set_property("spam", "spam")
        self.assertEqual("spam", self.project.get_mandatory_property("spam"))

    def test_should_add_runtime_dependency_with_name_only(self):
        self.project.depends_on("spam")
        self.assertEqual(1, len(self.project.dependencies))
        self.assertEqual("spam", self.project.dependencies[0].name)
        self.assertEqual(None, self.project.dependencies[0].version)

    def test_should_add_dependency_with_name_and_version(self):
        self.project.depends_on("spam", "0.7")
        self.assertEqual(1, len(self.project.dependencies))
        self.assertEqual("spam", self.project.dependencies[0].name)
        self.assertEqual(">=0.7", self.project.dependencies[0].version)

    def test_should_add_dependency_with_name_and_version_only_once(self):
        self.project.depends_on("spam", "0.7")
        self.project.depends_on("spam", "0.7")
        self.assertEqual(1, len(self.project.dependencies))
        self.assertEqual("spam", self.project.dependencies[0].name)
        self.assertEqual(">=0.7", self.project.dependencies[0].version)
class DependencyLinksTest(unittest.TestCase):
    def setUp(self):
        self.project = Project(".")

    def test_should_return_empty_string_when_no_link_dependency_is_given(self):
        self.assertEqual("[]", build_dependency_links_string(self.project))

    def test_should_return_dependency_link(self):
        self.project.depends_on(
            "pyassert", url="https://github.com/downloads/halimath/pyassert/pyassert-0.2.2.tar.gz")
        self.assertEqual(
            "['https://github.com/downloads/halimath/pyassert/pyassert-0.2.2.tar.gz']",
            build_dependency_links_string(self.project))

    def test_should_return_dependency_links(self):
        self.project.depends_on("pyassert1",
                                url="https://github.com/downloads/halimath/pyassert/pyassert1-0.2.2.tar.gz")
        self.project.depends_on("pyassert2",
                                url="https://github.com/downloads/halimath/pyassert/pyassert2-0.2.2.tar.gz")
        self.assertEqual("[\n            'https://github.com/downloads/halimath/pyassert/pyassert1-0.2.2.tar.gz',\n"
                         "            'https://github.com/downloads/halimath/pyassert/pyassert2-0.2.2.tar.gz'\n"
                         "        ]",
                         build_dependency_links_string(self.project))

    @patch("pybuilder.plugins.python.distutils_plugin.open", create=True)
    def test_should_use_editable_urls_from_requirements_as_dependency_links(self, mock_open):
        mock_open.return_value = MagicMock(spec=TYPE_FILE)
        handle = mock_open.return_value.__enter__.return_value
        handle.readlines.return_value = [
            "-e git+https://github.com/someuser/someproject.git#egg=some_package",
            "-e svn+https://github.com/someuser/someproject#egg=some_package"]
        self.project.depends_on_requirements("requirements.txt")

        self.assertEqual(
            "[\n            'git+https://github.com/someuser/someproject.git#egg=some_package',\n"
            "            'svn+https://github.com/someuser/someproject#egg=some_package'\n"
            "        ]",
            build_dependency_links_string(self.project))

    @patch("pybuilder.plugins.python.distutils_plugin.open", create=True)
    def test_should_use_expanded_editable_urls_from_requirements_as_dependency_links(self, mock_open):
        mock_open.return_value = MagicMock(spec=TYPE_FILE)
        handle = mock_open.return_value.__enter__.return_value
        handle.readlines.return_value = [
            "--editable git+https://github.com/someuser/someproject.git#egg=some_package",
            "--editable svn+https://github.com/someuser/someproject#egg=some_package"]
        self.project.depends_on_requirements("requirements.txt")

        self.assertEqual(
            "[\n            'git+https://github.com/someuser/someproject.git#egg=some_package',\n"
            "            'svn+https://github.com/someuser/someproject#egg=some_package'\n"
            "        ]",
            build_dependency_links_string(self.project))

    @patch("pybuilder.plugins.python.distutils_plugin.open", create=True)
    def test_should_use_editable_urls_from_requirements_combined_with_url_dependencies(self, mock_open):
        mock_open.return_value = MagicMock(spec=TYPE_FILE)
        handle = mock_open.return_value.__enter__.return_value
        handle.readlines.return_value = [
            "-e svn+https://github.com/someuser/someproject#egg=some_package"]
        self.project.depends_on(
            "jedi", url="git+https://github.com/davidhalter/jedi")
        self.project.depends_on_requirements("requirements.txt")

        self.assertEqual(
            "[\n            'git+https://github.com/davidhalter/jedi',\n"
            "            'svn+https://github.com/someuser/someproject#egg=some_package'\n"
            "        ]",
            build_dependency_links_string(self.project))
Exemple #27
0
class ProjectValidationTest(unittest.TestCase):
    def setUp(self):
        self.project = Project(basedir="/imaginary", name="Unittest")

    def test_should_validate_empty_project(self):
        validation_messages = self.project.validate()
        self.assertFalse(validation_messages)

    def test_should_not_validate_project_with_duplicate_dependency_but_different_versions(
            self):
        self.project.depends_on('spam', version='1')
        self.project.depends_on('spam', version='2')
        validation_messages = self.project.validate()
        self.assertTrue(
            "Runtime dependency 'spam' has been defined multiple times." in
            validation_messages)

    def test_should_not_validate_project_with_duplicate_dependency_when_version_is_given_for_one(
            self):
        self.project.depends_on('spam')
        self.project.depends_on('spam', version='2')
        validation_messages = self.project.validate()
        self.assertTrue(
            "Runtime dependency 'spam' has been defined multiple times." in
            validation_messages)

    def test_should_not_validate_project_with_duplicate_dependency_when_urls_are_different(
            self):
        self.project.depends_on('spam', url='y')
        self.project.depends_on('spam', url='x')
        validation_messages = self.project.validate()
        self.assertTrue(
            "Runtime dependency 'spam' has been defined multiple times." in
            validation_messages)

    def test_should_not_validate_project_with_duplicate_dependency_when_url_is_given_for_one(
            self):
        self.project.depends_on('spam')
        self.project.depends_on('spam', url='x')
        validation_messages = self.project.validate()
        self.assertTrue(
            "Runtime dependency 'spam' has been defined multiple times." in
            validation_messages)

    def test_should_not_validate_project_with_duplicate_dependency_for_more_than_two_times(
            self):
        self.project.depends_on('spam', version='1')
        self.project.depends_on('spam', version='2')
        self.project.depends_on('spam', version='3')
        validation_messages = self.project.validate()

        self.assertTrue(
            "Runtime dependency 'spam' has been defined multiple times." in
            validation_messages)
        self.assertEquals(len(validation_messages), 1)

    def test_should_not_validate_project_with_duplicate_build_dependency_but_different_versions(
            self):
        self.project.build_depends_on('spam', version='1')
        self.project.build_depends_on('spam', version='2')
        validation_messages = self.project.validate()
        self.assertTrue(
            "Build dependency 'spam' has been defined multiple times." in
            validation_messages)

    def test_should_not_validate_project_with_duplicate_build_dependency_when_version_is_given_for_one(
            self):
        self.project.build_depends_on('spam')
        self.project.build_depends_on('spam', version='2')
        validation_messages = self.project.validate()
        self.assertTrue(
            "Build dependency 'spam' has been defined multiple times." in
            validation_messages)

    def test_should_not_validate_project_with_duplicate_build_dependency_when_urls_are_different(
            self):
        self.project.build_depends_on('spam', url='y')
        self.project.build_depends_on('spam', url='x')
        validation_messages = self.project.validate()
        self.assertTrue(
            "Build dependency 'spam' has been defined multiple times." in
            validation_messages)

    def test_should_not_validate_project_with_duplicate_build_dependency_when_url_is_given_for_one(
            self):
        self.project.build_depends_on('spam')
        self.project.build_depends_on('spam', url='x')
        validation_messages = self.project.validate()
        self.assertTrue(
            "Build dependency 'spam' has been defined multiple times." in
            validation_messages)

    def test_should_not_validate_project_with_duplicate_build_dependency_for_more_than_two_times(
            self):
        self.project.build_depends_on('spam', version='1')
        self.project.build_depends_on('spam', version='2')
        self.project.build_depends_on('spam', version='3')
        validation_messages = self.project.validate()

        self.assertTrue(
            "Build dependency 'spam' has been defined multiple times." in
            validation_messages)
        self.assertEquals(len(validation_messages), 1)

    def test_should_not_validate_project_with_runtime_dependency_being_also_given_as_build_dependency(
            self):
        self.project.depends_on('spam')
        self.project.build_depends_on('spam')
        validation_messages = self.project.validate()

        self.assertTrue(
            "Runtime dependency 'spam' has also been given as build dependency."
            in validation_messages)
        self.assertEquals(len(validation_messages), 1)
class InstallDependenciesTest(unittest.TestCase):

    def setUp(self):
        self.project = Project(".")

    def test_should_return_empty_string_when_no_dependency_is_given(self):
        self.assertEqual("", build_install_dependencies_string(self.project))

    def test_should_return_single_dependency_string(self):
        self.project.depends_on("spam")
        self.assertEqual(
            'install_requires = [ "spam" ],', build_install_dependencies_string(self.project))

    def test_should_return_single_dependency_string_with_version(self):
        self.project.depends_on("spam", "0.7")
        self.assertEqual(
            'install_requires = [ "spam>=0.7" ],', build_install_dependencies_string(self.project))

    def test_should_return_multiple_dependencies_string_with_versions(self):
        self.project.depends_on("spam", "0.7")
        self.project.depends_on("eggs")
        self.assertEqual(
            'install_requires = [ "eggs", "spam>=0.7" ],', build_install_dependencies_string(self.project))

    def test_should_not_insert_url_dependency_into_install_requires(self):
        self.project.depends_on("spam")
        self.project.depends_on(
            "pyassert", url="https://github.com/downloads/halimath/pyassert/pyassert-0.2.2.tar.gz")

        self.assertEqual(
            'install_requires = [ "spam" ],', build_install_dependencies_string(self.project))

    def test_should_not_insert_default_version_operator_when_project_contains_operator_in_version(self):
        self.project.depends_on("spam", "==0.7")
        self.assertEqual(
            'install_requires = [ "spam==0.7" ],', build_install_dependencies_string(self.project))

    @patch("pybuilder.plugins.python.distutils_plugin.open", create=True)
    def test_should_quote_requirements(self, mock_open):
        mock_open.return_value = MagicMock(spec=TYPE_FILE)
        handle = mock_open.return_value.__enter__.return_value
        handle.readlines.return_value = ["foo", "bar"]
        self.project.depends_on_requirements("requirements.txt")

        self.assertEqual(
            'install_requires = [ "foo", "bar" ],', build_install_dependencies_string(self.project))

    @patch("pybuilder.plugins.python.distutils_plugin.open", create=True)
    def test_should_ignore_empty_requirement_lines(self, mock_open):
        mock_open.return_value = MagicMock(spec=TYPE_FILE)
        handle = mock_open.return_value.__enter__.return_value
        handle.readlines.return_value = ["", "foo", "bar"]
        self.project.depends_on_requirements("requirements.txt")

        self.assertEqual(
            'install_requires = [ "foo", "bar" ],', build_install_dependencies_string(self.project))

    @patch("pybuilder.plugins.python.distutils_plugin.open", create=True)
    def test_should_ignore_comments_from_requirements(self, mock_open):
        mock_open.return_value = MagicMock(spec=TYPE_FILE)
        handle = mock_open.return_value.__enter__.return_value
        handle.readlines.return_value = ["#comment", "bar"]
        self.project.depends_on_requirements("requirements.txt")

        self.assertEqual(
            'install_requires = [ "bar" ],', build_install_dependencies_string(self.project))

    @patch("pybuilder.plugins.python.distutils_plugin.open", create=True)
    def test_should_ignore_comments_with_leading_space_from_requirements(self, mock_open):
        mock_open.return_value = MagicMock(spec=TYPE_FILE)
        handle = mock_open.return_value.__enter__.return_value
        handle.readlines.return_value = [" # comment", "bar"]
        self.project.depends_on_requirements("requirements.txt")

        self.assertEqual(
            'install_requires = [ "bar" ],', build_install_dependencies_string(self.project))

    @patch("pybuilder.plugins.python.distutils_plugin.open", create=True)
    def test_should_ignore_editable_urls_from_requirements(self, mock_open):
        mock_open.return_value = MagicMock(spec=TYPE_FILE)
        handle = mock_open.return_value.__enter__.return_value
        handle.readlines.return_value = ["foo", "-e git+https://github.com/someuser/someproject.git#egg=some_package"]
        self.project.depends_on_requirements("requirements.txt")

        self.assertEqual(
            'install_requires = [ "foo" ],', build_install_dependencies_string(self.project))

    @patch("pybuilder.plugins.python.distutils_plugin.open", create=True)
    def test_should_ignore_expanded_editable_urls_from_requirements(self, mock_open):
        mock_open.return_value = MagicMock(spec=TYPE_FILE)
        handle = mock_open.return_value.__enter__.return_value
        handle.readlines.return_value = ["foo", "--editable git+https://github.com/someuser/someproject.git#egg=some_package"]
        self.project.depends_on_requirements("requirements.txt")

        self.assertEqual(
            'install_requires = [ "foo" ],', build_install_dependencies_string(self.project))
class InstallDependenciesTest(unittest.TestCase):
    def setUp(self):
        self.project = Project(".")

    def test_should_return_empty_string_when_no_dependency_is_given(self):
        self.assertEqual("", build_install_dependencies_string(self.project))

    def test_should_return_single_dependency_string(self):
        self.project.depends_on("spam")
        self.assertEqual('install_requires = [ "spam" ],',
                         build_install_dependencies_string(self.project))

    def test_should_return_single_dependency_string_with_version(self):
        self.project.depends_on("spam", "0.7")
        self.assertEqual('install_requires = [ "spam>=0.7" ],',
                         build_install_dependencies_string(self.project))

    def test_should_return_multiple_dependencies_string_with_versions(self):
        self.project.depends_on("spam", "0.7")
        self.project.depends_on("eggs")
        self.assertEqual('install_requires = [ "eggs", "spam>=0.7" ],',
                         build_install_dependencies_string(self.project))

    def test_should_not_insert_url_dependency_into_install_requires(self):
        self.project.depends_on("spam")
        self.project.depends_on(
            "pyassert",
            url=
            "https://github.com/downloads/halimath/pyassert/pyassert-0.2.2.tar.gz"
        )

        self.assertEqual('install_requires = [ "spam" ],',
                         build_install_dependencies_string(self.project))

    def test_should_not_insert_default_version_operator_when_project_contains_operator_in_version(
            self):
        self.project.depends_on("spam", "==0.7")
        self.assertEqual('install_requires = [ "spam==0.7" ],',
                         build_install_dependencies_string(self.project))
Exemple #30
0
class ProjectTest (unittest.TestCase):

    def setUp(self):
        self.project = Project(basedir="/imaginary", name="Unittest")

    def test_should_pick_directory_name_for_project_name_when_name_is_not_given(self):
        try:
            when(os.path).basename("/imaginary").thenReturn("imaginary")

            project = Project(basedir="/imaginary")

            self.assertEquals("imaginary", project.name)
            verify(os.path).basename("/imaginary")
        finally:
            unstub()

    def test_get_property_should_return_default_value_when_property_is_not_set(self):
        self.assertEquals("spam", self.project.get_property("spam", "spam"))

    def test_get_property_should_return_property_value_when_property_is_set(self):
        self.project.set_property("spam", "eggs")
        self.assertEquals("eggs", self.project.get_property("spam", "spam"))

    def test_has_property_should_return_false_when_property_is_not_set(self):
        self.assertFalse(self.project.has_property("spam"))

    def test_has_property_should_return_true_when_property_is_set(self):
        self.project.set_property("spam", "eggs")
        self.assertTrue(self.project.has_property("spam"))

    def test_set_property_if_unset_should_set_property_when_property_is_not_set(self):
        self.project.set_property_if_unset("spam", "spam")
        self.assertEquals("spam", self.project.get_property("spam"))

    def test_set_property_if_unset_should_not_set_property_when_property_is_already_set(self):
        self.project.set_property("spam", "eggs")
        self.project.set_property_if_unset("spam", "spam")
        self.assertEquals("eggs", self.project.get_property("spam"))

    def test_expand_should_raise_exception_when_property_is_not_set(self):
        self.assertRaises(
            MissingPropertyException, self.project.expand, "$spam")

    def test_expand_should_return_expanded_string_when_property_is_set(self):
        self.project.set_property("spam", "eggs")
        self.assertEquals("eggs", self.project.expand("$spam"))

    def test_expand_should_return_expanded_string_when_two_properties_are_found_and_set(self):
        self.project.set_property("spam", "spam")
        self.project.set_property("eggs", "eggs")
        self.assertEquals(
            "spam and eggs", self.project.expand("$spam and $eggs"))

    def test_expand_should_expand_property_with_value_being_an_property_expression(self):
        self.project.set_property("spam", "spam")
        self.project.set_property("eggs", "$spam")
        self.assertEquals("spam", self.project.expand("$eggs"))

    def test_expand_should_raise_exception_when_first_expansion_leads_to_property_reference_and_property_is_undefined(self):
        self.project.set_property("eggs", "$spam")
        self.assertRaises(
            MissingPropertyException, self.project.expand, "$eggs")

    def test_expand_path_should_return_expanded_path(self):
        self.project.set_property("spam", "spam")
        self.project.set_property("eggs", "eggs")
        self.assertEquals(os.path.join("/imaginary", "spam", "eggs"),
                          self.project.expand_path("$spam/$eggs"))

    def test_expand_path_should_return_expanded_path_and_additional_parts_when_additional_parts_are_given(self):
        self.project.set_property("spam", "spam")
        self.project.set_property("eggs", "eggs")
        self.assertEquals(
            os.path.join("/imaginary", "spam", "eggs", "foo", "bar"),
            self.project.expand_path("$spam/$eggs", "foo", "bar"))

    def test_should_raise_exception_when_getting_mandatory_propert_and_property_is_not_found(self):
        self.assertRaises(MissingPropertyException,
                          self.project.get_mandatory_property, "i_dont_exist")

    def test_should_return_property_value_when_getting_mandatory_propert_and_property_exists(self):
        self.project.set_property("spam", "spam")
        self.assertEquals("spam", self.project.get_mandatory_property("spam"))

    def test_should_add_runtime_dependency_with_name_only(self):
        self.project.depends_on("spam")
        self.assertEquals(1, len(self.project.dependencies))
        self.assertEquals("spam", self.project.dependencies[0].name)
        self.assertEquals(None, self.project.dependencies[0].version)

    def test_should_add_dependency_with_name_and_version(self):
        self.project.depends_on("spam", "0.7")
        self.assertEquals(1, len(self.project.dependencies))
        self.assertEquals("spam", self.project.dependencies[0].name)
        self.assertEquals("0.7", self.project.dependencies[0].version)

    def test_should_add_dependency_with_name_and_version_only_once(self):
        self.project.depends_on("spam", "0.7")
        self.project.depends_on("spam", "0.7")
        self.assertEquals(1, len(self.project.dependencies))
        self.assertEquals("spam", self.project.dependencies[0].name)
        self.assertEquals("0.7", self.project.dependencies[0].version)
class TestPrepareDependenciesDir(TestCase):
    """Testcases for prepare_dependencies_dir()"""

    def setUp(self):
        self.patch_popen = mock.patch(
                'pybuilder_aws_plugin.lambda_tasks.subprocess.Popen')
        self.mock_popen = self.patch_popen.start()
        self.mock_process = mock.Mock()
        self.mock_process.returncode = 0
        self.mock_popen.return_value = self.mock_process
        self.patch_aspip = mock.patch(
                'pybuilder_aws_plugin.lambda_tasks.as_pip_argument')
        self.mock_aspip = self.patch_aspip.start()
        self.mock_aspip.side_effect = lambda x: x.name
        self.input_project = Project('.')
        self.mock_logger = mock.Mock()

    def tearDown(self):
        self.patch_popen.stop()
        self.patch_aspip.stop()

    def test_prepare_dependencies_no_excludes(self):
        """Test prepare_dependencies_dir() w/o excludes."""
        for dependency in ['a', 'b', 'c']:
            self.input_project.depends_on(dependency)
        prepare_dependencies_dir(
                self.mock_logger, self.input_project, 'targetdir')
        self.assertEqual(self.mock_aspip.call_count, 3)
        self.assertNotEqual(self.mock_aspip.call_count, 4)
        self.assertEqual(
                list(self.mock_popen.call_args_list), [
                    mock.call(
                            ['pip', 'install', '--target', 'targetdir', 'a'],
                            stdout=subprocess.PIPE),
                    mock.call(
                            ['pip', 'install', '--target', 'targetdir', 'b'],
                            stdout=subprocess.PIPE),
                    mock.call(
                            ['pip', 'install', '--target', 'targetdir', 'c'],
                            stdout=subprocess.PIPE)])
        self.assertEqual(
                self.mock_popen.return_value.communicate.call_count, 3)
        self.assertNotEqual(
                self.mock_popen.return_value.communicate.call_count, 1)

    def test_prepare_dependencies_with_excludes(self):
        """Test prepare_dependencies_dir() w/ excludes."""
        for dependency in ['a', 'b', 'c', 'd', 'e']:
            self.input_project.depends_on(dependency)
        prepare_dependencies_dir(
                self.mock_logger, self.input_project, 'targetdir',
                excludes=['b', 'e', 'a'])
        self.assertEqual(self.mock_aspip.call_count, 5)
        self.assertNotEqual(self.mock_aspip.call_count, 4)
        self.assertEqual(
                list(self.mock_popen.call_args_list), [
                    mock.call(
                            ['pip', 'install', '--target', 'targetdir', 'c'],
                            stdout=subprocess.PIPE),
                    mock.call(
                            ['pip', 'install', '--target', 'targetdir', 'd'],
                            stdout=subprocess.PIPE)])
        self.assertEqual(
                self.mock_popen.return_value.communicate.call_count, 2)
        self.assertNotEqual(
                self.mock_popen.return_value.communicate.call_count, 1)

    def test_prepare_dependencies_with_custom_index_url(self):
        self.input_project.depends_on('a')
        self.input_project.set_property('install_dependencies_index_url',
                                        'http://example.domain')
        prepare_dependencies_dir(
                self.mock_logger, self.input_project, 'targetdir')
        self.assertEqual(
            list(self.mock_popen.call_args_list),
            [
                mock.call(
                    ['pip', 'install', '--target', 'targetdir', '--index-url',
                        'http://example.domain', 'a'],
                    stdout=subprocess.PIPE),
            ])

    def test_prepare_dependencies_reports_errors(self):
        self.input_project.depends_on('a')
        self.mock_process.returncode = 1
        self.assertRaises(Exception, prepare_dependencies_dir,
                          self.mock_logger, self.input_project, 'targetdir')