def test_update_tox_ini(): content = "[testenv:bandit]\n" \ "commands =\n" \ "\tbandit --ini setup.cfg -ii -l --recursive project_directory\n" \ "deps =\n" \ "\tbandit==1.4.0\n" \ "\n" \ "[testenv:manifest]\n" \ "commands =\n" \ "\tcheck-manifest --verbose\n" dep_file = parse(content, "tox.ini") dep = dep_file.dependencies[0] assert dep.name == "bandit" new_content = "[testenv:bandit]\n" \ "commands =\n" \ "\tbandit --ini setup.cfg -ii -l --recursive project_directory\n" \ "deps =\n" \ "\tbandit==2.9.5\n" \ "\n" \ "[testenv:manifest]\n" \ "commands =\n" \ "\tcheck-manifest --verbose\n" assert ToxINIUpdater.update(content=content, dependency=dep, version="2.9.5") == new_content
def test_update_requirements_line_endings(): content = """\r\n\r\nWerkzeug\r\ndjango-template-repl\nbpython\nsome-fooo \n""" version = "1.2.3" dep_file = parse(content=content, file_type=filetypes.requirements_txt) assert dep_file.dependencies[0].name == "Werkzeug" assert dep_file.dependencies[1].name == "django-template-repl" assert dep_file.dependencies[2].name == "bpython" assert dep_file.dependencies[3].name == "some-fooo" assert "Werkzeug==1.2.3\r\n" in RequirementsTXTUpdater.update( content=content, version=version, dependency=dep_file.dependencies[0] ) assert "django-template-repl==1.2.3\n" in RequirementsTXTUpdater.update( content=content, version=version, dependency=dep_file.dependencies[1] ) assert "bpython==1.2.3" in RequirementsTXTUpdater.update( content=content, version=version, dependency=dep_file.dependencies[2] ) assert "some-fooo==1.2.3 \n" in RequirementsTXTUpdater.update( content=content, version=version, dependency=dep_file.dependencies[3] )
def test_requirements_package_with_index_server(): content = """-i https://some.foo/\ndjango""" dep_file = parse(content=content, file_type=filetypes.requirements_txt) dep = dep_file.dependencies[0] assert dep.name == "django" assert dep.index_server == "https://some.foo/"
def test_pipfile_with_invalid_toml(): content = """[[source] url = "http://some.pypi.mirror.server.org/simple" verify_ssl = false ds name < "pypi" """ dep_file = parse(content, file_type=filetypes.pipfile) assert not dep_file.dependencies
def test_conda_file_with_invalid_requirement(): content = "name: my_env\n" \ "dependencies:\n" \ " - gevent=1.2.1\n" \ " - pip:\n" \ " - in=vali===d{}{}{" dep_file = parse(content, file_type=filetypes.conda_yml) assert len(dep_file.dependencies) == 0
def test_pipfile_lock_with_invalid_json(): content = """{ "_meta": "hash": { "sha256": "8b5635a4f7b069ae6661115b9eaa15466f7cd96794af5d131735a3638be101fb" }, }""" dep_file = parse(content, file_type=filetypes.pipfile_lock) assert not dep_file.dependencies
def test_update_requirements_unfinished_line(): content = 'raven==0.2\n' new_content = 'raven==1.5.6\n' version = "1.5.6" dep_file = parse(content=content, file_type=filetypes.requirements_txt) dep = dep_file.dependencies[0] assert dep.name == "raven" assert RequirementsTXTUpdater.update(content=content, version=version, dependency=dep) == new_content
def test_update_requirements_compatible_matching_latest(): content = "Jinja2~=2.9.5 # via flask" new_content = "Jinja2==2.9.5 # via flask" version = "2.9.5" dep_file = parse(content=content, file_type=filetypes.requirements_txt) dep = dep_file.dependencies[0] assert dep.name == "Jinja2" assert RequirementsTXTUpdater.update(content=content, version=version, dependency=dep) == new_content
def test_update_requirements_simple_unpinned(): content = "django" new_content = "django==1.4.2" version = "1.4.2" dep_file = parse(content=content, file_type=filetypes.requirements_txt) dep = dep_file.dependencies[0] assert dep.name == "django" assert RequirementsTXTUpdater.update(content=content, version=version, dependency=dep) == new_content
def test_update_requirements_contains_correct_sep_char(): content = "Jinja2==2.9.4 # via flask" new_content = "Jinja2==2.9.5 # via flask" version = "2.9.5" dep_file = parse(content=content, file_type=filetypes.requirements_txt) dep = dep_file.dependencies[0] assert dep.name == "Jinja2" assert RequirementsTXTUpdater.update(content=content, version=version, dependency=dep) == new_content
def test_update_requirements_with_plus(): content = "some-package==0.12.2+tmf" new_content = "some-package==0.13.1" version = "0.13.1" dep_file = parse(content=content, file_type=filetypes.requirements_txt) dep = dep_file.dependencies[0] assert dep.name == "some-package" assert RequirementsTXTUpdater.update(content=content, version=version, dependency=dep) == new_content
def test_update_requirements_with_tabs(): content = "bla==1.4.1\t\t# pyup: <1.4.2" new_content = "bla==1.4.2\t\t# pyup: <1.4.2" version = "1.4.2" dep_file = parse(content=content, file_type=filetypes.requirements_txt) dep = dep_file.dependencies[0] assert dep.name == "bla" assert RequirementsTXTUpdater.update(content=content, version=version, dependency=dep) == new_content
def test_update_requirements_with_extras(): content = "requests[security]==1.4.1" new_content = "requests[security]==1.4.2" version = "1.4.2" dep_file = parse(content=content, file_type=filetypes.requirements_txt) dep = dep_file.dependencies[0] assert dep.name == "requests" assert RequirementsTXTUpdater.update(content=content, version=version, dependency=dep) == new_content
def test_update_requirements_with_env_markers_and_comment(): content = "uvloop==0.6.5; sys_platform != 'win32' # and here's some comment" new_content = "uvloop==1.4.2; sys_platform != 'win32' # and here's some comment" version = "1.4.2" dep_file = parse(content=content, file_type=filetypes.requirements_txt) dep = dep_file.dependencies[0] assert dep.name == "uvloop" assert RequirementsTXTUpdater.update(content=content, version=version, dependency=dep) == new_content
def test_update_requirements_multispace(): content = " pass" new_content = "pass==2.9.5" version = "2.9.5" dep_file = parse(content=content, file_type=filetypes.requirements_txt) dep = dep_file.dependencies[0] assert dep.name == "pass" assert RequirementsTXTUpdater.update(content=content, version=version, dependency=dep) == new_content
def test_tox_ini_with_invalid_requirement(): content = "[testenv]" \ "passenv = CI TRAVIS TRAVIS_*" \ "setenv =" \ "PYTHONPATH = {toxinidir}" \ "deps =" \ "-r{toxinidir}/requirements_dev.txt" \ "pytest-cov" \ "codecov" dep_file = parse(content, file_type=filetypes.tox_ini) assert len(dep_file.dependencies) == 0
def test_update_requirements_with_double_package_name(): content = 'raven\n' \ 'ravenclient' new_content = 'raven==2.58.1.44\n' \ 'ravenclient' version = "2.58.1.44" dep_file = parse(content=content, file_type=filetypes.requirements_txt) dep = dep_file.dependencies[0] assert dep.name == "raven" assert RequirementsTXTUpdater.update(content=content, version=version, dependency=dep) == new_content
def test_update_requirements_with_hash_inline(): content = "alembic==0.8.9 --hash=sha256:abcde" new_content = "alembic==1.4.2 \\\n" \ " --hash=sha256:123 \\\n" \ " --hash=sha256:456" version = "1.4.2" hashes = [{"method": "sha256", "hash": "123"}, {"method": "sha256", "hash": "456"}] dep_file = parse(content=content, file_type=filetypes.requirements_txt) dep = dep_file.dependencies[0] assert dep.name == "alembic" assert RequirementsTXTUpdater.update(content=content, version=version, dependency=dep, hashes=hashes) == new_content
def test_update_requirements_with_hash_and_comment_and_env_markers_inline(): content = "alembic==0.8.9; sys_platform != 'win32' --hash=sha256:abcde # yay" new_content = "alembic==1.4.2; sys_platform != 'win32' \\\n" \ " --hash=sha256:123 \\\n" \ " --hash=sha256:456 # yay" version = "1.4.2" hashes = [{"method": "sha256", "hash": "123"}, {"method": "sha256", "hash": "456"}] dep_file = parse(content=content, file_type=filetypes.requirements_txt) dep = dep_file.dependencies[0] assert dep.name == "alembic" assert RequirementsTXTUpdater.update(content=content, version=version, dependency=dep, hashes=hashes) == new_content
def test_update_requirements_with_hash_and_space_separator(): content = "taskcluster==0.3.4 --hash sha256:d4fe5e2a44fe" \ "27e195b92830ece0a6eb9eb7ad9dc556a0cb16f6f2a6429f1b65" new_content = "taskcluster==1.4.2 \\\n" \ " --hash=sha256:123 \\\n" \ " --hash=sha256:456" version = "1.4.2" hashes = [{"method": "sha256", "hash": "123"}, {"method": "sha256", "hash": "456"}] dep_file = parse(content=content, file_type=filetypes.requirements_txt) dep = dep_file.dependencies[0] assert dep.name == "taskcluster" assert RequirementsTXTUpdater.update(content=content, version=version, dependency=dep, hashes=hashes) == new_content
def test_requirements_parse_unsupported_line_start(): content = "-f foo\n" \ "--find-links bla\n" \ "-i bla\n" \ "--index-url bla\n" \ "--extra-index-url bla\n" \ "--no-index bla\n" \ "--allow-external\n" \ "--allow-unverified\n" \ "-Z\n" \ "--always-unzip\n" dep_file = parse(content=content, file_type=filetypes.requirements_txt) assert dep_file.dependencies == [] assert dep_file.resolved_files == []
def test_update_requirements_simple_unpinned_with_comment(): content = "django # newest django release" new_content = "django==1.4.2 # newest django release" version = "1.4.2" dep_file = parse(content=content, file_type=filetypes.requirements_txt) dep = dep_file.dependencies[0] assert dep.name == "django" assert RequirementsTXTUpdater.update(content=content, version=version, dependency=dep) == new_content content = "Django #django" new_content = "Django==1.4.2 #django" version = "1.4.2" dep_file = parse(content=content, file_type=filetypes.requirements_txt) dep = dep_file.dependencies[0] assert dep.name == "Django" assert RequirementsTXTUpdater.update(content=content, version=version, dependency=dep) == new_content content = "Django #django #yay this has really cool comments ######" new_content = "Django==1.4.2 #django #yay this has really cool comments ######" version = "1.4.2" dep_file = parse(content=content, file_type=filetypes.requirements_txt) dep = dep_file.dependencies[0] assert dep.name == "Django" assert RequirementsTXTUpdater.update(content=content, version=version, dependency=dep) == new_content
def test_update_conda_yml(): content = "name: my_env\n" \ "dependencies:\n" \ " - gevent=1.2.1\n" \ " - pip:\n" \ " - beautifulsoup4==1.2.3\n" dep_file = parse(content, "conda.yml") dep = dep_file.dependencies[0] assert dep.name == "beautifulsoup4" new_content = "name: my_env\n" \ "dependencies:\n" \ " - gevent=1.2.1\n" \ " - pip:\n" \ " - beautifulsoup4==4.5.6\n" assert CondaYMLUpdater.update(content=content, dependency=dep, version="4.5.6") == new_content
def test_update_requirements_cookiecutter_template(): 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' new_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' version = "2.58.1.44" dep_file = parse(content=content, file_type=filetypes.requirements_txt) dep = dep_file.dependencies[1] assert dep.name == "newrelic" assert RequirementsTXTUpdater.update(content=content, version=version, dependency=dep) == new_content
def test_update_pipfile(): content = """[[source]] url = "http://some.pypi.mirror.server.org/simple" verify_ssl = false name = "pypi" [packages] django = "==2.0" djangorestframework = "*" django-allauth = "*" [dev-packages] toml = "*" """ dep_file = parse(content=content, file_type=filetypes.pipfile) dep = dep_file.dependencies[0] new_content = PipfileUpdater.update(content, version="2.1", dependency=dep) assert 'django = "==2.1"' in new_content
def test_conda_file_invalid_yml(): content = "wawth:dda : awd:\ndlll" dep_file = parse(content, file_type=filetypes.conda_yml) assert dep_file.dependencies == []
def test_pipfile_lock(): content = """{ "_meta": { "hash": { "sha256": "8b5635a4f7b069ae6661115b9eaa15466f7cd96794af5d131735a3638be101fb" }, "host-environment-markers": { "implementation_name": "cpython", "implementation_version": "3.6.3", "os_name": "posix", "platform_machine": "x86_64", "platform_python_implementation": "CPython", "platform_release": "17.3.0", "platform_system": "Darwin", "platform_version": "Darwin Kernel Version 17.3.0: Thu Nov 9 18:09:22 PST 2017; root:xnu-4570.31.3~1/RELEASE_X86_64", "python_full_version": "3.6.3", "python_version": "3.6", "sys_platform": "darwin" }, "pipfile-spec": 6, "requires": {}, "sources": [ { "name": "pypi", "url": "https://pypi.python.org/simple", "verify_ssl": true } ] }, "default": { "django": { "hashes": [ "sha256:52475f607c92035d4ac8fee284f56213065a4a6b25ed43f7e39df0e576e69e9f", "sha256:d96b804be412a5125a594023ec524a2010a6ffa4d408e5482ab6ff3cb97ec12f" ], "version": "==2.0.1" }, "pytz": { "hashes": [ "sha256:80af0f3008046b9975242012a985f04c5df1f01eed4ec1633d56cc47a75a6a48", "sha256:feb2365914948b8620347784b6b6da356f31c9d03560259070b2f30cff3d469d", "sha256:59707844a9825589878236ff2f4e0dc9958511b7ffaae94dc615da07d4a68d33", "sha256:d0ef5ef55ed3d37854320d4926b04a4cb42a2e88f71da9ddfdacfde8e364f027", "sha256:c41c62827ce9cafacd6f2f7018e4f83a6f1986e87bfd000b8cfbd4ab5da95f1a", "sha256:8cc90340159b5d7ced6f2ba77694d946fc975b09f1a51d93f3ce3bb399396f94", "sha256:dd2e4ca6ce3785c8dd342d1853dd9052b19290d5bf66060846e5dc6b8d6667f7", "sha256:699d18a2a56f19ee5698ab1123bbcc1d269d061996aeb1eda6d89248d3542b82", "sha256:fae4cffc040921b8a2d60c6cf0b5d662c1190fe54d718271db4eb17d44a185b7" ], "version": "==2017.3" } }, "develop": {} }""" dep_file = parse(content, file_type=filetypes.pipfile_lock) assert dep_file.dependencies[0].name == 'django' assert dep_file.dependencies[0].specs == SpecifierSet('==2.0.1') assert dep_file.dependencies[0].hashes == [ "sha256:52475f607c92035d4ac8fee284f56213065a4a6b25ed43f7e39df0e576e69e9f", "sha256:d96b804be412a5125a594023ec524a2010a6ffa4d408e5482ab6ff3cb97ec12f" ]
def test_requirements_with_invalid_requirement(): content = "in=vali===d{}{}{" dep_file = parse(content, file_type=filetypes.requirements_txt) assert len(dep_file.dependencies) == 0