diff --git a/python/testData/requirement/generation/addMissingPackages/main.py b/python/testData/requirement/generation/addMissingPackages/main.py new file mode 100644 index 000000000000..4904322cfa84 --- /dev/null +++ b/python/testData/requirement/generation/addMissingPackages/main.py @@ -0,0 +1,3 @@ +import django as dj +import requests +import numpy \ No newline at end of file diff --git a/python/testData/requirement/generation/addMissingPackages/new_requirements.txt b/python/testData/requirement/generation/addMissingPackages/new_requirements.txt new file mode 100644 index 000000000000..4022ead95c20 --- /dev/null +++ b/python/testData/requirement/generation/addMissingPackages/new_requirements.txt @@ -0,0 +1,3 @@ +requests==2.22.0 +Django==3.0.0 +numpy==1.18.1 \ No newline at end of file diff --git a/python/testData/requirement/generation/addMissingPackages/requirements.txt b/python/testData/requirement/generation/addMissingPackages/requirements.txt new file mode 100644 index 000000000000..802474953187 --- /dev/null +++ b/python/testData/requirement/generation/addMissingPackages/requirements.txt @@ -0,0 +1 @@ +requests==2.21.0 \ No newline at end of file diff --git a/python/testData/requirement/generation/addMissingVersion/main.py b/python/testData/requirement/generation/addMissingVersion/main.py new file mode 100644 index 000000000000..b3953b05174f --- /dev/null +++ b/python/testData/requirement/generation/addMissingVersion/main.py @@ -0,0 +1,5 @@ +import django +import requests +import Jinja2 +import pandas +import cookiecutter \ No newline at end of file diff --git a/python/testData/requirement/generation/addMissingVersion/new_requirements.txt b/python/testData/requirement/generation/addMissingVersion/new_requirements.txt new file mode 100644 index 000000000000..f7db072d5494 --- /dev/null +++ b/python/testData/requirement/generation/addMissingVersion/new_requirements.txt @@ -0,0 +1,5 @@ +Django==3.0.0 +requests==2.22.0 +Jinja2==2.11.1 +pandas==1.0.1 +cookiecutter==1.7.0 \ No newline at end of file diff --git a/python/testData/requirement/generation/addMissingVersion/requirements.txt b/python/testData/requirement/generation/addMissingVersion/requirements.txt new file mode 100644 index 000000000000..c8ab6b25e7d9 --- /dev/null +++ b/python/testData/requirement/generation/addMissingVersion/requirements.txt @@ -0,0 +1,5 @@ +Django +requests +Jinja2 +pandas +cookiecutter \ No newline at end of file diff --git a/python/testData/requirement/generation/addVersionWithSpecifier/main.py b/python/testData/requirement/generation/addVersionWithSpecifier/main.py new file mode 100644 index 000000000000..4d01d192a810 --- /dev/null +++ b/python/testData/requirement/generation/addVersionWithSpecifier/main.py @@ -0,0 +1,5 @@ +import django +import requests +import Jinja2 +import pandas +import numpy \ No newline at end of file diff --git a/python/testData/requirement/generation/addVersionWithSpecifier/new_requirements.txt b/python/testData/requirement/generation/addVersionWithSpecifier/new_requirements.txt new file mode 100644 index 000000000000..0db49f6acd09 --- /dev/null +++ b/python/testData/requirement/generation/addVersionWithSpecifier/new_requirements.txt @@ -0,0 +1,5 @@ +Django~=3.0.0 +requests~=2.22.0 +Jinja2~=2.11.1 +pandas~=1.0.1 +numpy~=1.18.1 \ No newline at end of file diff --git a/python/testData/requirement/generation/addVersionWithSpecifier/requirements.txt b/python/testData/requirement/generation/addVersionWithSpecifier/requirements.txt new file mode 100644 index 000000000000..11b8b904e08a --- /dev/null +++ b/python/testData/requirement/generation/addVersionWithSpecifier/requirements.txt @@ -0,0 +1,5 @@ +Django +requests +Jinja2 +pandas +numpy \ No newline at end of file diff --git a/python/testData/requirement/generation/compatibleFileReference/base_requirements.txt b/python/testData/requirement/generation/compatibleFileReference/base_requirements.txt new file mode 100644 index 000000000000..7d33bd25311a --- /dev/null +++ b/python/testData/requirement/generation/compatibleFileReference/base_requirements.txt @@ -0,0 +1,3 @@ +# all the packages here match by version +requests==2.22.0 +Django>=3.0.0 \ No newline at end of file diff --git a/python/testData/requirement/generation/compatibleFileReference/main.py b/python/testData/requirement/generation/compatibleFileReference/main.py new file mode 100644 index 000000000000..4904322cfa84 --- /dev/null +++ b/python/testData/requirement/generation/compatibleFileReference/main.py @@ -0,0 +1,3 @@ +import django as dj +import requests +import numpy \ No newline at end of file diff --git a/python/testData/requirement/generation/compatibleFileReference/new_requirements.txt b/python/testData/requirement/generation/compatibleFileReference/new_requirements.txt new file mode 100644 index 000000000000..82f59b99ee5a --- /dev/null +++ b/python/testData/requirement/generation/compatibleFileReference/new_requirements.txt @@ -0,0 +1,2 @@ +-r base_requirements.txt +numpy==1.18.1 \ No newline at end of file diff --git a/python/testData/requirement/generation/compatibleFileReference/requirements.txt b/python/testData/requirement/generation/compatibleFileReference/requirements.txt new file mode 100644 index 000000000000..06b67ffa3bbd --- /dev/null +++ b/python/testData/requirement/generation/compatibleFileReference/requirements.txt @@ -0,0 +1 @@ +-r base_requirements.txt \ No newline at end of file diff --git a/python/testData/requirement/generation/incompatibleFileReference/base_requirements.txt b/python/testData/requirement/generation/incompatibleFileReference/base_requirements.txt new file mode 100644 index 000000000000..c929db0bf59e --- /dev/null +++ b/python/testData/requirement/generation/incompatibleFileReference/base_requirements.txt @@ -0,0 +1,7 @@ +# this does match the project imports +requests==2.22.0 +Django>=3.0.0 +# but this doesn't +pyplot +toml==0.10.0 +pandas==1.0.1 \ No newline at end of file diff --git a/python/testData/requirement/generation/incompatibleFileReference/main.py b/python/testData/requirement/generation/incompatibleFileReference/main.py new file mode 100644 index 000000000000..4904322cfa84 --- /dev/null +++ b/python/testData/requirement/generation/incompatibleFileReference/main.py @@ -0,0 +1,3 @@ +import django as dj +import requests +import numpy \ No newline at end of file diff --git a/python/testData/requirement/generation/incompatibleFileReference/new_requirements.txt b/python/testData/requirement/generation/incompatibleFileReference/new_requirements.txt new file mode 100644 index 000000000000..03b00dc3c2b1 --- /dev/null +++ b/python/testData/requirement/generation/incompatibleFileReference/new_requirements.txt @@ -0,0 +1,3 @@ +requests==2.22.0 +Django>=3.0.0 +numpy==1.18.1 \ No newline at end of file diff --git a/python/testData/requirement/generation/incompatibleFileReference/requirements.txt b/python/testData/requirement/generation/incompatibleFileReference/requirements.txt new file mode 100644 index 000000000000..06b67ffa3bbd --- /dev/null +++ b/python/testData/requirement/generation/incompatibleFileReference/requirements.txt @@ -0,0 +1 @@ +-r base_requirements.txt \ No newline at end of file diff --git a/python/testData/requirement/generation/keepComments/main.py b/python/testData/requirement/generation/keepComments/main.py new file mode 100644 index 000000000000..e5f0debbd419 --- /dev/null +++ b/python/testData/requirement/generation/keepComments/main.py @@ -0,0 +1,2 @@ +import django +import numpy \ No newline at end of file diff --git a/python/testData/requirement/generation/keepComments/new_requirements.txt b/python/testData/requirement/generation/keepComments/new_requirements.txt new file mode 100644 index 000000000000..fb9b2a590e81 --- /dev/null +++ b/python/testData/requirement/generation/keepComments/new_requirements.txt @@ -0,0 +1,5 @@ +# This is a comment in requirements file +# One more +Django==3.0.0 +# And another +numpy==1.18.1 \ No newline at end of file diff --git a/python/testData/requirement/generation/keepComments/requirements.txt b/python/testData/requirement/generation/keepComments/requirements.txt new file mode 100644 index 000000000000..1ddd8060bba9 --- /dev/null +++ b/python/testData/requirement/generation/keepComments/requirements.txt @@ -0,0 +1,5 @@ +# This is a comment in requirements file +requests==2.22.0 +# One more +Django==3.0.0 +# And another \ No newline at end of file diff --git a/python/testData/requirement/generation/keepEditableForSelf/main.py b/python/testData/requirement/generation/keepEditableForSelf/main.py new file mode 100644 index 000000000000..e5f0debbd419 --- /dev/null +++ b/python/testData/requirement/generation/keepEditableForSelf/main.py @@ -0,0 +1,2 @@ +import django +import numpy \ No newline at end of file diff --git a/python/testData/requirement/generation/keepEditableForSelf/new_requirements.txt b/python/testData/requirement/generation/keepEditableForSelf/new_requirements.txt new file mode 100644 index 000000000000..e8c0ab0acba7 --- /dev/null +++ b/python/testData/requirement/generation/keepEditableForSelf/new_requirements.txt @@ -0,0 +1,3 @@ +-e . +Django==3.0.0 +numpy==1.18.1 \ No newline at end of file diff --git a/python/testData/requirement/generation/keepEditableForSelf/requirements.txt b/python/testData/requirement/generation/keepEditableForSelf/requirements.txt new file mode 100644 index 000000000000..d59d870f4baf --- /dev/null +++ b/python/testData/requirement/generation/keepEditableForSelf/requirements.txt @@ -0,0 +1,2 @@ +-e . +Django \ No newline at end of file diff --git a/python/testData/requirement/generation/keepEditableFromVCS/main.py b/python/testData/requirement/generation/keepEditableFromVCS/main.py new file mode 100644 index 000000000000..dbf09e1ac3bb --- /dev/null +++ b/python/testData/requirement/generation/keepEditableFromVCS/main.py @@ -0,0 +1,3 @@ +import django +import numpy +import tox \ No newline at end of file diff --git a/python/testData/requirement/generation/keepEditableFromVCS/new_requirements.txt b/python/testData/requirement/generation/keepEditableFromVCS/new_requirements.txt new file mode 100644 index 000000000000..1a05552ac0dc --- /dev/null +++ b/python/testData/requirement/generation/keepEditableFromVCS/new_requirements.txt @@ -0,0 +1,3 @@ +Django==3.0.0 +-e git+https://github.com/tox-dev/tox.git@fcba59158f853c4da38f164dbf8523b1aeb0fedf#egg=tox +numpy==1.18.1 \ No newline at end of file diff --git a/python/testData/requirement/generation/keepEditableFromVCS/requirements.txt b/python/testData/requirement/generation/keepEditableFromVCS/requirements.txt new file mode 100644 index 000000000000..31c1f814e50c --- /dev/null +++ b/python/testData/requirement/generation/keepEditableFromVCS/requirements.txt @@ -0,0 +1,2 @@ +Django +-e git+https://github.com/tox-dev/tox.git@fcba59158f853c4da38f164dbf8523b1aeb0fedf#egg=tox \ No newline at end of file diff --git a/python/testData/requirement/generation/keepFileInstallOptions/main.py b/python/testData/requirement/generation/keepFileInstallOptions/main.py new file mode 100644 index 000000000000..c2214c96eca8 --- /dev/null +++ b/python/testData/requirement/generation/keepFileInstallOptions/main.py @@ -0,0 +1,2 @@ +import requests +import cookiecutter \ No newline at end of file diff --git a/python/testData/requirement/generation/keepFileInstallOptions/new_requirements.txt b/python/testData/requirement/generation/keepFileInstallOptions/new_requirements.txt new file mode 100644 index 000000000000..789f65d6cc24 --- /dev/null +++ b/python/testData/requirement/generation/keepFileInstallOptions/new_requirements.txt @@ -0,0 +1,5 @@ +--no-index +--find-links http://some.archives.com/archives +requests==2.22.0 +--no-binary +cookiecutter==1.7.0 \ No newline at end of file diff --git a/python/testData/requirement/generation/keepFileInstallOptions/requirements.txt b/python/testData/requirement/generation/keepFileInstallOptions/requirements.txt new file mode 100644 index 000000000000..5647f937599f --- /dev/null +++ b/python/testData/requirement/generation/keepFileInstallOptions/requirements.txt @@ -0,0 +1,4 @@ +--no-index +--find-links http://some.archives.com/archives +requests +--no-binary \ No newline at end of file diff --git a/python/testData/requirement/generation/keepMatchingVersion/main.py b/python/testData/requirement/generation/keepMatchingVersion/main.py new file mode 100644 index 000000000000..50f08891336f --- /dev/null +++ b/python/testData/requirement/generation/keepMatchingVersion/main.py @@ -0,0 +1,3 @@ +import django +import numpy +import requests \ No newline at end of file diff --git a/python/testData/requirement/generation/keepMatchingVersion/new_requirements.txt b/python/testData/requirement/generation/keepMatchingVersion/new_requirements.txt new file mode 100644 index 000000000000..5d6b20d8bfef --- /dev/null +++ b/python/testData/requirement/generation/keepMatchingVersion/new_requirements.txt @@ -0,0 +1,3 @@ +requests>=2.1.0 +Django==3.0.0 +numpy==1.18.1 \ No newline at end of file diff --git a/python/testData/requirement/generation/keepMatchingVersion/requirements.txt b/python/testData/requirement/generation/keepMatchingVersion/requirements.txt new file mode 100644 index 000000000000..baa47de17e85 --- /dev/null +++ b/python/testData/requirement/generation/keepMatchingVersion/requirements.txt @@ -0,0 +1 @@ +requests>=2.1.0 diff --git a/python/testData/requirement/generation/keepPackageInstallOptions/main.py b/python/testData/requirement/generation/keepPackageInstallOptions/main.py new file mode 100644 index 000000000000..c2214c96eca8 --- /dev/null +++ b/python/testData/requirement/generation/keepPackageInstallOptions/main.py @@ -0,0 +1,2 @@ +import requests +import cookiecutter \ No newline at end of file diff --git a/python/testData/requirement/generation/keepPackageInstallOptions/new_requirements.txt b/python/testData/requirement/generation/keepPackageInstallOptions/new_requirements.txt new file mode 100644 index 000000000000..f794474b4f23 --- /dev/null +++ b/python/testData/requirement/generation/keepPackageInstallOptions/new_requirements.txt @@ -0,0 +1,4 @@ +requests==2.22.0 --global-option="--no-user-cfg" \ + --install-option="--prefix='/usr/local'" \ + --install-option="--no-compile" +cookiecutter==1.7.0 \ No newline at end of file diff --git a/python/testData/requirement/generation/keepPackageInstallOptions/requirements.txt b/python/testData/requirement/generation/keepPackageInstallOptions/requirements.txt new file mode 100644 index 000000000000..88436f0f0383 --- /dev/null +++ b/python/testData/requirement/generation/keepPackageInstallOptions/requirements.txt @@ -0,0 +1,3 @@ +requests==2.22.0 --global-option="--no-user-cfg" \ + --install-option="--prefix='/usr/local'" \ + --install-option="--no-compile" \ No newline at end of file diff --git a/python/testData/requirement/generation/newFileGeneration/main.py b/python/testData/requirement/generation/newFileGeneration/main.py new file mode 100644 index 000000000000..2e75770b92a6 --- /dev/null +++ b/python/testData/requirement/generation/newFileGeneration/main.py @@ -0,0 +1,2 @@ +from django import apps +import requests \ No newline at end of file diff --git a/python/testData/requirement/generation/newFileGeneration/new_requirements.txt b/python/testData/requirement/generation/newFileGeneration/new_requirements.txt new file mode 100644 index 000000000000..6ea12c82b79e --- /dev/null +++ b/python/testData/requirement/generation/newFileGeneration/new_requirements.txt @@ -0,0 +1,2 @@ +requests==2.22.0 +Django==3.0.0 \ No newline at end of file diff --git a/python/testData/requirement/generation/newFileGeneration/requirements.txt b/python/testData/requirement/generation/newFileGeneration/requirements.txt new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/testData/requirement/generation/newFileWithoutVersion/main.py b/python/testData/requirement/generation/newFileWithoutVersion/main.py new file mode 100644 index 000000000000..b3953b05174f --- /dev/null +++ b/python/testData/requirement/generation/newFileWithoutVersion/main.py @@ -0,0 +1,5 @@ +import django +import requests +import Jinja2 +import pandas +import cookiecutter \ No newline at end of file diff --git a/python/testData/requirement/generation/newFileWithoutVersion/new_requirements.txt b/python/testData/requirement/generation/newFileWithoutVersion/new_requirements.txt new file mode 100644 index 000000000000..c8ab6b25e7d9 --- /dev/null +++ b/python/testData/requirement/generation/newFileWithoutVersion/new_requirements.txt @@ -0,0 +1,5 @@ +Django +requests +Jinja2 +pandas +cookiecutter \ No newline at end of file diff --git a/python/testData/requirement/generation/newFileWithoutVersion/requirements.txt b/python/testData/requirement/generation/newFileWithoutVersion/requirements.txt new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/testData/requirement/generation/redundantFileReference/base_requirements.txt b/python/testData/requirement/generation/redundantFileReference/base_requirements.txt new file mode 100644 index 000000000000..1cbab5ac2e79 --- /dev/null +++ b/python/testData/requirement/generation/redundantFileReference/base_requirements.txt @@ -0,0 +1,4 @@ +# these packages are not used in the project +requests==2.22.0 +Django>=3.0.0 +numpy \ No newline at end of file diff --git a/python/testData/requirement/generation/redundantFileReference/main.py b/python/testData/requirement/generation/redundantFileReference/main.py new file mode 100644 index 000000000000..8d0d3cf8f4ed --- /dev/null +++ b/python/testData/requirement/generation/redundantFileReference/main.py @@ -0,0 +1 @@ +import cookiecutter \ No newline at end of file diff --git a/python/testData/requirement/generation/redundantFileReference/new_requirements.txt b/python/testData/requirement/generation/redundantFileReference/new_requirements.txt new file mode 100644 index 000000000000..91a5d45bab0a --- /dev/null +++ b/python/testData/requirement/generation/redundantFileReference/new_requirements.txt @@ -0,0 +1 @@ +cookiecutter==1.7.0 \ No newline at end of file diff --git a/python/testData/requirement/generation/redundantFileReference/requirements.txt b/python/testData/requirement/generation/redundantFileReference/requirements.txt new file mode 100644 index 000000000000..06b67ffa3bbd --- /dev/null +++ b/python/testData/requirement/generation/redundantFileReference/requirements.txt @@ -0,0 +1 @@ +-r base_requirements.txt \ No newline at end of file diff --git a/python/testData/requirement/generation/removeUnused/main.py b/python/testData/requirement/generation/removeUnused/main.py new file mode 100644 index 000000000000..8ea9f3a22b3c --- /dev/null +++ b/python/testData/requirement/generation/removeUnused/main.py @@ -0,0 +1 @@ +import requests \ No newline at end of file diff --git a/python/testData/requirement/generation/removeUnused/new_requirements.txt b/python/testData/requirement/generation/removeUnused/new_requirements.txt new file mode 100644 index 000000000000..e20605c43d4a --- /dev/null +++ b/python/testData/requirement/generation/removeUnused/new_requirements.txt @@ -0,0 +1 @@ +requests==2.22.0 \ No newline at end of file diff --git a/python/testData/requirement/generation/removeUnused/requirements.txt b/python/testData/requirement/generation/removeUnused/requirements.txt new file mode 100644 index 000000000000..d7799a1323bc --- /dev/null +++ b/python/testData/requirement/generation/removeUnused/requirements.txt @@ -0,0 +1,4 @@ +python-dateutil==2.8.1 +requests==2.22.0 +six==1.14.0 +toml==0.10.0 \ No newline at end of file diff --git a/python/testData/requirement/generation/stripVersion/main.py b/python/testData/requirement/generation/stripVersion/main.py new file mode 100644 index 000000000000..b3953b05174f --- /dev/null +++ b/python/testData/requirement/generation/stripVersion/main.py @@ -0,0 +1,5 @@ +import django +import requests +import Jinja2 +import pandas +import cookiecutter \ No newline at end of file diff --git a/python/testData/requirement/generation/stripVersion/new_requirements.txt b/python/testData/requirement/generation/stripVersion/new_requirements.txt new file mode 100644 index 000000000000..c8ab6b25e7d9 --- /dev/null +++ b/python/testData/requirement/generation/stripVersion/new_requirements.txt @@ -0,0 +1,5 @@ +Django +requests +Jinja2 +pandas +cookiecutter \ No newline at end of file diff --git a/python/testData/requirement/generation/stripVersion/requirements.txt b/python/testData/requirement/generation/stripVersion/requirements.txt new file mode 100644 index 000000000000..f7db072d5494 --- /dev/null +++ b/python/testData/requirement/generation/stripVersion/requirements.txt @@ -0,0 +1,5 @@ +Django==3.0.0 +requests==2.22.0 +Jinja2==2.11.1 +pandas==1.0.1 +cookiecutter==1.7.0 \ No newline at end of file diff --git a/python/testData/requirement/generation/unhandledLine/main.py b/python/testData/requirement/generation/unhandledLine/main.py new file mode 100644 index 000000000000..7e8ed01b25f2 --- /dev/null +++ b/python/testData/requirement/generation/unhandledLine/main.py @@ -0,0 +1,2 @@ +import django +import requests \ No newline at end of file diff --git a/python/testData/requirement/generation/unhandledLine/requirements.txt b/python/testData/requirement/generation/unhandledLine/requirements.txt new file mode 100644 index 000000000000..6a7a0b137cae --- /dev/null +++ b/python/testData/requirement/generation/unhandledLine/requirements.txt @@ -0,0 +1,2 @@ +Django +-e /some/locations/we/dont/know \ No newline at end of file diff --git a/python/testData/requirement/generation/updateVersionKeepInstallOptions/main.py b/python/testData/requirement/generation/updateVersionKeepInstallOptions/main.py new file mode 100644 index 000000000000..7e8ed01b25f2 --- /dev/null +++ b/python/testData/requirement/generation/updateVersionKeepInstallOptions/main.py @@ -0,0 +1,2 @@ +import django +import requests \ No newline at end of file diff --git a/python/testData/requirement/generation/updateVersionKeepInstallOptions/new_requirements.txt b/python/testData/requirement/generation/updateVersionKeepInstallOptions/new_requirements.txt new file mode 100644 index 000000000000..ca473064fe64 --- /dev/null +++ b/python/testData/requirement/generation/updateVersionKeepInstallOptions/new_requirements.txt @@ -0,0 +1,4 @@ +Django==3.0.0 +requests==2.22.0 --global-option="--no-user-cfg"\ + --install-option="--prefix='/usr/local'"\ + --install-option="--no-compile" \ No newline at end of file diff --git a/python/testData/requirement/generation/updateVersionKeepInstallOptions/requirements.txt b/python/testData/requirement/generation/updateVersionKeepInstallOptions/requirements.txt new file mode 100644 index 000000000000..ff6d195fcafa --- /dev/null +++ b/python/testData/requirement/generation/updateVersionKeepInstallOptions/requirements.txt @@ -0,0 +1,4 @@ +Django==2.0.0 +requests==1.11.0 --global-option="--no-user-cfg" \ + --install-option="--prefix='/usr/local'" \ + --install-option="--no-compile" \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/packaging/PyRequirementsGenerationTest.kt b/python/testSrc/com/jetbrains/python/packaging/PyRequirementsGenerationTest.kt new file mode 100644 index 000000000000..88c42a643d44 --- /dev/null +++ b/python/testSrc/com/jetbrains/python/packaging/PyRequirementsGenerationTest.kt @@ -0,0 +1,114 @@ +// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package com.jetbrains.python.packaging + +import com.intellij.openapi.application.ApplicationManager +import com.intellij.openapi.project.Project +import com.intellij.openapi.projectRoots.Sdk +import com.intellij.testFramework.registerServiceInstance +import com.jetbrains.python.fixtures.PyTestCase +import org.easymock.EasyMock + +class PyRequirementsGenerationTest : PyTestCase() { + + var oldPackageManagers: PyPackageManagers? = null + + fun testNewFileGeneration() = doTest() + fun testNewFileWithoutVersion() = doTest(PyRequirementsVersionSpecifierType.NO_VERSION) + fun testAddMissingPackages() = doTest() + fun testAddMissingVersion() = doTest() + fun testStripVersion() = doTest(PyRequirementsVersionSpecifierType.NO_VERSION) + fun testAddVersionWithSpecifier() = doTest(PyRequirementsVersionSpecifierType.COMPATIBLE) + fun testKeepComments() = doTest() + fun testKeepMatchingVersion() = doTest() + fun testKeepFileInstallOptions() = doTest() + fun testKeepPackageInstallOptions() = doTest() + fun testKeepEditableFromVCS() = doTest() + fun testKeepEditableForSelf() = doTest() + fun testRemoveUnused() = doTest() + fun testUpdateVersionKeepInstallOptions() = doTest() + fun testCompatibleFileReference() = doTest() + fun testRedundantFileReference() = doTest() + fun testIncompatibleFileReference() = doTest() + fun testUnhandledLine() = doTest { (lines, unhandled, _) -> + assertSize(2, lines) + assertContainsElements(lines, "Django==3.0.0", "requests==2.22.0") + assertSize(1, unhandled) + assertContainsElements(unhandled, "-e /some/locations/we/dont/know") + } + + + private fun doTest(versionSpecifier: PyRequirementsVersionSpecifierType = PyRequirementsVersionSpecifierType.STRONG_EQ, + block: ((PyRequirementsAnalysisResult) -> Unit)? = null) { + val settings = PyPackageRequirementsSettings.getInstance(myFixture.module) + val oldRequirementsPath = settings.requirementsPath + val oldVersionSpecifier = settings.versionSpecifier + + try { + overrideInstalledPackages( + "Django" to "3.0.0", + "requests" to "2.22.0", + "Jinja2" to "2.11.1", + "pandas" to "1.0.1" , + "cookiecutter" to "1.7.0", + "numpy" to "1.18.1", + "tox" to "3.14.4" + ) + + settings.requirementsPath = "requirements.txt" + settings.versionSpecifier = versionSpecifier + + val testName = getTestName(true) + myFixture.copyDirectoryToProject(testName, "") + myFixture.configureFromTempProjectFile(settings.requirementsPath) + if (block != null) { + block(prepareRequirementsText(myFixture.module, settings)!!) + } + else { + syncWithImports(myFixture.module) + myFixture.checkResultByFile("$testName/new_${settings.requirementsPath}") + } + } + finally { + settings.requirementsPath = oldRequirementsPath + settings.versionSpecifier = oldVersionSpecifier + } + } + + override fun setUp() { + super.setUp() + oldPackageManagers = PyPackageManagers.getInstance() + } + + override fun tearDown() { + try { + ApplicationManager.getApplication().registerServiceInstance(PyPackageManagers::class.java, oldPackageManagers!!) + } + catch (e: Throwable) { + addSuppressedException(e) + } + finally { + super.tearDown() + } + } + + override fun getTestDataPath(): String = super.getTestDataPath() + "/requirement/generation" + + private fun overrideInstalledPackages(vararg packages: Pair) { + ApplicationManager.getApplication().registerServiceInstance(PyPackageManagers::class.java, MockPyPackageManagers(packages.toMap())) + } + + private class MockPyPackageManagers(val packages: Map) : PyPackageManagers() { + override fun forSdk(sdk: Sdk): PyPackageManager { + val packageManager = EasyMock.createMock(PyPackageManager::class.java) + EasyMock + .expect(packageManager.packages) + .andReturn(packages.map { PyPackage(it.key, it.value, null, emptyList()) }) + + EasyMock.replay(packageManager) + return packageManager + } + + override fun getManagementService(project: Project?, sdk: Sdk?) = throw UnsupportedOperationException() + override fun clearCache(sdk: Sdk): Unit = throw UnsupportedOperationException() + } +} \ No newline at end of file