Add PyPackageUtil tests for setup.py/requirements.txt util method

This commit is contained in:
Semyon Proshev
2016-06-11 14:30:24 +03:00
parent 69926e7fe1
commit 9413efec7b
14 changed files with 276 additions and 0 deletions
@@ -0,0 +1 @@
print("abc")
@@ -0,0 +1 @@
print("abc")
@@ -0,0 +1 @@
from distutils.core import setup
@@ -0,0 +1 @@
from distutils.core import setup
@@ -0,0 +1 @@
print("abc")
@@ -0,0 +1,4 @@
from distutils.core import setup
setup(name='foo',
version=0.1)
@@ -0,0 +1 @@
print("abc")
@@ -0,0 +1,12 @@
from distutils.core import setup
tests_require = [
'mynose'
]
setup(name='foo',
version=0.1,
tests_require=tests_require,
setup_requires=[
'numpy'
])
@@ -0,0 +1,4 @@
Markdown
NewDjango==1.3.1
numpy
mynose
@@ -0,0 +1,3 @@
NewDjango==1.3.1
numpy
mynose
@@ -0,0 +1,18 @@
from distutils.core import setup
tests_require = [
'mynose'
]
setup(name='foo',
version=0.1,
requires=[
'Markdown',
],
install_requires=[
'NewDjango==1.3.1',
],
tests_require=tests_require,
setup_requires=[
'numpy'
])
@@ -0,0 +1,12 @@
from setuptools import setup
tests_require = [
'mynose'
]
setup(name='foo',
version=0.1,
tests_require=tests_require,
setup_requires=[
'numpy'
])
@@ -0,0 +1,217 @@
/*
* Copyright 2000-2016 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.jetbrains.python.packaging;
import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.openapi.module.Module;
import com.jetbrains.python.fixtures.PyTestCase;
import com.jetbrains.python.psi.LanguageLevel;
import com.jetbrains.python.psi.PyCallExpression;
import com.jetbrains.python.psi.PyExpression;
import com.jetbrains.python.psi.PyFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.List;
public class PyPackageUtilTest extends PyTestCase {
@Override
protected void setUp() throws Exception {
super.setUp();
myFixture.copyDirectoryToProject("packaging/PyPackageUtil/" + getTestName(false), "");
}
public void testAbsentSetupPyReading() {
doTestSetupPyReading(false, false, false);
}
public void testAbsentSetupCallReading() {
doTestSetupPyReading(true, false, false);
}
public void testAbsentSetupPyRequiresReading() {
doTestSetupPyReading(true, true, false);
}
public void testSetupPyReading() {
doTestSetupPyReading(true, true, true);
}
public void testAbsentRequirementsTxtReading() {
doTestRequirementsTxtReading(false, false);
}
public void testEmptyRequirementsTxtReading() {
doTestRequirementsTxtReading(true, false);
}
public void testRequirementsTxtReading() {
doTestRequirementsTxtReading(true, true);
}
public void testAbsentSetupPyUpdating() {
doTestUselessRequirementsTxtOrSetupPyUpdating(false);
}
public void testAbsentSetupCallUpdating() {
doTestUselessRequirementsTxtOrSetupPyUpdating(false);
}
public void testDistutilsSetupPyUpdating() {
doTestSetupPyUpdating("requires");
}
public void testSetuptoolsSetupPyUpdating() {
doTestSetupPyUpdating("install_requires");
}
public void testAbsentRequirementsTxtUpdating() {
doTestUselessRequirementsTxtOrSetupPyUpdating(true);
}
public void testRequirementsTxtUpdating() {
final Module module = myFixture.getModule();
checkRequirements(PyPackageUtil.getRequirementsFromTxt(module), 1);
WriteCommandAction.runWriteCommandAction(myFixture.getProject(),
() -> PyPackageUtil.addRequirementToTxtOrSetupPy(module, "Markdown", LanguageLevel.PYTHON30));
checkRequirements(PyPackageUtil.getRequirementsFromTxt(module));
}
private void doTestSetupPyReading(boolean hasFile, boolean hasCall, boolean requires) {
final Module module = myFixture.getModule();
if (hasFile) {
assertTrue(PyPackageUtil.hasSetupPy(module));
final PyFile setupPy = PyPackageUtil.findSetupPy(module);
assertNotNull(setupPy);
if (hasCall) {
final PyCallExpression callByModule = PyPackageUtil.findSetupCall(module);
final PyCallExpression callByFile = PyPackageUtil.findSetupCall(setupPy);
assertNotNull(callByModule);
assertNotNull(callByFile);
assertSame(callByFile, callByModule);
if (requires) {
checkRequirements(PyPackageUtil.findSetupPyRequires(module));
}
else {
final List<PyRequirement> requirements = PyPackageUtil.findSetupPyRequires(module);
assertNotNull(requirements);
assertEmpty(requirements);
}
}
else {
assertNull(PyPackageUtil.findSetupCall(module));
assertNull(PyPackageUtil.findSetupCall(setupPy));
assertNull(PyPackageUtil.findSetupPyRequires(module));
}
}
else {
assertFalse(PyPackageUtil.hasSetupPy(module));
assertNull(PyPackageUtil.findSetupPy(module));
assertNull(PyPackageUtil.findSetupCall(module));
assertNull(PyPackageUtil.findSetupPyRequires(module));
}
}
private void doTestRequirementsTxtReading(boolean hasFile, boolean hasRequirements) {
final Module module = myFixture.getModule();
if (hasFile) {
assertTrue(PyPackageUtil.hasRequirementsTxt(module));
assertNotNull(PyPackageUtil.findRequirementsTxt(module));
if (hasRequirements) {
checkRequirements(PyPackageUtil.getRequirementsFromTxt(module));
}
else {
final List<PyRequirement> requirements = PyPackageUtil.getRequirementsFromTxt(module);
assertNotNull(requirements);
assertEmpty(requirements);
}
}
else {
assertFalse(PyPackageUtil.hasRequirementsTxt(module));
assertNull(PyPackageUtil.findRequirementsTxt(module));
assertNull(PyPackageUtil.getRequirementsFromTxt(module));
}
}
private void doTestUselessRequirementsTxtOrSetupPyUpdating(boolean isRequirementsTxt) {
final Module module = myFixture.getModule();
assertNull(isRequirementsTxt ? PyPackageUtil.getRequirementsFromTxt(module) : PyPackageUtil.findSetupPyRequires(module));
WriteCommandAction.runWriteCommandAction(myFixture.getProject(),
() -> PyPackageUtil.addRequirementToTxtOrSetupPy(module, "Markdown", LanguageLevel.PYTHON30));
assertNull(isRequirementsTxt ? PyPackageUtil.getRequirementsFromTxt(module) : PyPackageUtil.findSetupPyRequires(module));
}
private static void checkRequirements(@Nullable List<PyRequirement> actual) {
checkRequirements(actual, 0);
}
private static void checkRequirements(@Nullable List<PyRequirement> actual, int fromIndex) {
final List<PyRequirement> expected = PyRequirement.fromText("Markdown\nNewDjango==1.3.1\nnumpy\nmynose");
assertEquals(expected.subList(fromIndex, expected.size()), actual);
}
private void doTestSetupPyUpdating(@NotNull String keyword) {
final Module module = myFixture.getModule();
checkSetupArgumentText(module, keyword, null);
checkRequirements(PyPackageUtil.findSetupPyRequires(module), 2);
final Runnable introduceRequires = () -> PyPackageUtil.addRequirementToTxtOrSetupPy(module, "NewDjango==1.3.1", LanguageLevel.PYTHON30);
WriteCommandAction.runWriteCommandAction(myFixture.getProject(), introduceRequires);
checkSetupArgumentText(module, keyword, "['NewDjango==1.3.1']");
checkRequirements(PyPackageUtil.findSetupPyRequires(module), 1);
final Runnable updateRequires = () -> PyPackageUtil.addRequirementToTxtOrSetupPy(module, "Markdown", LanguageLevel.PYTHON30);
WriteCommandAction.runWriteCommandAction(myFixture.getProject(), updateRequires);
checkSetupArgumentText(module, keyword, "['NewDjango==1.3.1', 'Markdown']");
final List<PyRequirement> actual = PyPackageUtil.findSetupPyRequires(module);
final List<PyRequirement> expected = PyRequirement.fromText("NewDjango==1.3.1\nMarkdown\nnumpy\nmynose");
assertEquals(expected, actual);
}
private static void checkSetupArgumentText(@NotNull Module module, @NotNull String keyword, @Nullable String text) {
final PyCallExpression setupCall = PyPackageUtil.findSetupCall(module);
assertNotNull(setupCall);
final PyExpression argument = setupCall.getKeywordArgument(keyword);
if (text == null) {
assertNull(argument);
}
else {
assertNotNull(argument);
assertEquals(text, argument.getText());
}
}
}