Skip to content

Commit

Permalink
strip comments from requirements
Browse files Browse the repository at this point in the history
as explained by @aelgru requirements.txt files may contain comments so
these need to be ignored. Inline comments are not handled right now, I
don't know if these are allowed or not.
  • Loading branch information
mriehl committed Jul 31, 2014
1 parent db3910b commit 1d15e75
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 4 deletions.
16 changes: 12 additions & 4 deletions src/main/python/pybuilder/plugins/python/distutils_plugin.py
Expand Up @@ -190,12 +190,20 @@ def build_binary_distribution(project, logger):
"Error while executing setup command %s", command)


def flatten(requirements_file):
def strip_comments(requirements):
return [requirement for requirement in requirements
if not requirement.strip().startswith("#")]


def quote(requirements):
return ['"%s"' % requirement for requirement in requirements]


def flatten_and_quote(requirements_file):
with open(requirements_file.name, 'r') as requirements_file:
requirements = [d.strip("\n") for d in requirements_file.readlines()]
requirements = [d for d in requirements if d]
quoted_requirements = ['"%s"' % requirement for requirement in requirements]
return quoted_requirements
return quote(strip_comments(requirements))


def format_single_dependency(dependency):
Expand All @@ -214,7 +222,7 @@ def build_install_dependencies_string(project):
return ""

dependencies = [format_single_dependency(dependency) for dependency in dependencies]
requirements = [flatten(requirement) for requirement in requirements]
requirements = [strip_comments(flatten_and_quote(requirement)) for requirement in requirements]
flattened_requirements = [dependency for dependency_list in requirements for dependency in dependency_list]

dependencies.extend(flattened_requirements)
Expand Down
40 changes: 40 additions & 0 deletions src/unittest/python/plugins/python/distutils_plugin_tests.py
Expand Up @@ -74,6 +74,46 @@ def test_should_not_insert_default_version_operator_when_project_contains_operat
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))


class DependencyLinksTest(unittest.TestCase):

Expand Down

0 comments on commit 1d15e75

Please sign in to comment.