def test_parse_requirement(self, package): package.return_value = True content = """ -e common/lib/calc South==1.0.1 pycrypto>=2.6 git+https://github.com/pmitros/pyfs.git@96e1922348bfe6d99201b9512a9ed946c87b7e0b distribute>=0.6.28, <0.7 # bogus comment -e . pdfminer==20140328 -r production/requirements.txt --requirement test.txt """ r = RequirementFile("r.txt", content=content) self.assertEqual( r.other_files, [ "production/requirements.txt", "test.txt" ] ) self.assertEqual( r.requirements, [ Requirement.parse("South==1.0.1", 3), Requirement.parse("pycrypto>=2.6", 4), Requirement.parse("distribute>=0.6.28, <0.7", 6), Requirement.parse("pdfminer==20140328", 3), ] )
def test_pull_requests(self): pr1 = pullrequest_factory("PR1") pr2 = pullrequest_factory("PR2") pr3 = pullrequest_factory("PR3") req1 = Requirement.parse("django", 0) req1.pull_request = pr1 req2 = Requirement.parse("pyramid", 0) req2.pull_request = pr1 req3 = Requirement.parse("flask", 0) req3.pull_request = pr2 req4 = Requirement.parse("elixir", 0) req4.pull_request = pr3 reqs = RequirementsBundle() req_file = RequirementFile(path="foo", content='') req_file._requirements = [ req1, req2, req3, req4 ] reqs.append(req_file) self.assertEqual( [pr1, pr2, pr3], [pr for pr in reqs.pull_requests()] )
def test_version_pinned(self): with patch('pyup.requirements.Requirement.package', new_callable=PropertyMock, return_value=package_factory(name="django", versions=["1.8", "1.9"])): r = Requirement.parse("Django==1.9", 0) self.assertEqual(r.version, "1.9") with patch('pyup.requirements.Requirement.package', new_callable=PropertyMock, return_value=package_factory(name="django==1.9rc1", versions=["1.8", "1.9rc1", "1.9rc2"])): r = Requirement.parse("Django==1.9.2.rc14 # rq.filter != 1.44", 0) self.assertEqual(r.version, "1.9.2.rc14")
def test_requirements(self): with patch('pyup.requirements.Requirement.package', return_value=Mock()): reqs = RequirementsBundle() reqs.append(RequirementFile(path="r.txt", content='Bla\nFoo')) self.assertEqual([ Requirement.parse("Bla", 1), Requirement.parse("Foo", 2) ], [r for r in reqs.requirements] )
def test_update_content_tabbed(self): with patch('pyup.requirements.Requirement.latest_version_within_specs', new_callable=PropertyMock, return_value="1.4.2"): content = "bla==1.4.1\t\t# some foo" req = Requirement.parse(content, 0) self.assertEqual(req.update_content(content), "bla==1.4.2 # some foo") content = "bla==1.4.1\t\t# pyup: <1.4.2" req = Requirement.parse(content, 0) self.assertEqual(req.update_content(content), "bla==1.4.2 # pyup: <1.4.2")
def test_parse_hashes(self): with open(os.path.dirname(os.path.realpath(__file__)) + "/data/hashed_reqs.txt") as f: content = f.read() r = RequirementFile("r.txt", content) self.assertEqual( [ Requirement.parse("alembic==0.8.9", 1), Requirement.parse("amqp==2.1.1", 3), Requirement.parse("argon2-cffi==16.3.0", 6), Requirement.parse("Babel==2.3.4", 8), ], list(r.requirements) )
def test_get_latest_version_within_specs(self): latest = Requirement.get_latest_version_within_specs( (("==", "1.2"), ("!=", "1.2")), ["1.2", "1.3", "1.4", "1.5"] ) self.assertEqual(latest, None) latest = Requirement.get_latest_version_within_specs( (("==", "1.2.1"),), ["1.2.0", "1.2.1", "1.2.2", "1.3"] ) self.assertEqual(latest, "1.2.1")
def test_ignore_requirement(self, package): package.return_value = True content = """foo bar # pyup: ignore baz""" r = RequirementFile("r.txt", content=content) self.assertEqual(len(r.requirements), 2) self.assertEqual( r.requirements, [ Requirement.parse("foo", 0), Requirement.parse("baz", 2) ] )
def test_update_content_simple_unpinned(self): with patch('pyup.requirements.Requirement.latest_version', new_callable=PropertyMock, return_value="1.4.2"): content = "django" req = Requirement.parse(content, 0) self.assertEqual(req.update_content(content), "django==1.4.2") with patch('pyup.requirements.Requirement.latest_version', new_callable=PropertyMock, return_value="1.4.2"): content = "Django" req = Requirement.parse(content, 0) self.assertEqual(req.update_content(content), "Django==1.4.2")
def test_is_loose(self): req = Requirement.parse("Django", 0) self.assertEqual(req.is_loose, True) req = Requirement.parse("Django==1.4,>1.5", 0) self.assertEqual(req.is_loose, False) req = Requirement.parse("Django===1.4", 0) self.assertEqual(req.is_loose, False) req = Requirement.parse("Django<=1.4,>=1.33", 0) self.assertEqual(req.is_loose, False) req = Requirement.parse("Django==1.4", 0) self.assertEqual(req.is_loose, False)
def test_update_content_with_extras(self): with patch('pyup.requirements.Requirement.latest_version_within_specs', new_callable=PropertyMock, return_value="1.4.2"): content = "requests[security]==1.4.1" req = Requirement.parse(content, 0) self.assertEqual(req.update_content(content), "requests[security]==1.4.2")
def test_update_content_unfinished_line(self): with patch('pyup.requirements.Requirement.latest_version', new_callable=PropertyMock, return_value="1.5.6"): content = 'raven==0.2\n' req = Requirement.parse("raven==0.2", 0) updated_content = 'raven==1.5.6\n' self.assertEqual(req.update_content(content), updated_content)
def test_version_unpinned(self): with patch('pyup.requirements.Requirement.package', new_callable=PropertyMock, return_value=package_factory(name="django", versions=["1.9", "1.8"])): r = Requirement.parse("Django", 0) self.assertEqual(r.version, "1.9") with patch('pyup.requirements.Requirement.package', new_callable=PropertyMock, return_value=package_factory(name="django", versions=["1.9rc1", "1.9", "1.8"])): r = Requirement.parse("Django", 0) self.assertEqual(r.version, "1.9") with patch('pyup.requirements.Requirement.package', new_callable=PropertyMock, return_value=package_factory(name="django", versions=["1.9.1", "1.8", "1.9rc1"])): r = Requirement.parse("django", 0) self.assertEqual(r.version, "1.9.1") with patch('pyup.requirements.Requirement.package', new_callable=PropertyMock, return_value=package_factory( name="django", versions=["1.4.3", "1.5", "1.4.2", "1.4.1", ])): r = Requirement.parse("Django # rq.filter: >=1.4,<1.5", 0) self.assertEqual(r.version, "1.4.3") with patch('pyup.requirements.Requirement.package', new_callable=PropertyMock, return_value=package_factory( name="django", versions=["1.4.3", "1.5", "1.4.2", "1.4.1", ])): r = Requirement.parse("Django # pyup: >=1.4,<1.5", 0) self.assertEqual(r.version, "1.4.3") with patch('pyup.requirements.Requirement.package', new_callable=PropertyMock, return_value=package_factory(name="django", versions=["1.8.1", "1.8"])): r = Requirement.parse("Django # rq.filter: !=1.8.1", 0) self.assertEqual(r.version, "1.8") with patch('pyup.requirements.Requirement.package', new_callable=PropertyMock, return_value=package_factory(name="django", versions=["1.8.1", "1.8"])): r = Requirement.parse("Django # pyup: !=1.8.1", 0) self.assertEqual(r.version, "1.8") with patch('pyup.requirements.Requirement.package', new_callable=PropertyMock, return_value=package_factory(name="django", versions=["1.9rc1", "1.9.1", "1.8", ])): r = Requirement.parse("django # rq.filter: bogus", 0) self.assertEqual(r.version, "1.9.1") with patch('pyup.requirements.Requirement.package', new_callable=PropertyMock, return_value=package_factory(name="django", versions=["1.9rc1", "1.9.1", "1.8", ])): r = Requirement.parse("django # pyup: bogus", 0) self.assertEqual(r.version, "1.9.1")
def test_filter(self): r = Requirement.parse("Django==1.7.6", 0) self.assertEqual(r.filter, False) r = Requirement.parse("Django==1.7.6 # pyup: < 1.7.8", 0) self.assertEqual(r.filter, [("<", "1.7.8")]) req = Requirement.parse("some-package==1.9.3 # rq.filter: <1.10 #some comment here", 0) self.assertEqual(req.filter, [("<", "1.10")]) r = Requirement.parse("django==1.7.1 # pyup: <1.7.6", 0) r = Requirement.parse("Django==1.7.6 # pyup: < 1.7.8, > 1.7.2", 0) self.assertEqual( sorted(r.filter, key=lambda r: r[1]), sorted([("<", "1.7.8"), (">", "1.7.2")], key=lambda r: r[1]) )
def test_latest_version_within_specs_called(self): with patch('pyup.requirements.Requirement.latest_version_within_specs', new_callable=PropertyMock, return_value="1.4.2") as mocked: content = "django==1.4.1" req = Requirement.parse(content, 0) self.assertEqual(req.update_content(content), "django==1.4.2") mocked.assert_called_with()
def test_update_with_environment_markers_and_comment(self): with patch('pyup.requirements.Requirement.latest_version_within_specs', new_callable=PropertyMock, return_value="1.4.2"): content = "uvloop==0.6.5; sys_platform != 'win32' # and here's some comment" req = Requirement.parse(content, 0) self.assertEqual(req.update_content(content), "uvloop==1.4.2; sys_platform != 'win32' # and here's some comment")
def test_update_content_with_dubious_package_name(self): with patch('pyup.requirements.Requirement.latest_version', new_callable=PropertyMock, return_value="2.58.1.44"): content = 'raven\n' \ 'ravenclient' req = Requirement.parse("raven", 0) updated_content = 'raven==2.58.1.44\n' \ 'ravenclient' self.assertEqual(req.update_content(content), updated_content)
def test_package_not_found(self, requests): requests.get("https://pypi.python.org/pypi/Fango/json", text="404", status_code=404) r = Requirement.parse("Fango", 0) self.assertEqual(r._fetched_package, False) self.assertEqual(r._package, None) # this triggers the fetch self.assertEqual(r.package, None) self.assertEqual(r._fetched_package, True) self.assertEqual(r._package, None)
def test_needs_update(self, requests): with open(os.path.dirname(os.path.realpath(__file__)) + "/data/django.json") as f: requests.get("https://pypi.python.org/pypi/Django/json", text=f.read()) # is pinned and on latest r = Requirement.parse("Django==1.9rc1", 0) self.assertEqual(r.needs_update, False) # is ranged and open r = Requirement.parse("Django>=1.8", 0) self.assertEqual(r.needs_update, False) # is pinned but old r = Requirement.parse("Django==1.7", 0) self.assertEqual(r.needs_update, True) # is not pinned r = Requirement.parse("Django", 0) self.assertEqual(r.needs_update, True)
def test_package_found(self, requests): with open(os.path.dirname(os.path.realpath(__file__)) + "/data/django.json") as f: requests.get("https://pypi.python.org/pypi/Django/json", text=f.read()) r = Requirement.parse("Django==1.9rc1", 0) self.assertEqual(r._fetched_package, False) self.assertEqual(r._package, None) # this triggers the fetch self.assertNotEqual(r.package, None) self.assertEqual(r._fetched_package, True) self.assertNotEqual(r._package, None)
def test_update_content_simple_unpinned_with_comment(self): with patch('pyup.requirements.Requirement.latest_version', new_callable=PropertyMock, return_value="1.4.2"): content = "django # newest django release" req = Requirement.parse(content, 0) self.assertEqual(req.update_content(content), "django==1.4.2 # newest django release") with patch('pyup.requirements.Requirement.latest_version', new_callable=PropertyMock, return_value="1.4.2"): content = "Django #django" req = Requirement.parse(content, 0) self.assertEqual(req.update_content(content), "Django==1.4.2 #django") with patch('pyup.requirements.Requirement.latest_version', new_callable=PropertyMock, return_value="1.4.2"): content = "Django #django #yay this has really cool comments ######" req = Requirement.parse(content, 0) self.assertEqual(req.update_content(content), "Django==1.4.2 #django #yay this has really cool comments ######")
def test_update_contains_correct_sep_char(self): with patch('pyup.requirements.Requirement.latest_version_within_specs', new_callable=PropertyMock, return_value="2.9.5"): content = "Jinja2==2.9.4 # via flask" req_file = RequirementFile("req.txt", content) req = list(req_file.requirements)[0] self.assertEqual( Requirement.parse("Jinja2==2.9.4 # via flask", 1), req ) self.assertEqual(req.update_content(content), "Jinja2==2.9.5 # via flask")
def test_latest_version_within_specs(self): with patch('pyup.requirements.Requirement.package', new_callable=PropertyMock, return_value=package_factory("bliss", versions=["1.9rc1", "1.9", "1.8.1", "1.8", "1.7", "1.6"])): req = Requirement.parse("bliss #rq.filter:", 0) self.assertEqual(req.latest_version_within_specs, "1.9") req = Requirement.parse("bliss==1.8rc1 #rq.filter:", 0) self.assertEqual(req.prereleases, True) self.assertEqual(req.latest_version_within_specs, "1.9rc1") req = Requirement.parse("bliss #rq.filter: >=1.7,<1.9", 0) self.assertEqual(req.latest_version_within_specs, "1.8.1") with patch('pyup.requirements.Requirement.package', new_callable=PropertyMock, return_value=package_factory("gevent", versions=['1.1rc1', '1.1b6', '1.1b5', '1.1b4', '1.1b3', '1.1b2', '1.1b1', '1.1a2', '1.1a1', '1.0.2', '1.0.1', ])): req = Requirement.parse("gevent==1.1b6", 0) self.assertEqual(req.latest_version_within_specs, "1.1rc1") self.assertEqual(req.latest_version, "1.1rc1")
def test_update_content_with_package_in_comments(self): with patch('pyup.requirements.Requirement.latest_version', new_callable=PropertyMock, return_value="2.58.1.44"): content = 'raven==5.8.1\n' \ '{%- endif %}\n\n' \ '{% if cookiecutter.use_newrelic == "y" -%}\n' \ '# Newrelic agent for performance monitoring\n' \ '# -----------------------------------------\n' \ 'newrelic\n' \ '{%- endif %}\n\n' req = Requirement.parse("newrelic", 0) updated_content = 'raven==5.8.1\n' \ '{%- endif %}\n\n' \ '{% if cookiecutter.use_newrelic == "y" -%}\n' \ '# Newrelic agent for performance monitoring\n' \ '# -----------------------------------------\n' \ 'newrelic==2.58.1.44\n' \ '{%- endif %}\n\n' self.assertEqual(req.update_content(content), updated_content)
def test_update_with_hashes(self, get_hashes_mock): get_hashes_mock.return_value = { "hashes": [{"hash": "123"}, {"hash": "456"}] } with patch('pyup.requirements.Requirement.latest_version_within_specs', new_callable=PropertyMock, return_value="1.4.2"): content = "alembic==0.8.9 \\\n" \ " --hash=sha256:abcde" req_file = RequirementFile("req.txt", content) req = list(req_file.requirements)[0] self.assertEqual( Requirement.parse("alembic==0.8.9", 1), req ) self.assertEqual(req.update_content(content), "alembic==1.4.2 \\\n" " --hash=sha256:123 \\\n" " --hash=sha256:456")
def test_is_open_ranged(self): req = Requirement.parse("Django>=1.5", 0) self.assertEqual(req.is_open_ranged, True) req = Requirement.parse("Django<=1.4,>1.5", 0) self.assertEqual(req.is_open_ranged, False) req = Requirement.parse("Django===1.4", 0) self.assertEqual(req.is_open_ranged, False) req = Requirement.parse("Django<=1.4,>=1.33", 0) self.assertEqual(req.is_open_ranged, False) req = Requirement.parse("Django==1.4", 0) self.assertEqual(req.is_open_ranged, False) req = Requirement.parse("Django>=1.4,<=1.7", 0) self.assertEqual(req.is_open_ranged, False)
def test_prereleases(self): r = Requirement.parse("Django==1.9rc1", 0) self.assertEqual(r.prereleases, True) r = Requirement.parse("Django==1.9-b1", 0) self.assertEqual(r.prereleases, True) r = Requirement.parse("Django==1.9-alpha1", 0) self.assertEqual(r.prereleases, True) r = Requirement.parse("Django", 0) self.assertEqual(r.prereleases, False) r = Requirement.parse("Django>=1.5,<=1.6", 0) self.assertEqual(r.prereleases, False) r = Requirement.parse("Django!=1.9", 0) self.assertEqual(r.prereleases, False)
def test_name(self): r = Requirement.parse("Django==1.9rc1", 0) self.assertEqual(r.name, "Django") r = Requirement.parse("django==1.9-b1", 0) self.assertEqual(r.name, "django")
def test_package_filter_present(self): req = Requirement.parse("Django", 0) self.assertEqual(req.filter, False) req = Requirement.parse("Django #rq.filter:", 0) self.assertEqual(req.filter, False) req = Requirement.parse("Django #rq.filter: >=1.4,<1.5", 0) self.assertEqual( sorted(req.filter, key=lambda i: i[0]), sorted([('>=', '1.4'), ('<', '1.5')], key=lambda i: i[0]) ) req = Requirement.parse("Django #rq.filter:!=1.2", 0) self.assertEqual(req.filter, [('!=', '1.2')]) req = Requirement.parse("Django #rq.filter:foo", 0) self.assertEqual(req.filter, False) req = Requirement.parse("bliss #rq.filter:", 0) self.assertEqual(req.filter, False) req = Requirement.parse("Django", 0) self.assertEqual(req.filter, False) req = Requirement.parse("Django #pyup:", 0) self.assertEqual(req.filter, False) req = Requirement.parse("Django #pyup: >=1.4,<1.5", 0) self.assertEqual( sorted(req.filter, key=lambda i: i[0]), sorted([('>=', '1.4'), ('<', '1.5')], key=lambda i: i[0]) ) req = Requirement.parse("Django #pyup:!=1.2", 0) self.assertEqual(req.filter, [('!=', '1.2')]) req = Requirement.parse("Django #pyup:foo", 0) self.assertEqual(req.filter, False) req = Requirement.parse("bliss #pyup:", 0) self.assertEqual(req.filter, False)
def test_version_unpinned(self): with patch('pyup.requirements.Requirement.package', new_callable=PropertyMock, return_value=package_factory(name="django", versions=["1.9", "1.8"])): r = Requirement.parse("Django", 0) self.assertEqual(r.version, "1.9") with patch('pyup.requirements.Requirement.package', new_callable=PropertyMock, return_value=package_factory( name="django", versions=["1.9rc1", "1.9", "1.8"])): r = Requirement.parse("Django", 0) self.assertEqual(r.version, "1.9") with patch('pyup.requirements.Requirement.package', new_callable=PropertyMock, return_value=package_factory( name="django", versions=["1.9.1", "1.8", "1.9rc1"])): r = Requirement.parse("django", 0) self.assertEqual(r.version, "1.9.1") with patch('pyup.requirements.Requirement.package', new_callable=PropertyMock, return_value=package_factory(name="django", versions=[ "1.4.3", "1.5", "1.4.2", "1.4.1", ])): r = Requirement.parse("Django # rq.filter: >=1.4,<1.5", 0) self.assertEqual(r.version, "1.4.3") with patch('pyup.requirements.Requirement.package', new_callable=PropertyMock, return_value=package_factory(name="django", versions=[ "1.4.3", "1.5", "1.4.2", "1.4.1", ])): r = Requirement.parse("Django # pyup: >=1.4,<1.5", 0) self.assertEqual(r.version, "1.4.3") with patch('pyup.requirements.Requirement.package', new_callable=PropertyMock, return_value=package_factory(name="django", versions=["1.8.1", "1.8"])): r = Requirement.parse("Django # rq.filter: !=1.8.1", 0) self.assertEqual(r.version, "1.8") with patch('pyup.requirements.Requirement.package', new_callable=PropertyMock, return_value=package_factory(name="django", versions=["1.8.1", "1.8"])): r = Requirement.parse("Django # pyup: !=1.8.1", 0) self.assertEqual(r.version, "1.8") with patch('pyup.requirements.Requirement.package', new_callable=PropertyMock, return_value=package_factory(name="django", versions=[ "1.9rc1", "1.9.1", "1.8", ])): r = Requirement.parse("django # rq.filter: bogus", 0) self.assertEqual(r.version, "1.9.1") with patch('pyup.requirements.Requirement.package', new_callable=PropertyMock, return_value=package_factory(name="django", versions=[ "1.9rc1", "1.9.1", "1.8", ])): r = Requirement.parse("django # pyup: bogus", 0) self.assertEqual(r.version, "1.9.1")
def test_str(self): r = Requirement.parse("Django==1.9rc1", 0) self.assertEqual(r.__str__(), "Requirement.parse(Django==1.9rc1, 0)")
def test_tabbed(self): req = Requirement.parse("Django==1.5\t\t#some-comment", 0) self.assertEqual(req.is_pinned, True) self.assertEqual(req.version, "1.5")
def test_is_insecure(self): with self.assertRaises(NotImplementedError): r = Requirement.parse("Django", 0) r.is_insecure
def test_not_equals(self): self.assertNotEqual( Requirement.parse("Django==1.5", 0), Requirement.parse("Django==1.6", 0) )
def test_is_outdated(self): with patch('pyup.requirements.Requirement.latest_version_within_specs', new_callable=PropertyMock, return_value=None): r = Requirement.parse("Django", 0) self.assertEqual(r.is_outdated, False)
def test_something_else(self): with patch('pyup.requirements.Requirement.latest_version', new_callable=PropertyMock, return_value="0.13.1"): content = "some-package==0.12.2+tmf" req = Requirement.parse(content, 0) self.assertEqual(req.update_content(content), "some-package==0.13.1")