From 5cc260e715fbaf33d01e94a3eeb7fb477b0c2de1 Mon Sep 17 00:00:00 2001 From: Andrey Vlasovskikh Date: Sat, 5 May 2012 17:14:35 +0400 Subject: [PATCH 01/11] Select any named element for move refactoring, not only scope owner (PY-6461) --- .../refactoring/move/PyMoveClassOrFunctionDelegate.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/python/src/com/jetbrains/python/refactoring/move/PyMoveClassOrFunctionDelegate.java b/python/src/com/jetbrains/python/refactoring/move/PyMoveClassOrFunctionDelegate.java index b21f4f5dca71..21306cec92f3 100644 --- a/python/src/com/jetbrains/python/refactoring/move/PyMoveClassOrFunctionDelegate.java +++ b/python/src/com/jetbrains/python/refactoring/move/PyMoveClassOrFunctionDelegate.java @@ -14,8 +14,6 @@ import com.intellij.refactoring.move.MoveHandlerDelegate; import com.intellij.refactoring.util.CommonRefactoringUtil; import com.intellij.util.IncorrectOperationException; import com.jetbrains.python.PyBundle; -import com.jetbrains.python.codeInsight.controlflow.ScopeOwner; -import com.jetbrains.python.codeInsight.dataflow.scope.ScopeUtil; import com.jetbrains.python.psi.PyClass; import com.jetbrains.python.psi.PyFunction; import com.jetbrains.python.psi.impl.PyPsiUtils; @@ -91,7 +89,9 @@ public class PyMoveClassOrFunctionDelegate extends MoveHandlerDelegate { @Nullable public static PsiNamedElement getElementToMove(@NotNull PsiElement element) { - final ScopeOwner owner = (element instanceof ScopeOwner) ? (ScopeOwner)element : ScopeUtil.getScopeOwner(element); - return (owner instanceof PsiNamedElement) ? (PsiNamedElement)owner : null; + if (element instanceof PsiNamedElement) { + return (PsiNamedElement)element; + } + return null; } } From 5be873028439ba4eaa081f19f8cb0fb53ac8ba27 Mon Sep 17 00:00:00 2001 From: Andrey Vlasovskikh Date: Sat, 5 May 2012 17:40:18 +0400 Subject: [PATCH 02/11] Fixed inserting imports for usages of the moved element from the same file (PY-6465) --- .../classes/PyClassRefactoringUtil.java | 15 ++++++++++++--- .../move/usageFromFunction/after/src/a.py | 3 +++ .../move/usageFromFunction/after/src/b.py | 4 ++++ .../move/usageFromFunction/before/src/a.py | 5 +++++ .../move/usageFromFunction/before/src/b.py | 0 .../jetbrains/python/refactoring/PyMoveTest.java | 5 +++++ 6 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 python/testData/refactoring/move/usageFromFunction/after/src/a.py create mode 100644 python/testData/refactoring/move/usageFromFunction/after/src/b.py create mode 100644 python/testData/refactoring/move/usageFromFunction/before/src/a.py create mode 100644 python/testData/refactoring/move/usageFromFunction/before/src/b.py diff --git a/python/src/com/jetbrains/python/refactoring/classes/PyClassRefactoringUtil.java b/python/src/com/jetbrains/python/refactoring/classes/PyClassRefactoringUtil.java index 9eb673d9bee5..8f4c5cd8787f 100644 --- a/python/src/com/jetbrains/python/refactoring/classes/PyClassRefactoringUtil.java +++ b/python/src/com/jetbrains/python/refactoring/classes/PyClassRefactoringUtil.java @@ -267,7 +267,7 @@ public class PyClassRefactoringUtil { } } - public static void rememberNamedReferences(final PsiElement element) { + public static void rememberNamedReferences(@NotNull final PsiElement element) { element.acceptChildren(new PyRecursiveElementVisitor() { @Override public void visitPyReferenceExpression(PyReferenceExpression node) { @@ -284,7 +284,7 @@ public class PyClassRefactoringUtil { }); } - private static void rememberReference(PyReferenceExpression node, PsiElement element) { + private static void rememberReference(@NotNull PyReferenceExpression node, @NotNull PsiElement element) { // We will remember reference in deepest node (except for references to PyImportedModules, as we need references to modules, not to // their packages) final PyExpression qualifier = node.getQualifier(); @@ -294,7 +294,7 @@ public class PyClassRefactoringUtil { final PsiElement target = resolveExpression(node); if (target instanceof PsiNamedElement && !PsiTreeUtil.isAncestor(element, target, false)) { final PyImportElement importElement = getImportElement(node); - if (importElement == null && !(target instanceof PsiFileSystemItem)) { + if (!inSameFile(element, target) && importElement == null && !(target instanceof PsiFileSystemItem)) { return; } node.putCopyableUserData(ENCODED_IMPORT, (PsiNamedElement)target); @@ -305,6 +305,15 @@ public class PyClassRefactoringUtil { } } + private static boolean inSameFile(@NotNull PsiElement e1, @NotNull PsiElement e2) { + final PsiFile f1 = e1.getContainingFile(); + final PsiFile f2 = e2.getContainingFile(); + if (f1 == null || f2 == null) { + return false; + } + return f1 == f2; + } + @Nullable private static PyImportElement getImportElement(PyReferenceExpression expr) { for (ResolveResult result : expr.getReference().multiResolve(false)) { diff --git a/python/testData/refactoring/move/usageFromFunction/after/src/a.py b/python/testData/refactoring/move/usageFromFunction/after/src/a.py new file mode 100644 index 000000000000..2f5efc6775c9 --- /dev/null +++ b/python/testData/refactoring/move/usageFromFunction/after/src/a.py @@ -0,0 +1,3 @@ +def f(): + pass + diff --git a/python/testData/refactoring/move/usageFromFunction/after/src/b.py b/python/testData/refactoring/move/usageFromFunction/after/src/b.py new file mode 100644 index 000000000000..a257b2fe1e82 --- /dev/null +++ b/python/testData/refactoring/move/usageFromFunction/after/src/b.py @@ -0,0 +1,4 @@ +from a import f + +def use_f(): + f() \ No newline at end of file diff --git a/python/testData/refactoring/move/usageFromFunction/before/src/a.py b/python/testData/refactoring/move/usageFromFunction/before/src/a.py new file mode 100644 index 000000000000..090074d4370b --- /dev/null +++ b/python/testData/refactoring/move/usageFromFunction/before/src/a.py @@ -0,0 +1,5 @@ +def f(): + pass + +def use_f(): + f() \ No newline at end of file diff --git a/python/testData/refactoring/move/usageFromFunction/before/src/b.py b/python/testData/refactoring/move/usageFromFunction/before/src/b.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/testSrc/com/jetbrains/python/refactoring/PyMoveTest.java b/python/testSrc/com/jetbrains/python/refactoring/PyMoveTest.java index ee65adf24617..156e209e748c 100644 --- a/python/testSrc/com/jetbrains/python/refactoring/PyMoveTest.java +++ b/python/testSrc/com/jetbrains/python/refactoring/PyMoveTest.java @@ -110,6 +110,11 @@ public class PyMoveTest extends PyTestCase { doMoveSymbolTest("f", "b.py"); } + // PY-6465 + public void testUsageFromFunction() { + doMoveSymbolTest("use_f", "b.py"); + } + private void doMoveFileTest(String fileName, String toDirName) { Project project = myFixture.getProject(); PsiManager manager = PsiManager.getInstance(project); From edab40f2fd723cce631c277fd51e761152cbc3ee Mon Sep 17 00:00:00 2001 From: Andrey Vlasovskikh Date: Sat, 5 May 2012 18:25:41 +0400 Subject: [PATCH 03/11] Fixed updates of qualified references to modules in move module refactoring (PY-6466) --- .../python/refactoring/move/PyMoveFileHandler.java | 11 ++++++++--- .../testData/refactoring/move/module/after/src/a.py | 4 +++- .../move/moduleToNonPackage/after/src/a.py | 3 ++- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/python/src/com/jetbrains/python/refactoring/move/PyMoveFileHandler.java b/python/src/com/jetbrains/python/refactoring/move/PyMoveFileHandler.java index 4940f0018a5b..ef081d2ba79c 100644 --- a/python/src/com/jetbrains/python/refactoring/move/PyMoveFileHandler.java +++ b/python/src/com/jetbrains/python/refactoring/move/PyMoveFileHandler.java @@ -85,9 +85,14 @@ public class PyMoveFileHandler extends MoveFileHandler { } else if (element instanceof PyReferenceExpression) { updatedFiles.add(file); - final PyQualifiedName newElementName = PyQualifiedName.fromComponents(PyClassRefactoringUtil.getOriginalName(newElement)); - replaceWithQualifiedExpression(element, newElementName); - PyClassRefactoringUtil.insertImport(element, newElement, null); + if (((PyReferenceExpression)element).getQualifier() != null) { + final PyQualifiedName newQualifiedName = ResolveImportUtil.findCanonicalImportPath(newElement, element); + replaceWithQualifiedExpression(element, newQualifiedName); + } else { + final PyQualifiedName newName = PyQualifiedName.fromComponents(PyClassRefactoringUtil.getOriginalName(newElement)); + replaceWithQualifiedExpression(element, newName); + PyClassRefactoringUtil.insertImport(element, newElement, null); + } } } } diff --git a/python/testData/refactoring/move/module/after/src/a.py b/python/testData/refactoring/move/module/after/src/a.py index 821e48bdf42b..37425aac803c 100644 --- a/python/testData/refactoring/move/module/after/src/a.py +++ b/python/testData/refactoring/move/module/after/src/a.py @@ -1,7 +1,9 @@ from p1 import m1 from p1.m1 import foo +import p1.m1 +import p1 -m1.foo +p1.m1.foo m1.bar m1 foo \ No newline at end of file diff --git a/python/testData/refactoring/move/moduleToNonPackage/after/src/a.py b/python/testData/refactoring/move/moduleToNonPackage/after/src/a.py index 6618ac3cb7ca..ca4143ce7442 100644 --- a/python/testData/refactoring/move/moduleToNonPackage/after/src/a.py +++ b/python/testData/refactoring/move/moduleToNonPackage/after/src/a.py @@ -1,7 +1,8 @@ from nonp3 import m1 from nonp3.m1 import foo +import nonp3.m1 -m1.foo +nonp3.m1.foo m1.bar m1 foo \ No newline at end of file From ccf9c56895dd737b4e808455985dfbfaa20026a9 Mon Sep 17 00:00:00 2001 From: Andrey Vlasovskikh Date: Sat, 5 May 2012 18:55:28 +0400 Subject: [PATCH 04/11] Replace element usage in move refactoring via element generator (PY-6464) --- .../refactoring/move/PyMoveClassOrFunctionProcessor.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/python/src/com/jetbrains/python/refactoring/move/PyMoveClassOrFunctionProcessor.java b/python/src/com/jetbrains/python/refactoring/move/PyMoveClassOrFunctionProcessor.java index 957fe1aabb26..5a25ccc02940 100644 --- a/python/src/com/jetbrains/python/refactoring/move/PyMoveClassOrFunctionProcessor.java +++ b/python/src/com/jetbrains/python/refactoring/move/PyMoveClassOrFunctionProcessor.java @@ -21,7 +21,6 @@ import com.jetbrains.python.codeInsight.imports.PyImportOptimizer; import com.jetbrains.python.documentation.DocStringTypeReference; import com.jetbrains.python.psi.*; import com.jetbrains.python.psi.impl.PyQualifiedName; -import com.jetbrains.python.psi.impl.PyReferenceExpressionImpl; import com.jetbrains.python.psi.resolve.ResolveImportUtil; import com.jetbrains.python.refactoring.PyRefactoringUtil; import com.jetbrains.python.refactoring.classes.PyClassRefactoringUtil; @@ -171,7 +170,9 @@ public class PyMoveClassOrFunctionProcessor extends BaseRefactoringProcessor { return; } if (expr.getQualifier() != null) { - final PsiElement newExpr = expr.replace(new PyReferenceExpressionImpl(expr.getNameElement())); + final PyElementGenerator generator = PyElementGenerator.getInstance(expr.getProject()); + final PyExpression generated = generator.createExpressionFromText(LanguageLevel.forElement(expr), expr.getName()); + final PsiElement newExpr = expr.replace(generated); PyClassRefactoringUtil.insertImport(newExpr, newElement, null, true); } } From 01282b79f973cad09db12d5ce86b751d34f68243 Mon Sep 17 00:00:00 2001 From: Andrey Vlasovskikh Date: Sat, 5 May 2012 19:09:28 +0400 Subject: [PATCH 05/11] Use single quotes for requirements added to 'requires=' kwarg (PY-5842) --- .../python/inspections/PyPackageRequirementsInspection.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/python/src/com/jetbrains/python/inspections/PyPackageRequirementsInspection.java b/python/src/com/jetbrains/python/inspections/PyPackageRequirementsInspection.java index 88fa42a4c884..4eb97663b87c 100644 --- a/python/src/com/jetbrains/python/inspections/PyPackageRequirementsInspection.java +++ b/python/src/com/jetbrains/python/inspections/PyPackageRequirementsInspection.java @@ -434,8 +434,9 @@ public class PyPackageRequirementsInspection extends PyInspection { final PyElementGenerator generator = PyElementGenerator.getInstance(project); if (mySetupPyRequires != null) { if (mySetupPyRequires.getContainingFile().isWritable()) { - final PyStringLiteralExpression literal = generator.createStringLiteralFromString(myPackageName); - mySetupPyRequires.add(literal); + final String text = String.format("'%s'", myPackageName); + final PyExpression generated = generator.createExpressionFromText(myLanguageLevel, text); + mySetupPyRequires.add(generated); } } else if (mySetupArgumentList != null) { From a7f196900c5f66f8e61522a6ae750d4b059e885a Mon Sep 17 00:00:00 2001 From: Andrey Vlasovskikh Date: Sat, 5 May 2012 19:42:20 +0400 Subject: [PATCH 06/11] Get pip and distribute errors from packaging_tool.py as separate return codes (PY-6493) --- python/helpers/packaging_tool.py | 9 +++--- .../python/packaging/PyPackageManager.java | 3 +- .../python/packaging/ui/PyPackagesPanel.java | 31 ++++++++++++------- 3 files changed, 26 insertions(+), 17 deletions(-) diff --git a/python/helpers/packaging_tool.py b/python/helpers/packaging_tool.py index 566d8f71f02e..55fc766ac5fc 100644 --- a/python/helpers/packaging_tool.py +++ b/python/helpers/packaging_tool.py @@ -2,8 +2,9 @@ import sys import traceback ERROR_WRONG_USAGE = 1 -ERROR_NO_PACKAGING_TOOLS = 2 -ERROR_EXCEPTION = 3 +ERROR_NO_PIP = 2 +ERROR_NO_DISTRIBUTE = 3 +ERROR_EXCEPTION = 4 def exit(retcode): major, minor, micro, release, serial = sys.version_info @@ -28,14 +29,14 @@ def error(message, retcode): def error_no_pip(): - error("Python package management tool 'pip' not found. Install 'pip'", ERROR_NO_PACKAGING_TOOLS) + error("Python package management tool 'pip' not found", ERROR_NO_PIP) def do_list(): try: import pkg_resources except ImportError: - error("Python package management tools not found. Install 'distribute'", ERROR_NO_PACKAGING_TOOLS) + error("Python package management tool 'setuptools' or 'distribute' not found", ERROR_NO_DISTRIBUTE) for pkg in pkg_resources.working_set: requires = ':'.join([str(x) for x in pkg.requires()]) sys.stdout.write('\t'.join([pkg.project_name, pkg.version, pkg.location, requires])+chr(10)) diff --git a/python/src/com/jetbrains/python/packaging/PyPackageManager.java b/python/src/com/jetbrains/python/packaging/PyPackageManager.java index 69a45b068993..4026b271030e 100644 --- a/python/src/com/jetbrains/python/packaging/PyPackageManager.java +++ b/python/src/com/jetbrains/python/packaging/PyPackageManager.java @@ -51,7 +51,8 @@ import java.util.*; public class PyPackageManager { public static final int OK = 0; public static final int ERROR_WRONG_USAGE = 1; - public static final int ERROR_NO_PACKAGING_TOOLS = 2; + public static final int ERROR_NO_PIP = 2; + public static final int ERROR_NO_DISTRIBUTE = 3; public static final int ERROR_INVALID_SDK = -1; public static final int ERROR_TOOL_NOT_FOUND = -2; public static final int ERROR_TIMEOUT = -3; diff --git a/python/src/com/jetbrains/python/packaging/ui/PyPackagesPanel.java b/python/src/com/jetbrains/python/packaging/ui/PyPackagesPanel.java index f55814f7b955..21de33fcdbfc 100644 --- a/python/src/com/jetbrains/python/packaging/ui/PyPackagesPanel.java +++ b/python/src/com/jetbrains/python/packaging/ui/PyPackagesPanel.java @@ -8,7 +8,6 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.IconLoader; -import com.intellij.openapi.util.text.StringUtil; import com.intellij.ui.ScrollPaneFactory; import com.intellij.ui.table.JBTable; import com.intellij.util.Consumer; @@ -406,18 +405,26 @@ public class PyPackagesPanel extends JPanel { if (!invalid) { String text = null; if (externalProcessException != null) { - text = externalProcessException.getMessage(); - allowCreateVirtualEnv &= - externalProcessException.getRetcode() == PyPackageManager.ERROR_NO_PACKAGING_TOOLS; + final int retCode = externalProcessException.getRetcode(); + if (retCode == PyPackageManager.ERROR_NO_PIP) { + myHasPip = false; + } + else if (retCode == PyPackageManager.ERROR_NO_DISTRIBUTE) { + myHasDistribute = false; + } + else { + text = externalProcessException.getMessage(); + } + final boolean hasPackagingTools = myHasPip && myHasDistribute; + allowCreateVirtualEnv &= !hasPackagingTools; } - else if (!myHasDistribute) { - text = "Python package management tools not found. Install 'distribute'"; - } - else if (!myHasPip) { - text = "Python packaging tool 'pip' not found. Install 'pip'"; - } - if (StringUtil.isEmptyOrSpaces(text) && externalProcessException != null) { - text = "Python packaging tool 'pip' not found. Install 'pip'"; + if (text == null) { + if (!myHasDistribute) { + text = "Python package management tools not found. Install 'distribute'"; + } + else if (!myHasPip) { + text = "Python packaging tool 'pip' not found. Install 'pip'"; + } } if (text != null) { if (allowCreateVirtualEnv) { From 088ef9d681a7f4f27a33b61ac2251556929c4499 Mon Sep 17 00:00:00 2001 From: Andrey Vlasovskikh Date: Sat, 5 May 2012 20:24:56 +0400 Subject: [PATCH 07/11] 'datetime' binary module is called '_datetime' in Python 3 (PY-6473) --- python/helpers/generator3.py | 82 ++++++++++++++++------------- python/helpers/required_gen_version | 3 +- 2 files changed, 46 insertions(+), 39 deletions(-) diff --git a/python/helpers/generator3.py b/python/helpers/generator3.py index 6cab0bacac89..e4bddfdd63a7 100644 --- a/python/helpers/generator3.py +++ b/python/helpers/generator3.py @@ -24,7 +24,7 @@ but seemingly no one uses them in C extensions yet anyway. # * re.search-bound, ~30% time, in likes of builtins and _gtk with complex docstrings. # None of this can seemingly be easily helped. Maybe there's a simpler and faster parser library? -VERSION = "1.105" # Must be a number-dot-number string, updated with each change that affects generated skeletons +VERSION = "1.106" # Must be a number-dot-number string, updated with each change that affects generated skeletons # Note: DON'T FORGET TO UPDATE! VERSION_CONTROL_HEADER_FORMAT = '# from %s by generator %s' @@ -832,6 +832,12 @@ class ModuleRedeclarator(object): else: bin_collections_name = '_collections' # Win / Lin + if version[0] < 3: + datetime_mod = "datetime" + else: + datetime_mod = "_datetime" + + # NOTE: per-module signature data may be lazily imported # keyed by (module_name, class_name, method_name). PREDEFINED_BUILTIN_SIGS might be a layer of it. # value is ("signature", "return_literal") @@ -857,45 +863,45 @@ class ModuleRedeclarator(object): ("_struct", "Struct", "unpack"): ("(self, string)", None), ("_struct", "Struct", "unpack_from"): ("(self, buffer, offset=0)", None), - ("datetime", "date", "__new__"): ("(cls, year=None, month=None, day=None)", None), - ("datetime", "date", "fromordinal"): ("(cls, ordinal)", "date(1,1,1)"), - ("datetime", "date", "fromtimestamp"): ("(cls, timestamp)", "date(1,1,1)"), - ("datetime", "date", "isocalendar"): ("(self)", "(1, 1, 1)"), - ("datetime", "date", "isoformat"): ("(self)", DEFAULT_STR_LIT), - ("datetime", "date", "isoweekday"): ("(self)", INT_LIT), - ("datetime", "date", "replace"): ("(self, year=None, month=None, day=None)", "date(1,1,1)"), - ("datetime", "date", "strftime"): ("(self, format)", DEFAULT_STR_LIT), - ("datetime", "date", "timetuple"): ("(self)", "(0, 0, 0, 0, 0, 0, 0, 0, 0)"), - ("datetime", "date", "today"): ("(self)", "date(1, 1, 1)"), - ("datetime", "date", "toordinal"): ("(self)", INT_LIT), - ("datetime", "date", "weekday"): ("(self)", INT_LIT), - ("datetime", "timedelta", "__new__" + (datetime_mod, "date", "__new__"): ("(cls, year=None, month=None, day=None)", None), + (datetime_mod, "date", "fromordinal"): ("(cls, ordinal)", "date(1,1,1)"), + (datetime_mod, "date", "fromtimestamp"): ("(cls, timestamp)", "date(1,1,1)"), + (datetime_mod, "date", "isocalendar"): ("(self)", "(1, 1, 1)"), + (datetime_mod, "date", "isoformat"): ("(self)", DEFAULT_STR_LIT), + (datetime_mod, "date", "isoweekday"): ("(self)", INT_LIT), + (datetime_mod, "date", "replace"): ("(self, year=None, month=None, day=None)", "date(1,1,1)"), + (datetime_mod, "date", "strftime"): ("(self, format)", DEFAULT_STR_LIT), + (datetime_mod, "date", "timetuple"): ("(self)", "(0, 0, 0, 0, 0, 0, 0, 0, 0)"), + (datetime_mod, "date", "today"): ("(self)", "date(1, 1, 1)"), + (datetime_mod, "date", "toordinal"): ("(self)", INT_LIT), + (datetime_mod, "date", "weekday"): ("(self)", INT_LIT), + (datetime_mod, "timedelta", "__new__" ): ("(cls, days=None, seconds=None, microseconds=None, milliseconds=None, minutes=None, hours=None, weeks=None)", None), - ("datetime", "datetime", "__new__" + (datetime_mod, "datetime", "__new__" ): ("(cls, year=None, month=None, day=None, hour=None, minute=None, second=None, microsecond=None, tzinfo=None)", None), - ("datetime", "datetime", "astimezone"): ("(self, tz)", "datetime(1, 1, 1)"), - ("datetime", "datetime", "combine"): ("(cls, date, time)", "datetime(1, 1, 1)"), - ("datetime", "datetime", "date"): ("(self)", "datetime(1, 1, 1)"), - ("datetime", "datetime", "fromtimestamp"): ("(cls, timestamp, tz=None)", "datetime(1, 1, 1)"), - ("datetime", "datetime", "isoformat"): ("(self, sep='T')", DEFAULT_STR_LIT), - ("datetime", "datetime", "now"): ("(cls, tz=None)", "datetime(1, 1, 1)"), - ("datetime", "datetime", "strptime"): ("(cls, date_string, format)", DEFAULT_STR_LIT), - ("datetime", "datetime", "replace" ): + (datetime_mod, "datetime", "astimezone"): ("(self, tz)", "datetime(1, 1, 1)"), + (datetime_mod, "datetime", "combine"): ("(cls, date, time)", "datetime(1, 1, 1)"), + (datetime_mod, "datetime", "date"): ("(self)", "datetime(1, 1, 1)"), + (datetime_mod, "datetime", "fromtimestamp"): ("(cls, timestamp, tz=None)", "datetime(1, 1, 1)"), + (datetime_mod, "datetime", "isoformat"): ("(self, sep='T')", DEFAULT_STR_LIT), + (datetime_mod, "datetime", "now"): ("(cls, tz=None)", "datetime(1, 1, 1)"), + (datetime_mod, "datetime", "strptime"): ("(cls, date_string, format)", DEFAULT_STR_LIT), + (datetime_mod, "datetime", "replace" ): ("(self, year=None, month=None, day=None, hour=None, minute=None, second=None, microsecond=None, tzinfo=None)", "datetime(1, 1, 1)"), - ("datetime", "datetime", "time"): ("(self)", "time(0, 0)"), - ("datetime", "datetime", "timetuple"): ("(self)", "(0, 0, 0, 0, 0, 0, 0, 0, 0)"), - ("datetime", "datetime", "timetz"): ("(self)", "time(0, 0)"), - ("datetime", "datetime", "utcfromtimestamp"): ("(self, timestamp)", "datetime(1, 1, 1)"), - ("datetime", "datetime", "utcnow"): ("(cls)", "datetime(1, 1, 1)"), - ("datetime", "datetime", "utctimetuple"): ("(self)", "(0, 0, 0, 0, 0, 0, 0, 0, 0)"), - ("datetime", "time", "__new__"): ("(cls, hour=None, minute=None, second=None, microsecond=None, tzinfo=None)", None), - ("datetime", "time", "isoformat"): ("(self)", DEFAULT_STR_LIT), - ("datetime", "time", "replace"): ("(self, hour=None, minute=None, second=None, microsecond=None, tzinfo=None)", "time(0, 0)"), - ("datetime", "time", "strftime"): ("(self, format)", DEFAULT_STR_LIT), - ("datetime", "tzinfo", "dst"): ("(self, date_time)", INT_LIT), - ("datetime", "tzinfo", "fromutc"): ("(self, date_time)", "datetime(1, 1, 1)"), - ("datetime", "tzinfo", "tzname"): ("(self, date_time)", DEFAULT_STR_LIT), - ("datetime", "tzinfo", "utcoffset"): ("(self, date_time)", INT_LIT), + (datetime_mod, "datetime", "time"): ("(self)", "time(0, 0)"), + (datetime_mod, "datetime", "timetuple"): ("(self)", "(0, 0, 0, 0, 0, 0, 0, 0, 0)"), + (datetime_mod, "datetime", "timetz"): ("(self)", "time(0, 0)"), + (datetime_mod, "datetime", "utcfromtimestamp"): ("(self, timestamp)", "datetime(1, 1, 1)"), + (datetime_mod, "datetime", "utcnow"): ("(cls)", "datetime(1, 1, 1)"), + (datetime_mod, "datetime", "utctimetuple"): ("(self)", "(0, 0, 0, 0, 0, 0, 0, 0, 0)"), + (datetime_mod, "time", "__new__"): ("(cls, hour=None, minute=None, second=None, microsecond=None, tzinfo=None)", None), + (datetime_mod, "time", "isoformat"): ("(self)", DEFAULT_STR_LIT), + (datetime_mod, "time", "replace"): ("(self, hour=None, minute=None, second=None, microsecond=None, tzinfo=None)", "time(0, 0)"), + (datetime_mod, "time", "strftime"): ("(self, format)", DEFAULT_STR_LIT), + (datetime_mod, "tzinfo", "dst"): ("(self, date_time)", INT_LIT), + (datetime_mod, "tzinfo", "fromutc"): ("(self, date_time)", "datetime(1, 1, 1)"), + (datetime_mod, "tzinfo", "tzname"): ("(self, date_time)", DEFAULT_STR_LIT), + (datetime_mod, "tzinfo", "utcoffset"): ("(self, date_time)", INT_LIT), ("_io", None, "open"): ("(name, mode=None, buffering=None)", "file('/dev/null')"), ("_io", "FileIO", "read"): ("(self, size=-1)", DEFAULT_STR_LIT), @@ -1064,7 +1070,7 @@ class ModuleRedeclarator(object): ("Struct", "size"): ('r', G_INT), ("Struct", "format"): ('r', G_STR), }, - "datetime": { + datetime_mod: { ("datetime", "hour"): ('r', G_INT), ("datetime", "minute"): ('r', G_INT), ("datetime", "second"): ('r', G_INT), diff --git a/python/helpers/required_gen_version b/python/helpers/required_gen_version index 41cf1e9cf5ad..e8cfa76de1a4 100644 --- a/python/helpers/required_gen_version +++ b/python/helpers/required_gen_version @@ -6,7 +6,7 @@ (default) 1.92 # anything not explicitly marked -(built-in) 1.105 # skeletons of all built-in modules are built together +(built-in) 1.106 # skeletons of all built-in modules are built together # Note: modules like itertools, etc are "(built-in)" and are ignored if given separately _fileio 1.101 @@ -15,6 +15,7 @@ sys 1.101 thread 1.102 _thread 1.102 _struct 1.103 +datetime 1.106 PyQt4.Qsci 1.94 PyQt4.QtAssistant 1.94 From 87dd3cf6f5dc11dfbcbb996039b52186e96dcbad Mon Sep 17 00:00:00 2001 From: Andrey Vlasovskikh Date: Sat, 5 May 2012 20:51:35 +0400 Subject: [PATCH 08/11] Added move refactoring tests to all Python tests suite --- python/testSrc/com/jetbrains/python/PythonAllTestsSuite.java | 1 + 1 file changed, 1 insertion(+) diff --git a/python/testSrc/com/jetbrains/python/PythonAllTestsSuite.java b/python/testSrc/com/jetbrains/python/PythonAllTestsSuite.java index 669ea76b5b90..7327d31a3041 100644 --- a/python/testSrc/com/jetbrains/python/PythonAllTestsSuite.java +++ b/python/testSrc/com/jetbrains/python/PythonAllTestsSuite.java @@ -56,6 +56,7 @@ public class PythonAllTestsSuite { PyFormatterTest.class, PyRenameTest.class, CythonRenameTest.class, + PyMoveTest.class, PyExtractMethodTest.class, PyPullUpTest.class, PyPushDownTest.class, From 0bc27b3557faaffdc3f92742c2857478dfdbf83e Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Mon, 7 May 2012 17:19:04 +0200 Subject: [PATCH 09/11] cleanup for cleanup --- .../jetbrains/python/actions/ChainedComparisonsQuickFix.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/src/com/jetbrains/python/actions/ChainedComparisonsQuickFix.java b/python/src/com/jetbrains/python/actions/ChainedComparisonsQuickFix.java index a15d52ab0fb7..2b64bd56ad45 100644 --- a/python/src/com/jetbrains/python/actions/ChainedComparisonsQuickFix.java +++ b/python/src/com/jetbrains/python/actions/ChainedComparisonsQuickFix.java @@ -19,7 +19,7 @@ import org.jetbrains.annotations.Nullable; public class ChainedComparisonsQuickFix implements LocalQuickFix { boolean myIsLeftLeft; boolean myIsRightLeft; - Boolean getInnerRight; + boolean getInnerRight; public ChainedComparisonsQuickFix(boolean isLeft, boolean isRight, boolean getInner) { myIsLeftLeft = isLeft; From 5e7680e833044800787f684a664883fcb876edda Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Mon, 7 May 2012 18:55:07 +0200 Subject: [PATCH 10/11] SDKs -> interpreters --- python/src/com/jetbrains/python/PyBundle.properties | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/python/src/com/jetbrains/python/PyBundle.properties b/python/src/com/jetbrains/python/PyBundle.properties index 70a4be979bc3..48fbe99d3c95 100644 --- a/python/src/com/jetbrains/python/PyBundle.properties +++ b/python/src/com/jetbrains/python/PyBundle.properties @@ -651,11 +651,11 @@ remote.debug.redirect.output=Redirect output to console remote.debug.suspend.on.connect=Suspend after connect # SDK / skeletons -sdk.errorlog.$0.mods.fail.in.$1.sdks={0} modules failed in {1} SDKs. Details... -sdk.errorlog.$0.mods.fail.in.$1.sdks.$2.completely={0} modules failed in {1} SDKs, {2} SDKs failed completely. Details... +sdk.errorlog.$0.mods.fail.in.$1.sdks={0} modules failed in {1} interpreters. Details... +sdk.errorlog.$0.mods.fail.in.$1.sdks.$2.completely={0} modules failed in {1} interpreters, {2} interpreters failed completely. Details... sdk.some.skeletons.failed=Some skeletons failed to generate sdk.error.dialog.problems=Skeleton Generation Problems -sdk.error.dialog.failed.sdks=Failed SDKs +sdk.error.dialog.failed.sdks=Failed interpreters sdk.error.dialog.failed.modules=Failed modules sdk.error.dialog.were.blacklisted=Generation of skeletons for the modules above will be tried again when the modules are updated or a new version of generator is available. sdk.gen.querying.$0=Querying skeleton generator for {0}... From 42d5a3de9838a308fa5d444ba0ab1a476188f9e2 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Tue, 8 May 2012 17:47:27 +0200 Subject: [PATCH 11/11] build script refactoring (work in progress) --- python/build/pycharm_build.gant | 33 +++++---------------------------- 1 file changed, 5 insertions(+), 28 deletions(-) diff --git a/python/build/pycharm_build.gant b/python/build/pycharm_build.gant index c580180ad935..296b8679f473 100644 --- a/python/build/pycharm_build.gant +++ b/python/build/pycharm_build.gant @@ -43,31 +43,8 @@ setProperty("pluginFilter", [ "python-remote-interpreter" ]) -private List platformImplementationModules() { - return [ - "core-impl", - "RegExpSupport", - "license_common", - "platform-ultimate", - "platform-impl", - "vcs-impl", - "lang-impl", - "testRunner", - "smRunner", - "xdebugger-impl", - "xml", - "relaxng", - "lvcs-impl", - "images", - "spellchecker", - "dom-impl", - "yaml", - "coverage-common" - ] -} - -private List platformApiModules() { - return ["core-api", "platform-api", "lvcs-api", "lang-api", "vcs-api", "usageView", "xdebugger-api", "xml-openapi", "dom-openapi", "webide-api"] +private List pycharmImplementationModules() { + return ["yaml", "coverage-common", "python", "python-ide"] } class Paths { @@ -99,7 +76,7 @@ setProperty("buildName", "PY-$buildNumber") target('default': "Build artifacts") { def modules = [ - "python", "python-ide", "python-pydev", "colorSchemes", platformApiModules(), platformImplementationModules(), pluginFilter + "python-pydev", "colorSchemes", platformUltimateApiModules, platformUltimateImplementationModules, pycharmImplementationModules(), pluginFilter ].flatten() loadProject() @@ -242,8 +219,8 @@ private String appInfoFile() { } private layoutFull(Map args, String target, Set usedJars) { - def openapiModules = platformApiModules() - def implementationModules = [platformImplementationModules(), "python", "python-ide"].flatten() + def openapiModules = platformUltimateApiModules + def implementationModules = [platformUltimateImplementationModules, pycharmImplementationModules()].flatten() def result = layout(target) { dir("lib") {