Skip to content

Instantly share code, notes, and snippets.

@kaeawc
Last active August 29, 2015 14:10
Show Gist options
  • Select an option

  • Save kaeawc/bccb39edcf1a92fe3c3b to your computer and use it in GitHub Desktop.

Select an option

Save kaeawc/bccb39edcf1a92fe3c3b to your computer and use it in GitHub Desktop.
Test case that compares pip freeze output to the project's requirements.txt file
import unittest
import subprocess
from StringIO import StringIO
class ProjectRequirementsSpec(unittest.TestCase):
def parse_requirement(self, requirement):
requirement = requirement.replace('\n', '')
if requirement.startswith('#') or requirement == '':
return False, False
if '==' in requirement:
parts = requirement.split('==')
if isinstance(parts, list) and len(parts) == 2:
name = parts[0]
version = parts[1]
if name in ['distribute', 'setuptools']:
return name, False
return name, version
elif requirement.startswith('git+git://'):
parts = requirement.split('/')
last = len(parts) - 1
parts = parts[last].split('.git@')
name = parts[0]
version = parts[1].replace('release-', '')
if parts[1].startswith('release-'):
return name, version
return name, False
else:
return requirement, False
return False, False
def test_pip_requirements(self):
p = subprocess.Popen(
["pip", "freeze"],
stdout=subprocess.PIPE)
out, err = p.communicate()
actual_requirements = StringIO(out)
requirement = 'requirement'
actual = {}
while requirement:
requirement = actual_requirements.readline()
name, version = self.parse_requirement(requirement.replace('\n', ''))
if name and version:
actual[name] = version
expected_requirements = open('requirements.txt')
expected_requirements = StringIO(expected_requirements.read())
requirement = 'requirement'
while requirement:
requirement = expected_requirements.readline()
name, version = self.parse_requirement(requirement.replace('\n', ''))
if not name or not isinstance(name, str) or name.startswith(u"#"):
continue
# pip freeze does not detect any of these packages
if name in [u"distribute", u"setuptools", u"pip"]:
continue
if name:
actual_version = actual.get(name)
assert actual_version is not None, u"Expected %s to be installed" % name
if version:
assert actual_version == version, u"%s %s does not match expected %s %s" % (name, version, name, actual_version)
print("found %s %s" % (name, version))
else:
print("found %s" % name)
else:
raise AssertionError(u"Failed to parse expected requirements file, is it formatted correctly?")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment