diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/JavaStackFrame.java b/java/debugger/impl/src/com/intellij/debugger/engine/JavaStackFrame.java index 4597928e1849..2df38a77e926 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/JavaStackFrame.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/JavaStackFrame.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -173,15 +173,14 @@ public class JavaStackFrame extends XStackFrame { } final Location location = myDescriptor.getLocation(); - LOG.assertTrue(location != null); final ObjectReference thisObjectReference = myDescriptor.getThisObject(); if (thisObjectReference != null) { ValueDescriptorImpl thisDescriptor = myNodeManager.getThisDescriptor(null, thisObjectReference); children.add(JavaValue.create(thisDescriptor, evaluationContext, myNodeManager)); } - else { - StaticDescriptorImpl staticDecriptor = myNodeManager.getStaticDescriptor(myDescriptor, location.method().declaringType()); + else if (location != null) { + StaticDescriptorImpl staticDecriptor = myNodeManager.getStaticDescriptor(myDescriptor, location.declaringType()); if (staticDecriptor.isExpandable()) { children.addTopGroup(new JavaStaticGroup(staticDecriptor, evaluationContext, myNodeManager)); } @@ -214,7 +213,8 @@ public class JavaStackFrame extends XStackFrame { if (classRenderer.SHOW_VAL_FIELDS_AS_LOCAL_VARIABLES) { if (thisObjectReference != null && debugProcess.getVirtualMachineProxy().canGetSyntheticAttribute()) { final ReferenceType thisRefType = thisObjectReference.referenceType(); - if (thisRefType instanceof ClassType && thisRefType.equals(location.declaringType()) && thisRefType.name().contains("$")) { // makes sense for nested classes only + if (thisRefType instanceof ClassType && location != null + && thisRefType.equals(location.declaringType()) && thisRefType.name().contains("$")) { // makes sense for nested classes only final ClassType clsType = (ClassType)thisRefType; for (Field field : clsType.fields()) { if (DebuggerUtils.isSynthetic(field) && StringUtil.startsWith(field.name(), FieldDescriptorImpl.OUTER_LOCAL_VAR_FIELD_PREFIX)) { diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/StackFrameDescriptorImpl.java b/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/StackFrameDescriptorImpl.java index a85f0b479c26..58aca2cc751e 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/StackFrameDescriptorImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/StackFrameDescriptorImpl.java @@ -281,6 +281,7 @@ public class StackFrameDescriptorImpl extends NodeDescriptorImpl implements Stac return myIsInLibraryContent; } + @Nullable public Location getLocation() { return myLocation; } diff --git a/java/idea-ui/src/com/intellij/ide/util/projectWizard/SdkSettingsStep.java b/java/idea-ui/src/com/intellij/ide/util/projectWizard/SdkSettingsStep.java index 9e92b8b8ee0f..314ca6056bb6 100644 --- a/java/idea-ui/src/com/intellij/ide/util/projectWizard/SdkSettingsStep.java +++ b/java/idea-ui/src/com/intellij/ide/util/projectWizard/SdkSettingsStep.java @@ -147,10 +147,7 @@ public class SdkSettingsStep extends ModuleWizardStep { myWizardContext.setProjectJdk(jdk); } else { - Sdk sdk = ProjectRootManager.getInstance(project).getProjectSdk(); - if (sdk == null || !myModuleBuilder.isSuitableSdkType(sdk.getSdkType())) { - myModuleBuilder.setModuleJdk(myJdkComboBox.getSelectedJdk()); - } // else, inherit project jdk + myModuleBuilder.setModuleJdk(myJdkComboBox.getSelectedJdk()); } } diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/AnonymousCanBeLambdaInspection.java b/java/java-analysis-impl/src/com/intellij/codeInspection/AnonymousCanBeLambdaInspection.java index aa7868f43b4c..221fd6259f14 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/AnonymousCanBeLambdaInspection.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/AnonymousCanBeLambdaInspection.java @@ -575,7 +575,7 @@ public class AnonymousCanBeLambdaInspection extends BaseJavaBatchLocalInspection } final PsiSubstitutor inferredSubstitutor = TypeConversionUtil.getClassSubstitutor(superClass, classCandidate, classResolveResult.getSubstitutor()); final PsiSubstitutor substitutor = TypeConversionUtil.getSuperClassSubstitutor(superClass, myAnonymClass.getBaseClassType()); - if (inferredSubstitutor == null || + if (inferredSubstitutor != null && !Comparing.equal(inferredSubstitutor.substitute(paramType), substitutor.substitute(paramType))) { myBodyContainsForbiddenRefs = true; return; diff --git a/java/testFramework/src/com/intellij/testFramework/fixtures/impl/JavaModuleFixtureBuilderImpl.java b/java/testFramework/src/com/intellij/testFramework/fixtures/impl/JavaModuleFixtureBuilderImpl.java index 9eed50d2f46b..c196b832dec2 100644 --- a/java/testFramework/src/com/intellij/testFramework/fixtures/impl/JavaModuleFixtureBuilderImpl.java +++ b/java/testFramework/src/com/intellij/testFramework/fixtures/impl/JavaModuleFixtureBuilderImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -30,6 +30,7 @@ import com.intellij.openapi.roots.libraries.LibraryTable; import com.intellij.openapi.vfs.JarFileSystem; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.openapi.vfs.newvfs.impl.VfsRootAccess; import com.intellij.pom.java.LanguageLevel; import com.intellij.testFramework.IdeaTestUtil; import com.intellij.testFramework.builders.JavaModuleFixtureBuilder; @@ -142,6 +143,7 @@ abstract class JavaModuleFixtureBuilderImpl extends Mod final Sdk jdk; if (myJdk != null) { + VfsRootAccess.allowRootAccessTemporarily(module, myJdk); jdk = JavaSdk.getInstance().createJdk(module.getName() + "_jdk", myJdk, false); ((ProjectJdkImpl)jdk).setVersionString("java 1.5"); } diff --git a/jps/jps-builders/testSrc/org/jetbrains/jps/builders/java/MockPackageFacadeBuilderService.java b/jps/jps-builders/testSrc/org/jetbrains/jps/builders/java/MockPackageFacadeBuilderService.java index 5470c5d1f744..15e95054de45 100644 --- a/jps/jps-builders/testSrc/org/jetbrains/jps/builders/java/MockPackageFacadeBuilderService.java +++ b/jps/jps-builders/testSrc/org/jetbrains/jps/builders/java/MockPackageFacadeBuilderService.java @@ -37,6 +37,9 @@ public class MockPackageFacadeBuilderService extends BuilderService { catch (ClassNotFoundException e) { return Collections.emptyList(); } + catch (NoClassDefFoundError e) { + return Collections.emptyList(); + } catch (Exception e) { throw new RuntimeException(e); } diff --git a/jps/jps-builders/testSrc/org/jetbrains/jps/incremental/artifacts/IncrementalArtifactBuildingTest.java b/jps/jps-builders/testSrc/org/jetbrains/jps/incremental/artifacts/IncrementalArtifactBuildingTest.java index 13ce0e62837a..a3c2594f3534 100644 --- a/jps/jps-builders/testSrc/org/jetbrains/jps/incremental/artifacts/IncrementalArtifactBuildingTest.java +++ b/jps/jps-builders/testSrc/org/jetbrains/jps/incremental/artifacts/IncrementalArtifactBuildingTest.java @@ -328,4 +328,27 @@ public class IncrementalArtifactBuildingTest extends ArtifactBuilderTestCase { assertOutput(a2, fs().file("a.txt", "2")); } + //todo[nik] fix + //ZD-51993 + public void _testFilesCopiedToTwoDifferentPlacesInArtifact() { + final String fileA = createFile("res/a.txt", "0"); + final String fileB = createFile("res/b.txt", "0"); + String dir = PathUtil.getParentPath(fileA); + JpsArtifact a = addArtifact("a", root() + .dir("d").dirCopy(dir).end() + .archive("a.zip").dirCopy(dir)); + buildAll(); + + change(fileA, "1"); + buildAll(); + assertOutput(a, fs() + .dir("d").file("a.txt", "1").file("b.txt", "0").end() + .archive("a.zip").file("a.txt", "1").file("b.txt", "0")); + + change(fileB, "1"); + buildAll(); + assertOutput(a, fs() + .dir("d").file("a.txt", "1").file("b.txt", "1").end() + .archive("a.zip").file("a.txt", "1").file("b.txt", "1")); + } } diff --git a/platform/core-api/src/com/intellij/openapi/vfs/DeprecatedVirtualFileSystem.java b/platform/core-api/src/com/intellij/openapi/vfs/DeprecatedVirtualFileSystem.java index 680facb3290c..47cf71739717 100644 --- a/platform/core-api/src/com/intellij/openapi/vfs/DeprecatedVirtualFileSystem.java +++ b/platform/core-api/src/com/intellij/openapi/vfs/DeprecatedVirtualFileSystem.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -26,6 +26,8 @@ import com.intellij.util.EventDispatcher; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.io.IOException; + public abstract class DeprecatedVirtualFileSystem extends VirtualFileSystem { private final EventDispatcher myEventDispatcher = EventDispatcher.create(VirtualFileListener.class); @@ -135,4 +137,39 @@ public abstract class DeprecatedVirtualFileSystem extends VirtualFileSystem { public boolean isReadOnly() { return true; } + @Override + protected void deleteFile(Object requestor, @NotNull VirtualFile vFile) throws IOException { + throw new UnsupportedOperationException("deleteFile() not supported"); + } + + @Override + protected void moveFile(Object requestor, @NotNull VirtualFile vFile, @NotNull VirtualFile newParent) throws IOException { + throw new UnsupportedOperationException("move() not supported"); + } + + @Override + protected void renameFile(Object requestor, @NotNull VirtualFile vFile, @NotNull String newName) throws IOException { + throw new UnsupportedOperationException("renameFile() not supported"); + } + + @NotNull + @Override + public VirtualFile createChildFile(Object requestor, @NotNull VirtualFile vDir, @NotNull String fileName) throws IOException { + throw new UnsupportedOperationException("createChildFile() not supported"); + } + + @NotNull + @Override + public VirtualFile createChildDirectory(Object requestor, @NotNull VirtualFile vDir, @NotNull String dirName) throws IOException { + throw new UnsupportedOperationException("createChildDirectory() not supported"); + } + + @NotNull + @Override + public VirtualFile copyFile(Object requestor, + @NotNull VirtualFile virtualFile, + @NotNull VirtualFile newParent, + @NotNull String copyName) throws IOException { + throw new UnsupportedOperationException("copyFile() not supported"); + } } \ No newline at end of file diff --git a/platform/core-api/src/com/intellij/testFramework/LightVirtualFileBase.java b/platform/core-api/src/com/intellij/testFramework/LightVirtualFileBase.java index edf10bd92491..5e91c468c985 100644 --- a/platform/core-api/src/com/intellij/testFramework/LightVirtualFileBase.java +++ b/platform/core-api/src/com/intellij/testFramework/LightVirtualFileBase.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -84,39 +84,6 @@ public abstract class LightVirtualFileBase extends VirtualFile { public VirtualFile refreshAndFindFileByPath(@NotNull String path) { return null; } - - @Override - public void deleteFile(Object requestor, @NotNull VirtualFile vFile) throws IOException { - } - - @Override - public void moveFile(Object requestor, @NotNull VirtualFile vFile, @NotNull VirtualFile newParent) throws IOException { - } - - @NotNull - @Override - public VirtualFile copyFile(Object requestor, - @NotNull VirtualFile vFile, - @NotNull VirtualFile newParent, - @NotNull final String copyName) throws IOException { - throw new IOException("Cannot copy files"); - } - - @Override - public void renameFile(Object requestor, @NotNull VirtualFile vFile, @NotNull String newName) throws IOException { - } - - @NotNull - @Override - public VirtualFile createChildFile(Object requestor, @NotNull VirtualFile vDir, @NotNull String fileName) throws IOException { - throw new IOException("Cannot create files"); - } - - @Override - @NotNull - public VirtualFile createChildDirectory(Object requestor, @NotNull VirtualFile vDir, @NotNull String dirName) throws IOException { - throw new IOException("Cannot create directories"); - } } private static final MyVirtualFileSystem ourFileSystem = new MyVirtualFileSystem(); diff --git a/platform/core-impl/src/com/intellij/openapi/vfs/impl/jar/CoreJarFileSystem.java b/platform/core-impl/src/com/intellij/openapi/vfs/impl/jar/CoreJarFileSystem.java index b1fb350126aa..a106c2a0f277 100644 --- a/platform/core-impl/src/com/intellij/openapi/vfs/impl/jar/CoreJarFileSystem.java +++ b/platform/core-impl/src/com/intellij/openapi/vfs/impl/jar/CoreJarFileSystem.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -22,7 +22,6 @@ import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; -import java.io.IOException; import java.util.HashMap; import java.util.Map; @@ -72,40 +71,4 @@ public class CoreJarFileSystem extends DeprecatedVirtualFileSystem { public VirtualFile refreshAndFindFileByPath(@NotNull String path) { return findFileByPath(path); } - - @Override - protected void deleteFile(Object requestor, @NotNull VirtualFile vFile) throws IOException { - throw new UnsupportedOperationException("JarFileSystem is read-only"); - } - - @Override - protected void moveFile(Object requestor, @NotNull VirtualFile vFile, @NotNull VirtualFile newParent) throws IOException { - throw new UnsupportedOperationException("JarFileSystem is read-only"); - } - - @Override - protected void renameFile(Object requestor, @NotNull VirtualFile vFile, @NotNull String newName) throws IOException { - throw new UnsupportedOperationException("JarFileSystem is read-only"); - } - - @NotNull - @Override - protected VirtualFile createChildFile(Object requestor, @NotNull VirtualFile vDir, @NotNull String fileName) throws IOException { - throw new UnsupportedOperationException("JarFileSystem is read-only"); - } - - @NotNull - @Override - protected VirtualFile createChildDirectory(Object requestor, @NotNull VirtualFile vDir, @NotNull String dirName) throws IOException { - throw new UnsupportedOperationException("JarFileSystem is read-only"); - } - - @NotNull - @Override - protected VirtualFile copyFile(Object requestor, - @NotNull VirtualFile virtualFile, - @NotNull VirtualFile newParent, - @NotNull String copyName) throws IOException { - throw new UnsupportedOperationException("JarFileSystem is read-only"); - } } diff --git a/platform/core-impl/src/com/intellij/openapi/vfs/local/CoreLocalFileSystem.java b/platform/core-impl/src/com/intellij/openapi/vfs/local/CoreLocalFileSystem.java index b9d99c404486..39a54934b6fa 100644 --- a/platform/core-impl/src/com/intellij/openapi/vfs/local/CoreLocalFileSystem.java +++ b/platform/core-impl/src/com/intellij/openapi/vfs/local/CoreLocalFileSystem.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -23,7 +23,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.File; -import java.io.IOException; /** * @author yole @@ -53,45 +52,4 @@ public class CoreLocalFileSystem extends DeprecatedVirtualFileSystem { public VirtualFile refreshAndFindFileByPath(@NotNull String path) { return findFileByPath(path); } - - @Override - protected void deleteFile(Object requestor, @NotNull VirtualFile vFile) throws IOException { - throw new UnsupportedOperationException("deleteFile() not supported"); - } - - @Override - protected void moveFile(Object requestor, @NotNull VirtualFile vFile, @NotNull VirtualFile newParent) throws IOException { - throw new UnsupportedOperationException("move() not supported"); - } - - @Override - protected void renameFile(Object requestor, @NotNull VirtualFile vFile, @NotNull String newName) throws IOException { - throw new UnsupportedOperationException("renameFile() not supported"); - } - - @NotNull - @Override - protected VirtualFile createChildFile(Object requestor, @NotNull VirtualFile vDir, @NotNull String fileName) throws IOException { - throw new UnsupportedOperationException("createChildFile() not supported"); - } - - @NotNull - @Override - protected VirtualFile createChildDirectory(Object requestor, @NotNull VirtualFile vDir, @NotNull String dirName) throws IOException { - throw new UnsupportedOperationException("createChildDirectory() not supported"); - } - - @NotNull - @Override - protected VirtualFile copyFile(Object requestor, - @NotNull VirtualFile virtualFile, - @NotNull VirtualFile newParent, - @NotNull String copyName) throws IOException { - throw new UnsupportedOperationException("copyFile() not supported"); - } - - @Override - public boolean isReadOnly() { - return true; - } } diff --git a/platform/diff-api/src/com/intellij/diff/DiffContentFactory.java b/platform/diff-api/src/com/intellij/diff/DiffContentFactory.java index cb110ff1190d..60ee98a95726 100644 --- a/platform/diff-api/src/com/intellij/diff/DiffContentFactory.java +++ b/platform/diff-api/src/com/intellij/diff/DiffContentFactory.java @@ -46,6 +46,9 @@ public abstract class DiffContentFactory { @NotNull public abstract DocumentContent create(@NotNull String text, @Nullable FileType type); + @NotNull + public abstract DocumentContent create(@NotNull String text, @Nullable FileType type, boolean respectLineSeparators); + @NotNull public abstract DocumentContent create(@Nullable Project project, @NotNull Document document); @@ -65,7 +68,7 @@ public abstract class DiffContentFactory { * @param referenceContent used to detect FileType and proper highlighting for clipboard content */ @NotNull - public abstract DocumentContent createClipboardContent(@NotNull DocumentContent referenceContent); + public abstract DocumentContent createClipboardContent(@Nullable DocumentContent referenceContent); @NotNull public abstract DiffContent createBinary(@Nullable Project project, diff --git a/platform/diff-impl/src/com/intellij/diff/DiffContentFactoryImpl.java b/platform/diff-impl/src/com/intellij/diff/DiffContentFactoryImpl.java index 7725249de5d9..2e7a1908555c 100644 --- a/platform/diff-impl/src/com/intellij/diff/DiffContentFactoryImpl.java +++ b/platform/diff-impl/src/com/intellij/diff/DiffContentFactoryImpl.java @@ -30,6 +30,7 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.testFramework.BinaryLightVirtualFile; +import com.intellij.util.LineSeparator; import com.intellij.util.PathUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -37,6 +38,7 @@ import org.jetbrains.annotations.Nullable; import java.awt.datatransfer.DataFlavor; import java.io.File; import java.io.IOException; +import java.nio.charset.Charset; public class DiffContentFactoryImpl extends DiffContentFactory { public final Logger LOG = Logger.getInstance(DiffContentFactoryImpl.class); @@ -56,9 +58,13 @@ public class DiffContentFactoryImpl extends DiffContentFactory { @Override @NotNull public DocumentContent create(@NotNull String text, @Nullable FileType type) { - Document document = EditorFactory.getInstance().createDocument(StringUtil.convertLineSeparators(text)); - document.setReadOnly(true); - return new DocumentContentImpl(document, type, null, null, null); + return create(text, type, true); + } + + @Override + @NotNull + public DocumentContent create(@NotNull String text, @Nullable FileType type, boolean respectLineSeparators) { + return createImpl(text, type, null, null, respectLineSeparators, true); } @Override @@ -102,17 +108,32 @@ public class DiffContentFactoryImpl extends DiffContentFactory { @Override @NotNull public DiffContent createClipboardContent() { - String text = CopyPasteManager.getInstance().getContents(DataFlavor.stringFlavor); - Document document = EditorFactory.getInstance().createDocument(StringUtil.convertLineSeparators(StringUtil.notNullize(text))); - return new DocumentContentImpl(document); // TODO: show difference in line separators ? + return createClipboardContent(null); } @Override @NotNull - public DocumentContent createClipboardContent(@NotNull DocumentContent mainContent) { + public DocumentContent createClipboardContent(@Nullable DocumentContent mainContent) { String text = CopyPasteManager.getInstance().getContents(DataFlavor.stringFlavor); - Document document = EditorFactory.getInstance().createDocument(StringUtil.convertLineSeparators(StringUtil.notNullize(text))); - return new DocumentContentWrapper(document, mainContent); + + FileType type = mainContent != null ? mainContent.getContentType() : null; + VirtualFile highlightFile = mainContent != null ? mainContent.getHighlightFile() : null; + + return createImpl(StringUtil.notNullize(text), type, highlightFile, null, true, false); + } + + @NotNull + private static DocumentContent createImpl(@NotNull String text, + @Nullable FileType type, + @Nullable VirtualFile highlightFile, + @Nullable Charset charset, + boolean respectLineSeparators, + boolean readOnly) { + // TODO: detect invalid (different across the file) separators ? + LineSeparator separator = respectLineSeparators ? StringUtil.detectSeparators(text) : null; + Document document = EditorFactory.getInstance().createDocument(StringUtil.convertLineSeparators(text)); + if (readOnly) document.setReadOnly(true); + return new DocumentContentImpl(document, type, highlightFile, separator, charset); } @Override diff --git a/platform/diff-impl/src/com/intellij/diff/contents/DocumentContentWrapper.java b/platform/diff-impl/src/com/intellij/diff/contents/DocumentContentWrapper.java index fd65cf30af44..892fb83a2184 100644 --- a/platform/diff-impl/src/com/intellij/diff/contents/DocumentContentWrapper.java +++ b/platform/diff-impl/src/com/intellij/diff/contents/DocumentContentWrapper.java @@ -25,6 +25,8 @@ import org.jetbrains.annotations.Nullable; import java.nio.charset.Charset; +@Deprecated +/** @deprecated (to be removed in IDEA 15) */ public class DocumentContentWrapper implements DocumentContent { @NotNull private final DocumentContent myBase; @NotNull private final Document myDocument; diff --git a/platform/diff-impl/src/com/intellij/diff/tools/simple/SimpleDiffChange.java b/platform/diff-impl/src/com/intellij/diff/tools/simple/SimpleDiffChange.java index d9b0cd748ba3..ac5ddf74d0aa 100644 --- a/platform/diff-impl/src/com/intellij/diff/tools/simple/SimpleDiffChange.java +++ b/platform/diff-impl/src/com/intellij/diff/tools/simple/SimpleDiffChange.java @@ -312,11 +312,13 @@ public class SimpleDiffChange { boolean isEditable = DiffUtil.isEditable(mySide.select(myEditor1, myEditor2)); boolean isOtherEditable = DiffUtil.isEditable(mySide.other().select(myEditor1, myEditor2)); + boolean isAppendable = myFragment.getStartLine1() != myFragment.getEndLine1() && + myFragment.getStartLine2() != myFragment.getEndLine2(); if ((myShiftPressed || !isOtherEditable) && isEditable) { return createRevertRenderer(mySide); } - if (myCtrlPressed) { + if (myCtrlPressed && isAppendable) { return createAppendRenderer(mySide); } return createApplyRenderer(mySide); diff --git a/platform/editor-ui-api/src/com/intellij/ide/ui/UISettings.java b/platform/editor-ui-api/src/com/intellij/ide/ui/UISettings.java index 1d8166ffe8b0..048c186dc2b6 100644 --- a/platform/editor-ui-api/src/com/intellij/ide/ui/UISettings.java +++ b/platform/editor-ui-api/src/com/intellij/ide/ui/UISettings.java @@ -291,7 +291,6 @@ public class UISettings extends SimpleModificationTracker implements PersistentS g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF); } } - UIUtil.setHintingForLCDText(g2d); } /** diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/execution/NotSupportedException.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/execution/NotSupportedException.java new file mode 100644 index 000000000000..31e6533c685c --- /dev/null +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/execution/NotSupportedException.java @@ -0,0 +1,42 @@ +/* + * Copyright 2000-2015 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.intellij.openapi.externalSystem.service.execution; + +import com.intellij.openapi.externalSystem.model.ExternalSystemException; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * @author Vladislav.Soroka + * @since 12/12/2014 + */ +public class NotSupportedException extends ExternalSystemException { + public NotSupportedException(@Nullable String message) { + super(message); + } + + public NotSupportedException(@Nullable Throwable cause) { + super(cause); + } + + public NotSupportedException(@Nullable String message, @NotNull String... quickFixes) { + super(message, quickFixes); + } + + public NotSupportedException(@Nullable String message, @Nullable Throwable cause, @NotNull String... quickFixes) { + super(message, cause, quickFixes); + } +} diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/internal/AbstractExternalSystemTask.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/internal/AbstractExternalSystemTask.java index 305114cad264..3c7f5474e7e1 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/internal/AbstractExternalSystemTask.java +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/internal/AbstractExternalSystemTask.java @@ -6,7 +6,8 @@ import com.intellij.openapi.externalSystem.model.ProjectSystemId; import com.intellij.openapi.externalSystem.model.task.*; import com.intellij.openapi.externalSystem.service.ExternalSystemFacadeManager; import com.intellij.openapi.externalSystem.service.RemoteExternalSystemFacade; -import com.intellij.openapi.externalSystem.service.notification.ExternalSystemProgressNotificationManager; +import com.intellij.openapi.externalSystem.service.execution.NotSupportedException; +import com.intellij.openapi.externalSystem.service.notification.*; import com.intellij.openapi.externalSystem.util.ExternalSystemBundle; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.project.Project; @@ -190,6 +191,12 @@ public abstract class AbstractExternalSystemTask implements ExternalSystemTask { setState(result ? ExternalSystemTaskState.CANCELED : ExternalSystemTaskState.CANCELLATION_FAILED); return result; } + catch (NotSupportedException e) { + NotificationData notification = + new NotificationData("Cancellation failed", e.getMessage(), NotificationCategory.WARNING, NotificationSource.PROJECT_SYNC); + notification.setBalloonNotification(true); + ExternalSystemNotificationManager.getInstance(getIdeProject()).showNotification(getExternalSystemId(), notification); + } catch (Throwable e) { setState(ExternalSystemTaskState.CANCELLATION_FAILED); myError.set(e); diff --git a/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java b/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java index 9eced8b4fc92..0550e75fc05a 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java @@ -100,10 +100,14 @@ public class ConsoleViewImpl extends JPanel implements ConsoleView, ObservableCo public static final Key CONSOLE_VIEW_IN_EDITOR_VIEW = Key.create("CONSOLE_VIEW_IN_EDITOR_VIEW"); - static { + private static boolean ourTypedHandlerInitialized; + + private static synchronized void initTypedHandler() { + if (ourTypedHandlerInitialized) return; final EditorActionManager actionManager = EditorActionManager.getInstance(); final TypedAction typedAction = actionManager.getTypedAction(); typedAction.setupHandler(new MyTypedHandler(typedAction.getHandler())); + ourTypedHandlerInitialized = true; } @@ -281,6 +285,7 @@ public class ConsoleViewImpl extends JPanel implements ConsoleView, ObservableCo boolean usePredefinedMessageFilter) { super(new BorderLayout()); + initTypedHandler(); myIsViewer = viewer; myState = initialState; myPsiDisposedCheck = new DisposedPsiManagerCheck(project); diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/impl/storage/ClasspathStorage.java b/platform/lang-impl/src/com/intellij/openapi/roots/impl/storage/ClasspathStorage.java index 1a1eef8a246c..df75b15ae75c 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/impl/storage/ClasspathStorage.java +++ b/platform/lang-impl/src/com/intellij/openapi/roots/impl/storage/ClasspathStorage.java @@ -157,7 +157,9 @@ public class ClasspathStorage extends StateStorageBase changedFiles, @NotNull Set componentNames) { // if some file changed, so, changed componentNames.add("NewModuleRootManager"); - myStorageData.loaded = false; + if (myStorageData != null) { + myStorageData.loaded = false; + } } @Nullable diff --git a/platform/platform-api/src/com/intellij/openapi/vfs/JarFileSystem.java b/platform/platform-api/src/com/intellij/openapi/vfs/JarFileSystem.java index df5b07173bd8..d99e9f009556 100644 --- a/platform/platform-api/src/com/intellij/openapi/vfs/JarFileSystem.java +++ b/platform/platform-api/src/com/intellij/openapi/vfs/JarFileSystem.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -42,7 +42,7 @@ public abstract class JarFileSystem extends ArchiveFileSystem implements JarCopy } /** @deprecated to be removed in IDEA 15 */ - @SuppressWarnings({"UnusedDeclaration", "deprecation"}) + @SuppressWarnings("deprecation") public abstract JarFile getJarFile(@NotNull VirtualFile entryVFile) throws IOException; @Nullable diff --git a/platform/platform-impl/src/com/intellij/internal/validation/CheckMessagesButtonsOrderAction.java b/platform/platform-impl/src/com/intellij/internal/validation/CheckMessagesButtonsOrderAction.java new file mode 100644 index 000000000000..87f3ad9db1a6 --- /dev/null +++ b/platform/platform-impl/src/com/intellij/internal/validation/CheckMessagesButtonsOrderAction.java @@ -0,0 +1,141 @@ +/* + * Copyright 2000-2015 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.intellij.internal.validation; + +import com.intellij.CommonBundle; +import com.intellij.ide.impl.ProjectNewWindowDoNotAskOption; +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.project.DumbAware; +import com.intellij.openapi.ui.Messages; + +import javax.swing.*; + +/** + * @author Denis Fokin + */ +public class CheckMessagesButtonsOrderAction extends AnAction implements DumbAware { + @Override + public void actionPerformed(AnActionEvent e) { + + new Thread() { + @Override + public void run() { + super.run(); + + //noinspection SSBasedInspection + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + + + // Case 1 + + Messages.showDialog("unchecked unfocused checkbox, [Proceed], ____,Cancel, *Show ussages*", + "Message 1", new String [] {"Show usages", "Cancel", "Proceed"}, 0, 0, + Messages.getQuestionIcon(), new ProjectNewWindowDoNotAskOption()); + + // Case 2 + + Messages.showDialog("unchecked unfocused checkbox, [Proceed], ____,Cancel, *Show ussages*", + "Message 2", new String [] {"Show usages", "Cancel", "Proceed"}, 0, 1, + Messages.getQuestionIcon(), new ProjectNewWindowDoNotAskOption()); + + // Case 3 + + Messages.showDialog("unchecked unfocused checkbox, [Proceed], ____, *Cancel*, Show ussages", + "Message 3", new String [] {"Show usages", "Cancel", "Proceed"}, 1, 0, + Messages.getQuestionIcon(), new ProjectNewWindowDoNotAskOption()); + + // Case 4 + + Messages.showDialog("unchecked unfocused checkbox, [Proceed], ____, *Cancel*, Show ussages", + "Message 4", new String [] {"Show usages", "Cancel", "Proceed"}, 1, 1, + Messages.getQuestionIcon(), new ProjectNewWindowDoNotAskOption()); + + // Case 5 + + Messages.showDialog("[Proceed], ____, Cancel, *Show ussages*", + "Message 5", new String [] {"Show usages", "Cancel", "Proceed"}, 0, 1, + Messages.getQuestionIcon(), null); + + // Case 6 + + Messages.showYesNoCancelDialog("unchecked unfocused checkbox, [New Window], ____, Cancel, *This Window*", + "Message 6", + "This window", + "New Window", + CommonBundle.getCancelButtonText(), + Messages.getQuestionIcon(), + new ProjectNewWindowDoNotAskOption()); + + // Case 7 + + Messages.showDialog("[Variant 1], Variant 2, Variant 3, Cancel, *Ok*", + "Message 7", + new String[]{"Ok", "Cancel", "Variant 3", "Variant 2", "Variant 1"}, + 0, 1, Messages.getQuestionIcon(), null); + + // Case 8 + + Messages.showDialog( "unchecked unfocused checkbox, [Variant 1], Variant 2, Variant 3, Cancel, *Ok*", + "Message 8", + new String [] {"Ok", "Cancel", "Variant 3", "Variant 2", "Variant 1"}, + 0, 0, Messages.getQuestionIcon(), new ProjectNewWindowDoNotAskOption()); + + // Case 9 + + Messages.showDialog( "unchecked unfocused checkbox, [Variant 1], Variant 2, Variant 3, *Cancel*, Ok", + "Message 9", + new String [] {"Ok", "Cancel", "Variant 3", "Variant 2", "Variant 1"}, + 1, 1, Messages.getQuestionIcon(), new ProjectNewWindowDoNotAskOption()); + + // Case 10 + + Messages.showDialog( "unchecked unfocused checkbox, [Variant 1], Variant 2, Variant 3, Cancel, *Ok*", + "Message 10", + new String [] {"Ok", "Cancel", "Variant 3", "Variant 2", "Variant 1"}, + 0, 1, Messages.getQuestionIcon(), new ProjectNewWindowDoNotAskOption()); + + // Case 11 + + Messages.showDialog( "unchecked unfocused checkbox, [Variant 1], Variant 2, Variant 3, Cancel, *Ok*", + "Message 11", + new String [] {"Ok", "Cancel", "Variant 3", "Variant 2", "Variant 1"}, + 0, 1, Messages.getQuestionIcon(), new ProjectNewWindowDoNotAskOption()); + + // Case 12 + + Messages.showDialog( "unchecked unfocused checkbox, [Cancel], Variant 1, Variant 2, Variant 3, *Ok*", + "Message 12", + new String [] {"Ok", "Variant 3", "Variant 2", "Variant 1", "Cancel"}, + 0, 1, Messages.getQuestionIcon(), new ProjectNewWindowDoNotAskOption()); + + // Case 13 + + Messages.showDialog( "unchecked unfocused checkbox, [Cancel], Variant 1, Ok, Variant 2, Variant 3, *Ok*", + "Message 13", + new String [] {"Variant 3", "Variant 2", "Ok", "Variant 1", "Cancel"}, + 0, 1, Messages.getQuestionIcon(), new ProjectNewWindowDoNotAskOption()); + + } + }); + + } + }.start(); + + } +} diff --git a/platform/platform-impl/src/com/intellij/notification/impl/actions/CheckMessagesButtonsOrderAction.java b/platform/platform-impl/src/com/intellij/notification/impl/actions/CheckMessagesButtonsOrderAction.java deleted file mode 100644 index e622e71777d0..000000000000 --- a/platform/platform-impl/src/com/intellij/notification/impl/actions/CheckMessagesButtonsOrderAction.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright 2000-2015 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.intellij.notification.impl.actions; - -import com.intellij.CommonBundle; -import com.intellij.ide.IdeBundle; -import com.intellij.ide.impl.ProjectNewWindowDoNotAskOption; -import com.intellij.openapi.actionSystem.AnAction; -import com.intellij.openapi.actionSystem.AnActionEvent; -import com.intellij.openapi.project.DumbAware; -import com.intellij.openapi.ui.Messages; - -import javax.swing.*; - -/** - * @author Denis Fokin - */ -public class CheckMessagesButtonsOrderAction extends AnAction implements DumbAware { - @Override - public void actionPerformed(AnActionEvent e) { - - new Thread() { - @Override - public void run() { - super.run(); - - //noinspection SSBasedInspection - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - String message = "Proceed - focused, [space] ,Cancel - Nothing, Show ussages - default"; - String[] options = {"Show usages", "Cancel", "Proceed"}; - Messages.showDialog(message, "First Message", options, 0, 1, Messages.getQuestionIcon(), null); - - - Messages.showYesNoCancelDialog("unchecked unfocused checkbox, Yes - focused, space, Cancel, No Text - default", - IdeBundle.message("title.open.project"), - "This window", - "New Window", - CommonBundle.getCancelButtonText(), - Messages.getQuestionIcon(), - new ProjectNewWindowDoNotAskOption()); - } - }); - - } - }.start(); - - } -} diff --git a/platform/platform-impl/src/com/intellij/openapi/components/impl/ServiceManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/components/impl/ServiceManagerImpl.java index 05ce99453036..8b04f9cd8623 100644 --- a/platform/platform-impl/src/com/intellij/openapi/components/impl/ServiceManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/components/impl/ServiceManagerImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -70,8 +70,8 @@ public class ServiceManagerImpl implements BaseComponent { @Override public void extensionAdded(@NotNull final ServiceDescriptor descriptor, final PluginDescriptor pluginDescriptor) { if (descriptor.overrides) { - ComponentAdapter oldAdapter = - picoContainer.unregisterComponent(descriptor.getInterface());// Allow to re-define service implementations in plugins. + // Allow to re-define service implementations in plugins. + ComponentAdapter oldAdapter = picoContainer.unregisterComponent(descriptor.getInterface()); if (oldAdapter == null) { throw new RuntimeException("Service: " + descriptor.getInterface() + " doesn't override anything"); } diff --git a/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/ComponentStoreImpl.java b/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/ComponentStoreImpl.java index 74270496bed6..d8c2820093dc 100644 --- a/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/ComponentStoreImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/ComponentStoreImpl.java @@ -185,7 +185,6 @@ public abstract class ComponentStoreImpl implements IComponentStore.Reloadable { errors = executeSave(session, readonlyFiles, errors); } } - return errors; } diff --git a/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/ProjectStoreImpl.java b/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/ProjectStoreImpl.java index 357eed947d85..a33f222855cc 100644 --- a/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/ProjectStoreImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/ProjectStoreImpl.java @@ -18,6 +18,7 @@ package com.intellij.openapi.components.impl.stores; import com.intellij.CommonBundle; import com.intellij.ide.highlighter.ProjectFileType; import com.intellij.ide.highlighter.WorkspaceFileType; +import com.intellij.notification.Notifications; import com.intellij.notification.NotificationsManager; import com.intellij.openapi.application.*; import com.intellij.openapi.components.*; @@ -30,6 +31,7 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectBundle; import com.intellij.openapi.project.impl.ProjectImpl; import com.intellij.openapi.project.impl.ProjectManagerImpl; +import com.intellij.openapi.project.impl.ProjectManagerImpl.UnableToSaveProjectNotification; import com.intellij.openapi.ui.MessageDialogBuilder; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.Pair; @@ -446,51 +448,69 @@ class ProjectStoreImpl extends BaseFileConfigurableStoreImpl implements IProject @Override protected final List doSave(@Nullable List saveSessions, @NotNull List> readonlyFiles, @Nullable List errors) { - ProjectImpl.UnableToSaveProjectNotification[] notifications = - NotificationsManager.getNotificationsManager().getNotificationsOfType(ProjectImpl.UnableToSaveProjectNotification.class, myProject); - if (notifications.length > 0) { - throw new SaveCancelledException(); - } - beforeSave(readonlyFiles); super.doSave(saveSessions, readonlyFiles, errors); - if (!readonlyFiles.isEmpty()) { - ReadonlyStatusHandler.OperationStatus status; - AccessToken token = ReadAction.start(); - try { - status = ReadonlyStatusHandler.getInstance(myProject).ensureFilesWritable(getFilesList(readonlyFiles)); + UnableToSaveProjectNotification[] notifications = + NotificationsManager.getNotificationsManager().getNotificationsOfType(UnableToSaveProjectNotification.class, myProject); + if (readonlyFiles.isEmpty()) { + if (notifications.length > 0) { + for (UnableToSaveProjectNotification notification : notifications) { + notification.expire(); + } } - finally { - token.finish(); + return errors; + } + + if (notifications.length > 0) { + throw new SaveCancelledException(); + } + + ReadonlyStatusHandler.OperationStatus status; + AccessToken token = ReadAction.start(); + try { + status = ReadonlyStatusHandler.getInstance(myProject).ensureFilesWritable(getFilesList(readonlyFiles)); + } + finally { + token.finish(); + } + + if (status.hasReadonlyFiles()) { + dropUnableToSaveProjectNotification(myProject, status.getReadonlyFiles()); + throw new SaveCancelledException(); + } + else { + List> oldList = new ArrayList>(readonlyFiles); + readonlyFiles.clear(); + for (Pair entry : oldList) { + errors = executeSave(entry.first, readonlyFiles, errors); } - if (status.hasReadonlyFiles()) { - ProjectImpl.dropUnableToSaveProjectNotification(myProject, status.getReadonlyFiles()); + if (errors != null) { + CompoundRuntimeException.doThrow(errors); + } + + if (!readonlyFiles.isEmpty()) { + dropUnableToSaveProjectNotification(myProject, getFilesList(readonlyFiles)); throw new SaveCancelledException(); } - else { - List> oldList = new ArrayList>(readonlyFiles); - readonlyFiles.clear(); - for (Pair entry : oldList) { - errors = executeSave(entry.first, readonlyFiles, errors); - } - - if (errors != null) { - CompoundRuntimeException.doThrow(errors); - } - - if (!readonlyFiles.isEmpty()) { - ProjectImpl.dropUnableToSaveProjectNotification(myProject, getFilesList(readonlyFiles)); - throw new SaveCancelledException(); - } - } } return errors; } + private static void dropUnableToSaveProjectNotification(@NotNull Project project, @NotNull VirtualFile[] readOnlyFiles) { + UnableToSaveProjectNotification[] notifications = + NotificationsManager.getNotificationsManager().getNotificationsOfType(UnableToSaveProjectNotification.class, project); + if (notifications.length == 0) { + Notifications.Bus.notify(new UnableToSaveProjectNotification(project, readOnlyFiles), project); + } + else { + notifications[0].myFiles = readOnlyFiles; + } + } + protected void beforeSave(@NotNull List> readonlyFiles) { } diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java index 8ab01eca0b71..0384012b6011 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java @@ -3088,8 +3088,6 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi if (!Comparing.equal(color[i], currentColor)) { currentColor = color[i] != null ? color[i] : JBColor.black; - UIUtil.updateLCDContrastBasingOnForegroundColor(g, currentColor); - g.setColor(currentColor); } diff --git a/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectImpl.java b/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectImpl.java index 1a0e16dfc640..bdc7fa836577 100644 --- a/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -19,7 +19,7 @@ import com.intellij.ide.RecentProjectsManager; import com.intellij.ide.plugins.IdeaPluginDescriptor; import com.intellij.ide.plugins.PluginManagerCore; import com.intellij.ide.startup.StartupManagerEx; -import com.intellij.notification.*; +import com.intellij.notification.NotificationsManager; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.PathMacros; import com.intellij.openapi.application.ex.ApplicationEx; @@ -54,9 +54,7 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.wm.WindowManager; import com.intellij.openapi.wm.impl.FrameTitleBuilder; -import com.intellij.util.Function; import com.intellij.util.TimedReference; -import com.intellij.util.containers.ContainerUtil; import com.intellij.util.pico.ConstructorInjectionComponentAdapter; import gnu.trove.THashSet; import org.jetbrains.annotations.NonNls; @@ -65,7 +63,6 @@ import org.jetbrains.annotations.Nullable; import org.picocontainer.*; import javax.swing.*; -import javax.swing.event.HyperlinkEvent; import java.io.File; import java.util.*; import java.util.concurrent.atomic.AtomicBoolean; @@ -520,59 +517,4 @@ public class ProjectImpl extends PlatformComponentManagerImpl implements Project protected boolean logSlowComponents() { return super.logSlowComponents() || ApplicationInfoImpl.getShadowInstance().isEAP(); } - - public static void dropUnableToSaveProjectNotification(@NotNull final Project project, final VirtualFile[] readOnlyFiles) { - final UnableToSaveProjectNotification[] notifications = - NotificationsManager.getNotificationsManager().getNotificationsOfType(UnableToSaveProjectNotification.class, project); - if (notifications.length == 0) { - Notifications.Bus.notify(new UnableToSaveProjectNotification(project, readOnlyFiles), project); - } - } - - public static class UnableToSaveProjectNotification extends Notification { - private Project myProject; - private final String[] myFileNames; - - private UnableToSaveProjectNotification(@NotNull final Project project, final VirtualFile[] readOnlyFiles) { - super("Project Settings", "Could not save project!", buildMessage(), NotificationType.ERROR, new NotificationListener() { - @Override - public void hyperlinkUpdate(@NotNull Notification notification, @NotNull HyperlinkEvent event) { - final UnableToSaveProjectNotification unableToSaveProjectNotification = (UnableToSaveProjectNotification)notification; - final Project _project = unableToSaveProjectNotification.getProject(); - notification.expire(); - - if (_project != null && !_project.isDisposed()) { - _project.save(); - } - } - }); - - myProject = project; - myFileNames = ContainerUtil.map(readOnlyFiles, new Function() { - @Override - public String fun(VirtualFile file) { - return file.getPresentableUrl(); - } - }, new String[readOnlyFiles.length]); - } - - public String[] getFileNames() { - return myFileNames; - } - - private static String buildMessage() { - return "

Unable to save project files. Please ensure project files are writable and you have permissions to modify them." + - " Try to save project again.

"; - } - - public Project getProject() { - return myProject; - } - - @Override - public void expire() { - myProject = null; - super.expire(); - } - } } diff --git a/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectManagerImpl.java index 401d3e5f9c09..f51d5cac1dce 100644 --- a/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectManagerImpl.java @@ -23,6 +23,9 @@ import com.intellij.ide.RecentProjectsManager; import com.intellij.ide.impl.ProjectUtil; import com.intellij.ide.plugins.PluginManager; import com.intellij.ide.startup.impl.StartupManagerImpl; +import com.intellij.notification.Notification; +import com.intellij.notification.NotificationListener; +import com.intellij.notification.NotificationType; import com.intellij.notification.NotificationsManager; import com.intellij.openapi.Disposable; import com.intellij.openapi.application.*; @@ -42,7 +45,6 @@ import com.intellij.openapi.startup.StartupManager; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.*; import com.intellij.openapi.util.io.FileUtil; -import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileEvent; @@ -67,6 +69,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.TestOnly; +import javax.swing.event.HyperlinkEvent; import java.io.File; import java.io.IOException; import java.util.*; @@ -976,17 +979,30 @@ public class ProjectManagerImpl extends ProjectManagerEx implements PersistentSt return true; } - private static boolean ensureCouldCloseIfUnableToSave(@NotNull final Project project) { - final ProjectImpl.UnableToSaveProjectNotification[] notifications = - NotificationsManager.getNotificationsManager().getNotificationsOfType(ProjectImpl.UnableToSaveProjectNotification.class, project); - if (notifications.length == 0) return true; + private static boolean ensureCouldCloseIfUnableToSave(@NotNull Project project) { + UnableToSaveProjectNotification[] notifications = + NotificationsManager.getNotificationsManager().getNotificationsOfType(UnableToSaveProjectNotification.class, project); + if (notifications.length == 0) { + return true; + } - final String fileNames = StringUtil.join(notifications[0].getFileNames(), "\n"); + StringBuilder message = new StringBuilder(); + message.append(String.format("%s was unable to save some project files,\nare you sure you want to close this project anyway?", + ApplicationNamesInfo.getInstance().getProductName())); - final String msg = String.format("%s was unable to save some project files,\nare you sure you want to close this project anyway?", - ApplicationNamesInfo.getInstance().getProductName()); - return Messages.showDialog(project, msg, "Unsaved Project", "Read-only files:\n\n" + fileNames, new String[]{"Yes", "No"}, 0, 1, - Messages.getWarningIcon()) == 0; + message.append("\n\nRead-only files:\n"); + int count = 0; + VirtualFile[] files = notifications[0].myFiles; + for (VirtualFile file : files) { + if (count == 10) { + message.append('\n').append("and ").append(files.length - count).append(" more").append('\n'); + } + else { + message.append(file.getPath()).append('\n'); + count++; + } + } + return Messages.showYesNoDialog(project, message.toString(), "Unsaved Project", Messages.getWarningIcon()) == Messages.YES; } @@ -1039,4 +1055,34 @@ public class ProjectManagerImpl extends ProjectManagerEx implements PersistentSt public String getPresentableName() { return ProjectBundle.message("project.default.settings"); } + + public static class UnableToSaveProjectNotification extends Notification { + private Project myProject; + public VirtualFile[] myFiles; + + public UnableToSaveProjectNotification(@NotNull final Project project, final VirtualFile[] readOnlyFiles) { + super("Project Settings", "Could not save project", "Unable to save project files. Please ensure project files are writable and you have permissions to modify them." + + " Try to save project again.", NotificationType.ERROR, new NotificationListener() { + @Override + public void hyperlinkUpdate(@NotNull Notification notification, @NotNull HyperlinkEvent event) { + final UnableToSaveProjectNotification unableToSaveProjectNotification = (UnableToSaveProjectNotification)notification; + final Project _project = unableToSaveProjectNotification.myProject; + notification.expire(); + + if (_project != null && !_project.isDisposed()) { + _project.save(); + } + } + }); + + myProject = project; + myFiles = readOnlyFiles; + } + + @Override + public void expire() { + myProject = null; + super.expire(); + } + } } diff --git a/platform/platform-impl/src/com/intellij/openapi/vfs/ex/dummy/DummyFileSystem.java b/platform/platform-impl/src/com/intellij/openapi/vfs/ex/dummy/DummyFileSystem.java index ec03da0c2342..8ed06b776d39 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vfs/ex/dummy/DummyFileSystem.java +++ b/platform/platform-impl/src/com/intellij/openapi/vfs/ex/dummy/DummyFileSystem.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -98,17 +98,6 @@ public class DummyFileSystem extends DeprecatedVirtualFileSystem implements NonP fireFileDeleted(requestor, vFile, vFile.getName(), parent); } - @Override - public void moveFile(Object requestor, @NotNull VirtualFile vFile, @NotNull VirtualFile newParent) throws IOException { - throw new UnsupportedOperationException(); - } - - @NotNull - @Override - public VirtualFile copyFile(Object requestor, @NotNull VirtualFile vFile, @NotNull VirtualFile newParent, @NotNull final String copyName) throws IOException { - throw new UnsupportedOperationException(); - } - @Override public void renameFile(Object requestor, @NotNull VirtualFile vFile, @NotNull String newName) throws IOException { final String oldName = vFile.getName(); diff --git a/platform/platform-impl/src/com/intellij/openapi/vfs/impl/http/HttpFileSystemBase.java b/platform/platform-impl/src/com/intellij/openapi/vfs/impl/http/HttpFileSystemBase.java index a2d32fd1307f..bbbfd18d93c5 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vfs/impl/http/HttpFileSystemBase.java +++ b/platform/platform-impl/src/com/intellij/openapi/vfs/impl/http/HttpFileSystemBase.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -84,27 +84,6 @@ public abstract class HttpFileSystemBase extends HttpFileSystem { return createChild(vDir, fileName, false); } - @Override - public void deleteFile(Object requestor, @NotNull VirtualFile vFile) throws IOException { - throw new UnsupportedOperationException(); - } - - @Override - public void moveFile(Object requestor, @NotNull VirtualFile vFile, @NotNull VirtualFile newParent) throws IOException { - throw new UnsupportedOperationException(); - } - - @NotNull - @Override - public VirtualFile copyFile(Object requestor, @NotNull VirtualFile vFile, @NotNull VirtualFile newParent, @NotNull final String copyName) throws IOException { - throw new UnsupportedOperationException(); - } - - @Override - public void renameFile(Object requestor, @NotNull VirtualFile vFile, @NotNull String newName) throws IOException { - throw new UnsupportedOperationException(); - } - @NotNull @Override public String extractPresentableUrl(@NotNull String path) { diff --git a/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/impl/VfsRootAccess.java b/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/impl/VfsRootAccess.java index fa18bc1dc451..aa900b5f6c7b 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/impl/VfsRootAccess.java +++ b/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/impl/VfsRootAccess.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -15,6 +15,7 @@ */ package com.intellij.openapi.vfs.newvfs.impl; +import com.intellij.openapi.Disposable; import com.intellij.openapi.application.Application; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.PathManager; @@ -24,6 +25,7 @@ import com.intellij.openapi.project.ProjectManager; import com.intellij.openapi.roots.OrderEnumerator; import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.util.Computable; +import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; @@ -170,6 +172,18 @@ public class VfsRootAccess { ourAdditionalRoots.add(FileUtil.toSystemIndependentName(root)); } } + @TestOnly + public static void allowRootAccessTemporarily(@NotNull Disposable disposable, @NotNull final String... roots) { + for (String root : roots) { + ourAdditionalRoots.add(FileUtil.toSystemIndependentName(root)); + } + Disposer.register(disposable, new Disposable() { + @Override + public void dispose() { + disallowRootAccess(roots); + } + }); + } @TestOnly public static void disallowRootAccess(@NotNull String... roots) { diff --git a/platform/platform-impl/src/com/intellij/ui/messages/SheetController.java b/platform/platform-impl/src/com/intellij/ui/messages/SheetController.java index 4dff65a20d06..35ae51bda1c6 100755 --- a/platform/platform-impl/src/com/intellij/ui/messages/SheetController.java +++ b/platform/platform-impl/src/com/intellij/ui/messages/SheetController.java @@ -111,6 +111,9 @@ public class SheetController { myResult = null; + int defaultButtonIndex = -1; + int focusedButtonIndex = -1; + for (int i = 0; i < buttons.length; i++) { String buttonTitle = buttonTitles[i]; @@ -119,13 +122,18 @@ public class SheetController { handleMnemonics(i, buttonTitle); if (buttonTitle.equals(defaultButtonTitle)) { - myDefaultButton = buttons[i]; + defaultButtonIndex = i; } if (buttonTitle.equals(focusedButton)) { - myFocusedButton = buttons[i]; + focusedButtonIndex = i; } } + myFocusedButton = (focusedButtonIndex == -1) ? buttons[buttons.length - 1] : buttons[focusedButtonIndex]; + myDefaultButton = (defaultButtonIndex == -1 && focusedButtonIndex != defaultButtonIndex) ? buttons[0] : buttons[defaultButtonIndex]; + + myDefaultButton = buttons[0]; + if (myFocusedButton == null) { myFocusedButton = myDefaultButton; } diff --git a/platform/platform-resources/src/idea/Keymap_Emacs.xml b/platform/platform-resources/src/idea/Keymap_Emacs.xml index ef56d945f6af..1278dc7ee5ea 100644 --- a/platform/platform-resources/src/idea/Keymap_Emacs.xml +++ b/platform/platform-resources/src/idea/Keymap_Emacs.xml @@ -161,7 +161,6 @@ - @@ -262,7 +261,7 @@ - + diff --git a/platform/platform-resources/src/idea/PlatformActions.xml b/platform/platform-resources/src/idea/PlatformActions.xml index d1f98e7d62ae..e9ee321e85f1 100644 --- a/platform/platform-resources/src/idea/PlatformActions.xml +++ b/platform/platform-resources/src/idea/PlatformActions.xml @@ -635,7 +635,7 @@ - diff --git a/platform/testFramework/src/com/intellij/mock/MockVirtualFileSystem.java b/platform/testFramework/src/com/intellij/mock/MockVirtualFileSystem.java index 9854cea82835..848fda627e29 100644 --- a/platform/testFramework/src/com/intellij/mock/MockVirtualFileSystem.java +++ b/platform/testFramework/src/com/intellij/mock/MockVirtualFileSystem.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -25,7 +25,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.File; -import java.io.IOException; import java.util.Collection; import java.util.Map; @@ -61,39 +60,6 @@ public class MockVirtualFileSystem extends DeprecatedVirtualFileSystem { public void refresh(boolean asynchronous) { } - @Override - public void deleteFile(Object requestor, @NotNull VirtualFile vFile) throws IOException { - throw new UnsupportedOperationException(); - } - - @Override - public void moveFile(Object requestor, @NotNull VirtualFile vFile, @NotNull VirtualFile newParent) throws IOException { - throw new UnsupportedOperationException(); - } - - @NotNull - @Override - public VirtualFile copyFile(Object requestor, @NotNull VirtualFile vFile, @NotNull VirtualFile newParent, @NotNull final String copyName) throws IOException { - throw new UnsupportedOperationException(); - } - - @Override - public void renameFile(Object requestor, @NotNull VirtualFile vFile, @NotNull String newName) throws IOException { - throw new UnsupportedOperationException(); - } - - @NotNull - @Override - public VirtualFile createChildFile(Object requestor, @NotNull VirtualFile vDir, @NotNull String fileName) throws IOException { - throw new UnsupportedOperationException(); - } - - @Override - @NotNull - public VirtualFile createChildDirectory(Object requestor, @NotNull VirtualFile vDir, @NotNull String dirName) throws IOException { - throw new IOException(); - } - @Override public VirtualFile refreshAndFindFileByPath(@NotNull String path) { return findFileByPath(path); diff --git a/platform/util/src/com/intellij/openapi/util/io/FileAttributes.java b/platform/util/src/com/intellij/openapi/util/io/FileAttributes.java index f3b417373119..543377a2f564 100644 --- a/platform/util/src/com/intellij/openapi/util/io/FileAttributes.java +++ b/platform/util/src/com/intellij/openapi/util/io/FileAttributes.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -24,7 +24,6 @@ import static com.intellij.util.BitUtil.isSet; * @version 11.1 * @see FileSystemUtil#getAttributes(String) */ -@SuppressWarnings("OctalInteger") public final class FileAttributes { public enum Type { FILE, DIRECTORY, SPECIAL } diff --git a/platform/util/src/com/intellij/util/ui/GraphicsUtil.java b/platform/util/src/com/intellij/util/ui/GraphicsUtil.java index 21b0aa6bffa1..da223902b78e 100644 --- a/platform/util/src/com/intellij/util/ui/GraphicsUtil.java +++ b/platform/util/src/com/intellij/util/ui/GraphicsUtil.java @@ -71,8 +71,6 @@ public class GraphicsUtil { g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, enableAA ? RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HBGR : RenderingHints.VALUE_TEXT_ANTIALIAS_OFF); } - - UIUtil.setHintingForLCDText(g); } } diff --git a/platform/util/src/com/intellij/util/ui/UIUtil.java b/platform/util/src/com/intellij/util/ui/UIUtil.java index 75258ab3d519..631dbd2c7171 100644 --- a/platform/util/src/com/intellij/util/ui/UIUtil.java +++ b/platform/util/src/com/intellij/util/ui/UIUtil.java @@ -1771,56 +1771,6 @@ public class UIUtil { Map map = (Map)tk.getDesktopProperty("awt.font.desktophints"); if (map != null) { g2d.addRenderingHints(map); - setHintingForLCDText(g2d); - } - } - - private static int THEME_BASED_TEXT_LCD_CONTRAST = 0; - private static int BEST_DARK_LCD_CONTRAST = 250; - private static int BEST_LIGHT_LCD_CONTRAST = 100; - - public static int getContrastForColor (Color color) { - // YIQ - int yiqValue = ((color.getRed() * 299) + (color.getGreen() * 587) + (color.getBlue() * 114)) / 1000; - return yiqValue * 150/255 + 100; - } - - - public static void updateLCDContrastBasingOnForegroundColor(Graphics g, Color color) { - Graphics2D g2d = (Graphics2D)g; - - if (SystemInfo.isJetbrainsJvm && Registry.is("force.subpixel.hinting")) { - g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB); - g2d.setRenderingHint(RenderingHints.KEY_TEXT_LCD_CONTRAST, getContrastForColor(color)); - } - } - - public static void setHintingForLCDText(Graphics2D g2d) { - if (SystemInfo.isJetbrainsJvm && Registry.is("force.subpixel.hinting")) { - g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB); - - // According to JavaDoc we can set values form 100 to 250 - // So we can use 0 as a special flag - int registryLcdContrastValue = Registry.intValue("lcd.contrast.value"); - if (registryLcdContrastValue == THEME_BASED_TEXT_LCD_CONTRAST) { - if (isUnderDarcula()) { - registryLcdContrastValue = BEST_DARK_LCD_CONTRAST; - } else { - registryLcdContrastValue = BEST_LIGHT_LCD_CONTRAST; - } - } - - // Wrong values prevent IDE from start - // So we have to be careful - if (registryLcdContrastValue < 100) { - LOG.warn("Wrong value of text LCD contrast " + registryLcdContrastValue); - registryLcdContrastValue = 100; - } else if (registryLcdContrastValue > 250) { - LOG.warn("Wrong value of text LCD contrast " + registryLcdContrastValue); - registryLcdContrastValue = 250; - } - - g2d.setRenderingHint(RenderingHints.KEY_TEXT_LCD_CONTRAST, registryLcdContrastValue); } } diff --git a/platform/vcs-api/src/com/intellij/openapi/vcs/vfs/VcsFileSystem.java b/platform/vcs-api/src/com/intellij/openapi/vcs/vfs/VcsFileSystem.java index 8cea93b349c3..244dc87f58b7 100644 --- a/platform/vcs-api/src/com/intellij/openapi/vcs/vfs/VcsFileSystem.java +++ b/platform/vcs-api/src/com/intellij/openapi/vcs/vfs/VcsFileSystem.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -21,11 +21,8 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileManager; import org.jetbrains.annotations.NotNull; -import java.io.IOException; - public class VcsFileSystem extends DeprecatedVirtualFileSystem { - public static final String COULD_NOT_IMPLEMENT_MESSAGE = VcsBundle.message("exception.text.internal.errror.could.not.implement.method"); private static final String PROTOCOL = "vcs"; @@ -72,37 +69,4 @@ public class VcsFileSystem extends DeprecatedVirtualFileSystem { protected void fireBeforeContentsChange(Object requestor, @NotNull VirtualFile file) { super.fireBeforeContentsChange(requestor, file); } - - @Override - public void deleteFile(Object requestor, @NotNull VirtualFile vFile) throws IOException { - throw new RuntimeException(COULD_NOT_IMPLEMENT_MESSAGE); - } - - @Override - public void moveFile(Object requestor, @NotNull VirtualFile vFile, @NotNull VirtualFile newParent) throws IOException { - throw new RuntimeException(COULD_NOT_IMPLEMENT_MESSAGE); - } - - @NotNull - @Override - public VirtualFile copyFile(Object requestor, @NotNull VirtualFile vFile, @NotNull VirtualFile newParent, @NotNull final String copyName) throws IOException { - throw new RuntimeException(COULD_NOT_IMPLEMENT_MESSAGE); - } - - @Override - public void renameFile(Object requestor, @NotNull VirtualFile vFile, @NotNull String newName) throws IOException { - throw new RuntimeException(COULD_NOT_IMPLEMENT_MESSAGE); - } - - @NotNull - @Override - public VirtualFile createChildFile(Object requestor, @NotNull VirtualFile vDir, @NotNull String fileName) throws IOException { - throw new RuntimeException(COULD_NOT_IMPLEMENT_MESSAGE); - } - - @Override - @NotNull - public VirtualFile createChildDirectory(Object requestor, @NotNull VirtualFile vDir, @NotNull String dirName) throws IOException { - throw new RuntimeException(COULD_NOT_IMPLEMENT_MESSAGE); - } } diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/META-INF/InspectionGadgets.xml b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/META-INF/InspectionGadgets.xml index afd0b80d0cc4..21ba183afedc 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/META-INF/InspectionGadgets.xml +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/META-INF/InspectionGadgets.xml @@ -1283,6 +1283,10 @@ key="bigdecimal.legacy.method.display.name" groupBundle="messages.InspectionsBundle" groupKey="group.names.language.level.specific.issues.and.migration.aids" enabledByDefault="false" level="WARNING" implementationClass="com.siyeh.ig.migration.BigDecimalLegacyMethodInspection"/> + #ref dangling.javadoc.display.name=Dangling Javadoc comment dangling.javadoc.problem.descriptor=Dangling Javadoc comment #loc dangling.javadoc.convert.quickfix=Replace with block comment -dangling.javadoc.delete.quickfix=Remove dangling comment \ No newline at end of file +dangling.javadoc.delete.quickfix=Remove dangling comment +equals.replaceable.by.objects.call.display.name='equals()' expression replaceable by 'Objects.equals()' expression +equals.replaceable.by.objects.call.problem.descriptor=#ref replaceable by 'Objects.equals()' expression #loc +equals.replaceable.by.objects.call.quickfix=Replace with 'Objects.equals()' expression \ No newline at end of file diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/migration/EqualsReplaceableByObjectsCallInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/migration/EqualsReplaceableByObjectsCallInspection.java new file mode 100644 index 000000000000..75b59118fee7 --- /dev/null +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/migration/EqualsReplaceableByObjectsCallInspection.java @@ -0,0 +1,209 @@ +/* + * Copyright 2000-2015 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.siyeh.ig.migration; + +import com.intellij.codeInspection.ProblemDescriptor; +import com.intellij.openapi.project.Project; +import com.intellij.psi.*; +import com.intellij.psi.tree.IElementType; +import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.psi.util.PsiUtil; +import com.siyeh.HardcodedMethodConstants; +import com.siyeh.InspectionGadgetsBundle; +import com.siyeh.ig.BaseInspection; +import com.siyeh.ig.BaseInspectionVisitor; +import com.siyeh.ig.InspectionGadgetsFix; +import com.siyeh.ig.PsiReplacementUtil; +import com.siyeh.ig.psiutils.ExpressionUtils; +import com.siyeh.ig.psiutils.ParenthesesUtils; +import com.siyeh.ig.psiutils.VariableAccessUtils; +import org.jetbrains.annotations.Nls; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * @author Bas Leijdekkers + */ +public class EqualsReplaceableByObjectsCallInspection extends BaseInspection { + + @Nls + @NotNull + @Override + public String getDisplayName() { + return InspectionGadgetsBundle.message("equals.replaceable.by.objects.call.display.name"); + } + + @NotNull + @Override + protected String buildErrorString(Object... infos) { + return InspectionGadgetsBundle.message("equals.replaceable.by.objects.call.problem.descriptor"); + } + + @Nullable + @Override + protected InspectionGadgetsFix buildFix(Object... infos) { + return new EqualsReplaceableByObjectsCallFix((String)infos[0], (String)infos[1], (Boolean)infos[2]); + } + + private static class EqualsReplaceableByObjectsCallFix extends InspectionGadgetsFix { + + private final String myName1; + private final String myName2; + private final Boolean myEquals; + + public EqualsReplaceableByObjectsCallFix(String name1, String name2, Boolean equals) { + myName1 = name1; + myName2 = name2; + myEquals = equals; + } + + @Nls + @NotNull + @Override + public String getName() { + return InspectionGadgetsBundle.message("equals.replaceable.by.objects.call.quickfix"); + } + + @NotNull + @Override + public String getFamilyName() { + return getName(); + } + + @Override + protected void doFix(Project project, ProblemDescriptor descriptor) { + final PsiElement element = descriptor.getPsiElement(); + if (!(element instanceof PsiBinaryExpression)) { + return; + } + final PsiBinaryExpression expression = (PsiBinaryExpression)element; + if (myEquals) { + PsiReplacementUtil.replaceExpressionAndShorten(expression, "java.util.Objects.equals(" + myName1 + "," + myName2 + ")"); + } + else { + PsiReplacementUtil.replaceExpressionAndShorten(expression, "!java.util.Objects.equals(" + myName1 + "," + myName2 + ")"); + } + } + } + + @Override + public boolean shouldInspect(PsiFile file) { + return PsiUtil.isLanguageLevel7OrHigher(file); + } + + @Override + public BaseInspectionVisitor buildVisitor() { + return new EqualsReplaceableByObjectsCallVisitor(); + } + + private static class EqualsReplaceableByObjectsCallVisitor extends BaseInspectionVisitor { + + @Override + public void visitBinaryExpression(PsiBinaryExpression expression) { + final IElementType tokenType = expression.getOperationTokenType(); + if (JavaTokenType.ANDAND.equals(tokenType)) { + final PsiVariable variable = ExpressionUtils.getVariableFromNullComparison(expression.getLOperand(), false); + if (variable == null) { + return; + } + final PsiVariable otherVariable = getArgumentFromEqualsCallOn(expression.getROperand(), variable); + if (otherVariable == null) { + return; + } + checkEqualityBefore(expression, true, variable, otherVariable); + } + else if (JavaTokenType.OROR.equals(tokenType)) { + final PsiVariable variable = ExpressionUtils.getVariableFromNullComparison(expression.getLOperand(), true); + if (variable == null) { + return; + } + final PsiExpression rhs = ParenthesesUtils.stripParentheses(expression.getROperand()); + if (!(rhs instanceof PsiPrefixExpression)) { + return; + } + final PsiPrefixExpression prefixExpression = (PsiPrefixExpression)rhs; + if (!JavaTokenType.EXCL.equals(prefixExpression.getOperationTokenType())) { + return; + } + final PsiVariable otherVariable = getArgumentFromEqualsCallOn(prefixExpression.getOperand(), variable); + if (otherVariable == null) { + return; + } + checkEqualityBefore(expression, false, variable, otherVariable); + } + } + + private void checkEqualityBefore(PsiExpression expression, boolean equals, PsiVariable variable1, PsiVariable variable2) { + final PsiElement parent = PsiTreeUtil.skipParentsOfType(expression, PsiParenthesizedExpression.class); + if (parent instanceof PsiBinaryExpression) { + final PsiBinaryExpression binaryExpression = (PsiBinaryExpression)parent; + if (PsiTreeUtil.isAncestor(binaryExpression.getROperand(), expression, false)) { + final PsiExpression lhs = binaryExpression.getLOperand(); + if (isEquality(lhs, equals, variable1, variable2)) { + registerError(binaryExpression, variable1.getName(), variable2.getName(), Boolean.valueOf(equals)); + return; + } + } + } + registerError(expression, variable1.getName(), variable2.getName(), Boolean.valueOf(equals)); + } + + private static boolean isEquality(PsiExpression expression, boolean equals, PsiVariable variable1, PsiVariable variable2) { + expression = ParenthesesUtils.stripParentheses(expression); + if (!(expression instanceof PsiBinaryExpression)) { + return false; + } + final PsiBinaryExpression binaryExpression = (PsiBinaryExpression)expression; + if (equals) { + if (!JavaTokenType.EQEQ.equals(binaryExpression.getOperationTokenType())) { + return false; + } + } + else { + if (!JavaTokenType.NE.equals(binaryExpression.getOperationTokenType())) { + return false; + } + } + final PsiExpression lhs = binaryExpression.getLOperand(); + final PsiExpression rhs = binaryExpression.getROperand(); + return (VariableAccessUtils.evaluatesToVariable(lhs, variable1) && VariableAccessUtils.evaluatesToVariable(rhs, variable2)) || + (VariableAccessUtils.evaluatesToVariable(lhs, variable2) && VariableAccessUtils.evaluatesToVariable(rhs, variable1)); + } + + private static PsiVariable getArgumentFromEqualsCallOn(PsiExpression expression, @NotNull PsiVariable variable) { + expression = ParenthesesUtils.stripParentheses(expression); + if (!(expression instanceof PsiMethodCallExpression)) { + return null; + } + final PsiMethodCallExpression methodCallExpression = (PsiMethodCallExpression)expression; + final PsiReferenceExpression methodExpression = methodCallExpression.getMethodExpression(); + final String methodName = methodExpression.getReferenceName(); + if (!HardcodedMethodConstants.EQUALS.equals(methodName)) { + return null; + } + final PsiExpression qualifier = methodExpression.getQualifierExpression(); + if (!VariableAccessUtils.evaluatesToVariable(qualifier, variable)) { + return null; + } + final PsiExpressionList argumentList = methodCallExpression.getArgumentList(); + final PsiExpression[] expressions = argumentList.getExpressions(); + if (expressions.length != 1) { + return null; + } + return ExpressionUtils.getVariable(expressions[0]); + } + } +} diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ExpressionUtils.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ExpressionUtils.java index 11080eb30fc5..9b3f8132f878 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ExpressionUtils.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ExpressionUtils.java @@ -593,4 +593,48 @@ public class ExpressionUtils { final IElementType tokenType = prefixExpression.getOperationTokenType(); return JavaTokenType.MINUS.equals(tokenType); } + + @Nullable + public static PsiVariable getVariableFromNullComparison(PsiExpression expression, boolean equals) { + expression = ParenthesesUtils.stripParentheses(expression); + if (!(expression instanceof PsiPolyadicExpression)) { + return null; + } + final PsiPolyadicExpression polyadicExpression = (PsiPolyadicExpression)expression; + final IElementType tokenType = polyadicExpression.getOperationTokenType(); + if (equals) { + if (!JavaTokenType.EQEQ.equals(tokenType)) { + return null; + } + } + else { + if (!JavaTokenType.NE.equals(tokenType)) { + return null; + } + } + final PsiExpression[] operands = polyadicExpression.getOperands(); + if (operands.length != 2) { + return null; + } + if (PsiType.NULL.equals(operands[0].getType())) { + return getVariable(operands[1]); + } + else if (PsiType.NULL.equals(operands[1].getType())) { + return getVariable(operands[0]); + } + return null; + } + + public static PsiVariable getVariable(PsiExpression expression) { + expression = ParenthesesUtils.stripParentheses(expression); + if (!(expression instanceof PsiReferenceExpression)) { + return null; + } + final PsiReferenceExpression referenceExpression = (PsiReferenceExpression)expression; + final PsiElement target = referenceExpression.resolve(); + if (!(target instanceof PsiVariable)) { + return null; + } + return (PsiVariable)target; + } } \ No newline at end of file diff --git a/plugins/InspectionGadgets/src/inspectionDescriptions/EqualsReplaceableByObjectsCall.html b/plugins/InspectionGadgets/src/inspectionDescriptions/EqualsReplaceableByObjectsCall.html new file mode 100644 index 000000000000..2bb4e0d4c175 --- /dev/null +++ b/plugins/InspectionGadgets/src/inspectionDescriptions/EqualsReplaceableByObjectsCall.html @@ -0,0 +1,12 @@ + + +Reports expressions that can be replaced with a call to java.util.Objects.equals(), which is available since JDK 1.7. +For example: +
a != null && a.equals(b)
+ +

+This inspection only reports if the project or module is configured to use a language level of 7 or higher. +

+New in 15 + + \ No newline at end of file diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/migration/equals_replaceable_by_objects_call/EqualsReplaceableByObjectsCall.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/migration/equals_replaceable_by_objects_call/EqualsReplaceableByObjectsCall.java new file mode 100644 index 000000000000..fa187d730513 --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/migration/equals_replaceable_by_objects_call/EqualsReplaceableByObjectsCall.java @@ -0,0 +1,7 @@ +class EqualsReplaceableByObjectsCall { + void yyy(Object a, Object b) { + boolean c = (a != null) && a.equals(b); + boolean d = (a != b) && (a == null || !a.equals(b)); + boolean e = ((a) == (b)) || ((a) != (null) && (a).equals((b))); + } +} \ No newline at end of file diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/migration/EqualsReplaceableByObjectsCallInspectionTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/migration/EqualsReplaceableByObjectsCallInspectionTest.java new file mode 100644 index 000000000000..38e5b432ddbc --- /dev/null +++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/migration/EqualsReplaceableByObjectsCallInspectionTest.java @@ -0,0 +1,37 @@ +/* + * Copyright 2000-2015 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.siyeh.ig.migration; + +import com.intellij.codeInspection.InspectionProfileEntry; +import com.siyeh.ig.LightInspectionTestCase; +import junit.framework.TestCase; +import org.jetbrains.annotations.Nullable; + +/** + * @author Bas Leijdekkers + */ +public class EqualsReplaceableByObjectsCallInspectionTest extends LightInspectionTestCase { + + public void testEqualsReplaceableByObjectsCall() { + doTest(); + } + + @Nullable + @Override + protected InspectionProfileEntry getInspection() { + return new EqualsReplaceableByObjectsCallInspection(); + } +} \ No newline at end of file diff --git a/plugins/commander/src/com/intellij/ide/commander/PsiDiffContentFactory.java b/plugins/commander/src/com/intellij/ide/commander/PsiDiffContentFactory.java index 27e94a466719..e841d19f0214 100644 --- a/plugins/commander/src/com/intellij/ide/commander/PsiDiffContentFactory.java +++ b/plugins/commander/src/com/intellij/ide/commander/PsiDiffContentFactory.java @@ -52,7 +52,7 @@ public class PsiDiffContentFactory { if (containingFile == null) { String text = psiElement.getText(); if (text == null) return null; - return DiffContentFactory.getInstance().create(text, psiElement.getLanguage().getAssociatedFileType()); + return DiffContentFactory.getInstance().create(text, psiElement.getLanguage().getAssociatedFileType(), false); } DocumentContent wholeFileContent = DiffContentFactory.getInstance().createDocument(psiElement.getProject(), containingFile.getVirtualFile()); if (wholeFileContent == null) return null; diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/GradleManager.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/GradleManager.java index 30c8e07ca4b2..84840daa87db 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/GradleManager.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/GradleManager.java @@ -17,27 +17,20 @@ package org.jetbrains.plugins.gradle; import com.intellij.execution.ExecutionException; import com.intellij.execution.configurations.SimpleJavaParameters; -import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.externalSystem.ExternalSystemAutoImportAware; import com.intellij.openapi.externalSystem.ExternalSystemConfigurableAware; import com.intellij.openapi.externalSystem.ExternalSystemManager; import com.intellij.openapi.externalSystem.ExternalSystemUiAware; -import com.intellij.openapi.externalSystem.model.DataNode; import com.intellij.openapi.externalSystem.model.ProjectSystemId; import com.intellij.openapi.externalSystem.model.execution.ExternalSystemTaskExecutionSettings; import com.intellij.openapi.externalSystem.model.execution.ExternalTaskExecutionInfo; import com.intellij.openapi.externalSystem.model.execution.ExternalTaskPojo; import com.intellij.openapi.externalSystem.model.project.ExternalProjectPojo; -import com.intellij.openapi.externalSystem.model.project.ProjectData; -import com.intellij.openapi.externalSystem.service.execution.ProgressExecutionMode; -import com.intellij.openapi.externalSystem.service.project.ExternalProjectRefreshCallback; import com.intellij.openapi.externalSystem.service.project.ExternalSystemProjectResolver; import com.intellij.openapi.externalSystem.service.project.autoimport.CachingExternalSystemAutoImportAware; -import com.intellij.openapi.externalSystem.service.project.manage.ProjectDataManager; import com.intellij.openapi.externalSystem.service.ui.DefaultExternalSystemUiAware; import com.intellij.openapi.externalSystem.task.ExternalSystemTaskManager; -import com.intellij.openapi.externalSystem.util.DisposeAwareProjectChange; import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil; import com.intellij.openapi.externalSystem.util.ExternalSystemConstants; import com.intellij.openapi.externalSystem.util.ExternalSystemUtil; @@ -45,7 +38,6 @@ import com.intellij.openapi.fileChooser.FileChooserDescriptor; import com.intellij.openapi.options.Configurable; import com.intellij.openapi.project.Project; import com.intellij.openapi.projectRoots.Sdk; -import com.intellij.openapi.roots.ex.ProjectRootManagerEx; import com.intellij.openapi.startup.StartupActivity; import com.intellij.openapi.util.AtomicNotNullLazyValue; import com.intellij.openapi.util.NotNullLazyValue; @@ -291,38 +283,6 @@ public class GradleManager ensureProjectsRefresh(); } - @Override - public void onProjectsLinked(@NotNull Collection settings) { - final ProjectDataManager projectDataManager = ServiceManager.getService(ProjectDataManager.class); - for (GradleProjectSettings gradleProjectSettings : settings) { - ExternalSystemUtil.refreshProject( - project, GradleConstants.SYSTEM_ID, gradleProjectSettings.getExternalProjectPath(), - new ExternalProjectRefreshCallback() { - @Override - public void onSuccess(@Nullable final DataNode externalProject) { - if (externalProject == null) { - return; - } - ExternalSystemApiUtil.executeProjectChangeAction(true, new DisposeAwareProjectChange(project) { - @Override - public void execute() { - ProjectRootManagerEx.getInstanceEx(project).mergeRootsChangesDuring(new Runnable() { - @Override - public void run() { - projectDataManager.importData(externalProject.getKey(), Collections.singleton(externalProject), project, true); - } - }); - } - }); - } - - @Override - public void onFailure(@NotNull String errorMessage, @Nullable String errorDetails) { - } - }, false, ProgressExecutionMode.MODAL_SYNC); - } - } - private void ensureProjectsRefresh() { ExternalSystemUtil.refreshProjects(project, GradleConstants.SYSTEM_ID, true); } diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/compiler/GradleBuildProcessParametersProvider.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/compiler/GradleBuildProcessParametersProvider.java index c8ac2eb5699e..3b0d8a968747 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/compiler/GradleBuildProcessParametersProvider.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/compiler/GradleBuildProcessParametersProvider.java @@ -80,7 +80,7 @@ public class GradleBuildProcessParametersProvider extends BuildProcessParameters File[] children = FileUtil.notNullize(gradleLibDir.listFiles()); for (File child : children) { final String fileName = child.getName(); - if (fileName.endsWith(".jar") && !fileName.startsWith("logback-") && child.isFile()) { + if (fileName.endsWith(".jar") && child.isFile()) { classpath.add(child.getAbsolutePath()); } } diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/execution/UnsupportedCancellationToken.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/execution/UnsupportedCancellationToken.java new file mode 100644 index 000000000000..06588f9c78f0 --- /dev/null +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/execution/UnsupportedCancellationToken.java @@ -0,0 +1,36 @@ +/* + * Copyright 2000-2015 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 org.jetbrains.plugins.gradle.service.execution; + +import com.intellij.openapi.externalSystem.service.execution.NotSupportedException; +import org.gradle.tooling.CancellationToken; +import org.gradle.tooling.CancellationTokenSource; + +/** + * @author Vladislav.Soroka + * @since 3/25/2015 + */ +public class UnsupportedCancellationToken implements CancellationTokenSource { + @Override + public void cancel() { + throw new NotSupportedException("Configured version of Gradle does not support cancellation. \nPlease, use Gradle 2.1 or newer."); + } + + @Override + public CancellationToken token() { + return null; + } +} diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/BaseGradleProjectResolverExtension.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/BaseGradleProjectResolverExtension.java index 7de88fe936da..84fe4f12b71c 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/BaseGradleProjectResolverExtension.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/BaseGradleProjectResolverExtension.java @@ -370,8 +370,11 @@ public class BaseGradleProjectResolverExtension implements GradleProjectResolver @NotNull @Override public Set getExtraProjectModelClasses() { - return ContainerUtil.set( - GradleBuild.class, ExternalProject.class, ModuleExtendedModel.class, BuildScriptClasspathModel.class); + Set result = ContainerUtil.set(GradleBuild.class, ExternalProject.class, ModuleExtendedModel.class); + if (!resolverCtx.isPreviewMode()) { + result.add(BuildScriptClasspathModel.class); + } + return result; } @NotNull diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleExecutionHelper.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleExecutionHelper.java index 19337a39a90c..a9c51a871b03 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleExecutionHelper.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleExecutionHelper.java @@ -35,6 +35,7 @@ import org.gradle.tooling.internal.consumer.DefaultExecutorServiceFactory; import org.gradle.tooling.internal.consumer.DefaultGradleConnector; import org.gradle.tooling.internal.consumer.Distribution; import org.gradle.tooling.model.build.BuildEnvironment; +import org.gradle.util.GradleVersion; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.gradle.settings.DistributionType; @@ -443,7 +444,18 @@ public class GradleExecutionHelper { } @Nullable - private static BuildEnvironment getBuildEnvironment(@NotNull ProjectConnection connection) { + public static GradleVersion getGradleVersion(@NotNull ProjectConnection connection) { + final BuildEnvironment buildEnvironment = getBuildEnvironment(connection); + + GradleVersion gradleVersion = null; + if (buildEnvironment != null) { + gradleVersion = GradleVersion.version(buildEnvironment.getGradle().getGradleVersion()); + } + return gradleVersion; + } + + @Nullable + public static BuildEnvironment getBuildEnvironment(@NotNull ProjectConnection connection) { try { return connection.getModel(BuildEnvironment.class); } diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleProjectResolver.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleProjectResolver.java index 4f966f73f09d..83de04c74e6f 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleProjectResolver.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleProjectResolver.java @@ -44,10 +44,12 @@ import org.gradle.tooling.model.build.BuildEnvironment; import org.gradle.tooling.model.idea.BasicIdeaProject; import org.gradle.tooling.model.idea.IdeaModule; import org.gradle.tooling.model.idea.IdeaProject; +import org.gradle.util.GradleVersion; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.gradle.model.ProjectImportAction; import org.jetbrains.plugins.gradle.remote.impl.GradleLibraryNamesMixer; +import org.jetbrains.plugins.gradle.service.execution.UnsupportedCancellationToken; import org.jetbrains.plugins.gradle.settings.ClassHolder; import org.jetbrains.plugins.gradle.settings.GradleExecutionSettings; import org.jetbrains.plugins.gradle.util.GradleConstants; @@ -150,6 +152,11 @@ public class GradleProjectResolver implements ExternalSystemProjectResolver buildActionExecutor = resolverCtx.getConnection().action(projectImportAction); @@ -169,6 +176,9 @@ public class GradleProjectResolver implements ExternalSystemProjectResolver resultProjectDataNode, @NotNull final ProjectConnectionDataNodeFunction projectConnectionDataNodeFunction) { diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/task/GradleTaskManager.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/task/GradleTaskManager.java index 3df75378985e..2120f77a3a3b 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/task/GradleTaskManager.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/task/GradleTaskManager.java @@ -32,11 +32,13 @@ import org.gradle.tooling.BuildLauncher; import org.gradle.tooling.CancellationTokenSource; import org.gradle.tooling.GradleConnector; import org.gradle.tooling.ProjectConnection; +import org.gradle.util.GradleVersion; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.gradle.service.project.GradleExecutionHelper; import org.jetbrains.plugins.gradle.service.project.GradleProjectResolver; import org.jetbrains.plugins.gradle.service.project.GradleProjectResolverExtension; +import org.jetbrains.plugins.gradle.service.execution.UnsupportedCancellationToken; import org.jetbrains.plugins.gradle.settings.GradleExecutionSettings; import org.jetbrains.plugins.gradle.util.GradleConstants; @@ -118,11 +120,17 @@ public class GradleTaskManager extends AbstractExternalSystemTaskManager { - - @Override - protected void append(ILoggingEvent event) { - ThrowableProxy throwableProxy = - event.getThrowableProxy() instanceof ThrowableProxy ? (ThrowableProxy)event.getThrowableProxy() : null; - Throwable throwable = throwableProxy == null ? null : throwableProxy.getThrowable(); - - switch (event.getLevel().toInt()) { - case Level.ALL_INT: - case Level.TRACE_INT: - case Level.DEBUG_INT: - LOG.debug(event.getFormattedMessage(), throwable); - break; - case Level.INFO_INT: - LOG.info(event.getFormattedMessage(), throwable); - break; - case Level.WARN_INT: - LOG.warn(event.getFormattedMessage(), throwable); - break; - case Level.ERROR_INT: - LOG.error(event.getFormattedMessage(), throwable); - break; - case Level.OFF_INT: - break; - default: - LOG.debug(event.getFormattedMessage(), throwable); - break; - } - - if (NonCancellableConsumerConnectionAdapter.class.getName().equals(event.getLoggerName()) && - GRADLE_PROVIDER_DOES_NOT_SUPPORT_CANCELLATION_MESSAGE.equals(event.getMessage())) { - // see org.gradle.tooling.internal.consumer.connection.NonCancellableConsumerConnectionAdapter#handleCancellationPreOperation - - ExternalSystemProcessingManager processingManager = ServiceManager.getService(ExternalSystemProcessingManager.class); - final List canceledTasks = - processingManager - .findTasksOfState(GradleConstants.SYSTEM_ID, ExternalSystemTaskState.CANCELING, ExternalSystemTaskState.CANCELED); - for (ExternalSystemTask canceledTask : canceledTasks) { - final Project project = canceledTask.getId().findProject(); - if (project != null) { - String errorMessage = String.format("%s Open Gradle settings", - "Configured version of Gradle does not support cancellation. Please, use Gradle 2.1 or newer.\n", - OpenGradleSettingsCallback.ID); - NotificationData notification = new NotificationData( - "Gradle supports cancellation since 2.1 version", errorMessage, NotificationCategory.WARNING, - NotificationSource.PROJECT_SYNC); - notification.setListener(OpenGradleSettingsCallback.ID, new OpenGradleSettingsCallback(project)); - notification.setBalloonNotification(true); - ExternalSystemNotificationManager.getInstance(project).showNotification(GradleConstants.SYSTEM_ID, notification); - } - } - } - } - } } diff --git a/plugins/gradle/tooling-extension-api/src/org/jetbrains/plugins/gradle/model/ProjectImportAction.java b/plugins/gradle/tooling-extension-api/src/org/jetbrains/plugins/gradle/model/ProjectImportAction.java index 5b20894b318d..37b20de6ba83 100644 --- a/plugins/gradle/tooling-extension-api/src/org/jetbrains/plugins/gradle/model/ProjectImportAction.java +++ b/plugins/gradle/tooling-extension-api/src/org/jetbrains/plugins/gradle/model/ProjectImportAction.java @@ -55,10 +55,6 @@ public class ProjectImportAction implements BuildAction myVisited = new HashSet(); /** * @param aClass * @return aClass - * @throws ClassNotFoundException when any of the classes can't be loaded, that's referenced in aClass' fields, methods etc. recursively + * @throws ClassNotFoundException when any of the classes can't be loaded, that's referenced in aClass' fields, methods etc. recursively */ public Class loadDependencies(Class aClass) throws ClassNotFoundException { - loadClassDependencies(aClass, new HashSet()); + loadClassDependencies(aClass); return aClass; } - private void loadTypeDependencies(Type aClass, Set visited) throws ClassNotFoundException { + private void loadTypeDependencies(Type aClass) throws ClassNotFoundException { if (aClass instanceof Class) { - loadClassDependencies((Class)aClass, visited); + loadClassDependencies((Class)aClass); } else if (aClass instanceof ParameterizedType) { - loadTypeDependencies(((ParameterizedType)aClass).getOwnerType(), visited); + loadTypeDependencies(((ParameterizedType)aClass).getOwnerType()); for (Type type : ((ParameterizedType)aClass).getActualTypeArguments()) { - loadTypeDependencies(type, visited); + loadTypeDependencies(type); } } else if (aClass instanceof WildcardType) { for (Type type : ((WildcardType)aClass).getLowerBounds()) { - loadTypeDependencies(type, visited); + loadTypeDependencies(type); } for (Type type : ((WildcardType)aClass).getUpperBounds()) { - loadTypeDependencies(type, visited); + loadTypeDependencies(type); } } else if (aClass instanceof GenericArrayType) { - loadTypeDependencies(((GenericArrayType)aClass).getGenericComponentType(), visited); + loadTypeDependencies(((GenericArrayType)aClass).getGenericComponentType()); } } - protected void loadClassDependencies(Class aClass, Set visited) throws ClassNotFoundException { + protected void loadClassDependencies(Class aClass) throws ClassNotFoundException { String name = aClass.getName(); - if (visited.add(aClass)) { + if (myVisited.add(aClass)) { try { for (Method method : aClass.getDeclaredMethods()) { - loadTypeDependencies(method.getGenericReturnType(), visited); + loadTypeDependencies(method.getGenericReturnType()); for (Type type : method.getGenericExceptionTypes()) { - loadTypeDependencies(type, visited); + loadTypeDependencies(type); } for (Type type : method.getGenericParameterTypes()) { - loadTypeDependencies(type, visited); + loadTypeDependencies(type); } } for (Constructor method : aClass.getDeclaredConstructors()) { for (Type type : method.getGenericExceptionTypes()) { - loadTypeDependencies(type, visited); + loadTypeDependencies(type); } for (Type type : method.getGenericParameterTypes()) { - loadTypeDependencies(type, visited); + loadTypeDependencies(type); } } for (Field field : aClass.getDeclaredFields()) { - loadTypeDependencies(field.getGenericType(), visited); + loadTypeDependencies(field.getGenericType()); } Type superclass = aClass.getGenericSuperclass(); if (superclass != null) { - loadClassDependencies(aClass, visited); + loadClassDependencies(aClass); } for (Type intf : aClass.getGenericInterfaces()) { - loadTypeDependencies(intf, visited); + loadTypeDependencies(intf); } aClass.getAnnotations(); diff --git a/plugins/groovy/rt/src/org/jetbrains/groovy/compiler/rt/DependentGroovycRunner.java b/plugins/groovy/rt/src/org/jetbrains/groovy/compiler/rt/DependentGroovycRunner.java index 7f1ab1ae96fa..65bfe9efb6b1 100644 --- a/plugins/groovy/rt/src/org/jetbrains/groovy/compiler/rt/DependentGroovycRunner.java +++ b/plugins/groovy/rt/src/org/jetbrains/groovy/compiler/rt/DependentGroovycRunner.java @@ -468,9 +468,9 @@ public class DependentGroovycRunner { static GroovyClassLoader buildClassLoaderFor(final CompilerConfiguration compilerConfiguration, final AstAwareResourceLoader resourceLoader) { final ClassDependencyLoader checkWellFormed = new ClassDependencyLoader() { @Override - protected void loadClassDependencies(Class aClass, Set visited) throws ClassNotFoundException { + protected void loadClassDependencies(Class aClass) throws ClassNotFoundException { if (resourceLoader.getSourceFile(aClass.getName()) == null) return; - super.loadClassDependencies(aClass, visited); + super.loadClassDependencies(aClass); } }; diff --git a/plugins/java-decompiler/engine/src/org/jetbrains/java/decompiler/code/cfg/BasicBlock.java b/plugins/java-decompiler/engine/src/org/jetbrains/java/decompiler/code/cfg/BasicBlock.java index 28e0ae80eaa4..2e29529da63d 100644 --- a/plugins/java-decompiler/engine/src/org/jetbrains/java/decompiler/code/cfg/BasicBlock.java +++ b/plugins/java-decompiler/engine/src/org/jetbrains/java/decompiler/code/cfg/BasicBlock.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -44,16 +44,12 @@ public class BasicBlock implements IGraphNode { private List succs = new ArrayList(); - private List instrOldOffsets = new ArrayList(); + private final List instrOldOffsets = new ArrayList(); private List predExceptions = new ArrayList(); private List succExceptions = new ArrayList(); - - public BasicBlock() { - } - public BasicBlock(int id) { this.id = id; } @@ -63,11 +59,10 @@ public class BasicBlock implements IGraphNode { // ***************************************************************************** public Object clone() { + BasicBlock block = new BasicBlock(id); - BasicBlock block = new BasicBlock(); - block.id = id; block.setSeq(seq.clone()); - block.setInstrOldOffsets(new ArrayList(instrOldOffsets)); + block.instrOldOffsets.addAll(instrOldOffsets); return block; } @@ -220,10 +215,6 @@ public class BasicBlock implements IGraphNode { return instrOldOffsets; } - public void setInstrOldOffsets(List instrInds) { - this.instrOldOffsets = instrInds; - } - public List getPredecessors() { List lst = new ArrayList(preds); lst.addAll(predExceptions); diff --git a/plugins/java-decompiler/engine/src/org/jetbrains/java/decompiler/code/cfg/ControlFlowGraph.java b/plugins/java-decompiler/engine/src/org/jetbrains/java/decompiler/code/cfg/ControlFlowGraph.java index 8e66fddbb4d7..2f4761e8dce3 100644 --- a/plugins/java-decompiler/engine/src/org/jetbrains/java/decompiler/code/cfg/ControlFlowGraph.java +++ b/plugins/java-decompiler/engine/src/org/jetbrains/java/decompiler/code/cfg/ControlFlowGraph.java @@ -296,7 +296,7 @@ public class ControlFlowGraph implements CodeConstants { VBStyleCollection col = new VBStyleCollection(); InstructionSequence currseq = null; - ArrayList lstOffs = null; + List lstOffs = null; int len = startblock.length; short counter = 0; @@ -306,14 +306,11 @@ public class ControlFlowGraph implements CodeConstants { for (int i = 0; i < len; i++) { if (startblock[i] == 1) { - currentBlock = new BasicBlock(); - currentBlock.id = ++counter; + currentBlock = new BasicBlock(++counter); - currseq = new SimpleInstructionSequence(); - lstOffs = new ArrayList(); + currseq = currentBlock.getSeq(); + lstOffs = currentBlock.getInstrOldOffsets(); - currentBlock.setSeq(currseq); - currentBlock.setInstrOldOffsets(lstOffs); col.addWithKey(currentBlock, currentBlock.id); blockoffset = instrseq.getOffset(i); @@ -766,9 +763,7 @@ public class ControlFlowGraph implements CodeConstants { first = blocks.get(0); - last = new BasicBlock(); - last.id = ++last_id; - last.setSeq(new SimpleInstructionSequence()); + last = new BasicBlock(++last_id); for (BasicBlock block : blocks) { if (block.getSuccs().isEmpty()) { diff --git a/plugins/java-decompiler/engine/src/org/jetbrains/java/decompiler/main/collectors/BytecodeMappingTracer.java b/plugins/java-decompiler/engine/src/org/jetbrains/java/decompiler/main/collectors/BytecodeMappingTracer.java index 8a4fc4491222..84ca0b71e287 100644 --- a/plugins/java-decompiler/engine/src/org/jetbrains/java/decompiler/main/collectors/BytecodeMappingTracer.java +++ b/plugins/java-decompiler/engine/src/org/jetbrains/java/decompiler/main/collectors/BytecodeMappingTracer.java @@ -101,6 +101,8 @@ public class BytecodeMappingTracer { } Map res = new HashMap(); + + // first match offsets from line number table int[] data = lineNumberTable.getRawData(); for (int i = 0; i < data.length; i += 2) { int originalOffset = data[i]; @@ -113,9 +115,11 @@ public class BytecodeMappingTracer { unmappedLines.add(originalLine); } } + + // now match offsets from decompiler mapping for (Entry entry : mapping.entrySet()) { int originalLine = lineNumberTable.findLineNumber(entry.getKey()); - if (originalLine > -1) { + if (originalLine > -1 && !res.containsKey(originalLine)) { res.put(originalLine, entry.getValue()); unmappedLines.remove(originalLine); } diff --git a/plugins/java-decompiler/engine/src/org/jetbrains/java/decompiler/modules/decompiler/FinallyProcessor.java b/plugins/java-decompiler/engine/src/org/jetbrains/java/decompiler/modules/decompiler/FinallyProcessor.java index 9d21784fa5c0..a49f8f3888e2 100644 --- a/plugins/java-decompiler/engine/src/org/jetbrains/java/decompiler/modules/decompiler/FinallyProcessor.java +++ b/plugins/java-decompiler/engine/src/org/jetbrains/java/decompiler/modules/decompiler/FinallyProcessor.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -889,13 +889,16 @@ public class FinallyProcessor { if (seqPattern.length() < seqSample.length()) { // split in two blocks SimpleInstructionSequence seq = new SimpleInstructionSequence(); + LinkedList oldOffsets = new LinkedList(); for (int i = seqSample.length() - 1; i >= seqPattern.length(); i--) { seq.addInstruction(0, seqSample.getInstr(i), -1); + oldOffsets.addFirst(sample.getOldOffset(i)); seqSample.removeInstruction(i); } BasicBlock newblock = new BasicBlock(++graph.last_id); newblock.setSeq(seq); + newblock.getInstrOldOffsets().addAll(oldOffsets); List lstTemp = new ArrayList(); lstTemp.addAll(sample.getSuccs()); @@ -1038,7 +1041,7 @@ public class FinallyProcessor { // new empty block BasicBlock emptyblock = new BasicBlock(++graph.last_id); - emptyblock.setSeq(new SimpleInstructionSequence()); + graph.getBlocks().addWithKey(emptyblock, emptyblock.id); // add to ranges if necessary diff --git a/plugins/java-decompiler/engine/testData/results/InvalidMethodSignature.dec b/plugins/java-decompiler/engine/testData/results/InvalidMethodSignature.dec index 34f22369be55..7b4f8c504005 100644 --- a/plugins/java-decompiler/engine/testData/results/InvalidMethodSignature.dec +++ b/plugins/java-decompiler/engine/testData/results/InvalidMethodSignature.dec @@ -12,9 +12,9 @@ class i implements bg { private final b b; i(b var1, j var2) { - this.b = var1; + this.b = var1;// 1 this.a = var2; - }// 1 + } public void a(c var1, k var2, boolean var3) { File var4 = this.a.b().a(var1);// 2 @@ -50,7 +50,7 @@ class 'a/a/a/a/e/f/i' { Lines mapping: 0 <-> 25 -1 <-> 17 +1 <-> 15 2 <-> 20 3 <-> 21 4 <-> 22 diff --git a/plugins/java-decompiler/engine/testData/results/TestClassLoop.dec b/plugins/java-decompiler/engine/testData/results/TestClassLoop.dec index 7cebd04dec66..060fcec822e7 100644 --- a/plugins/java-decompiler/engine/testData/results/TestClassLoop.dec +++ b/plugins/java-decompiler/engine/testData/results/TestClassLoop.dec @@ -13,7 +13,7 @@ public class TestClassLoop { while(true) { try { if(!var0) {// 33 - return; + return;// 34 } } finally { System.out.println("1");// 38 @@ -37,7 +37,7 @@ public class TestClassLoop { } } - System.out.println("4"); + System.out.println("4");// 58 } } } @@ -54,6 +54,7 @@ class 'pkg/TestClassLoop' { 4 10 d 10 f 14 + 1a 15 26 18 27 18 2a 18 @@ -71,6 +72,9 @@ class 'pkg/TestClassLoop' { 2a 33 2d 33 2f 33 + 37 39 + 3a 39 + 3c 39 } } @@ -78,13 +82,13 @@ Lines mapping: 23 <-> 6 29 <-> 11 33 <-> 15 +34 <-> 16 38 <-> 19 45 <-> 25 49 <-> 30 52 <-> 33 53 <-> 34 +58 <-> 40 Not mapped: -34 39 54 -58 diff --git a/plugins/java-decompiler/engine/testData/results/TestClassVar.dec b/plugins/java-decompiler/engine/testData/results/TestClassVar.dec index cf28a10a3baf..37aa5ece1e8f 100644 --- a/plugins/java-decompiler/engine/testData/results/TestClassVar.dec +++ b/plugins/java-decompiler/engine/testData/results/TestClassVar.dec @@ -50,6 +50,7 @@ class 'pkg/TestClassVar' { 20 11 26 12 29 12 + 2e 7 34 18 } diff --git a/plugins/java-decompiler/engine/testData/results/TestEnum.dec b/plugins/java-decompiler/engine/testData/results/TestEnum.dec index ff3d765b2c44..06649c002abc 100644 --- a/plugins/java-decompiler/engine/testData/results/TestEnum.dec +++ b/plugins/java-decompiler/engine/testData/results/TestEnum.dec @@ -18,12 +18,12 @@ public enum TestEnum { }// 30 private TestEnum() { - this("?"); - }// 34 + this("?");// 34 + } private TestEnum(@Deprecated String var3) { - this.s = var3; - }// 35 + this.s = var3;// 35 + } } class 'pkg/TestEnum$1' { @@ -59,5 +59,5 @@ Lines mapping: 22 <-> 7 27 <-> 12 30 <-> 18 -34 <-> 22 -35 <-> 26 +34 <-> 21 +35 <-> 25 diff --git a/plugins/java-decompiler/engine/testData/results/TestTryCatchFinally.dec b/plugins/java-decompiler/engine/testData/results/TestTryCatchFinally.dec index 2e917ff5e2ef..cb596195a330 100644 --- a/plugins/java-decompiler/engine/testData/results/TestTryCatchFinally.dec +++ b/plugins/java-decompiler/engine/testData/results/TestTryCatchFinally.dec @@ -36,7 +36,7 @@ public class TestTryCatchFinally { System.out.println("Finally");// 55 } - return -1; + return -1;// 56 } } @@ -67,13 +67,16 @@ class 'pkg/TestTryCatchFinally' { method 'test (Ljava/lang/String;)I' { 1 30 4 30 + e 31 10 33 1a 33 23 33 26 33 + 31 38 34 35 35 35 38 35 + 3f 38 } } @@ -90,11 +93,11 @@ Lines mapping: 51 <-> 31 53 <-> 34 55 <-> 36 +56 <-> 39 +57 <-> 39 Not mapped: 25 28 32 35 52 -56 -57 diff --git a/plugins/properties/properties-psi-impl/src/com/intellij/lang/properties/ResourceBundleImpl.java b/plugins/properties/properties-psi-impl/src/com/intellij/lang/properties/ResourceBundleImpl.java index 0f20db983c0c..6cadb53d5b91 100644 --- a/plugins/properties/properties-psi-impl/src/com/intellij/lang/properties/ResourceBundleImpl.java +++ b/plugins/properties/properties-psi-impl/src/com/intellij/lang/properties/ResourceBundleImpl.java @@ -35,6 +35,7 @@ import java.util.List; public class ResourceBundleImpl extends ResourceBundle { @NotNull private final PropertiesFile myDefaultPropertiesFile; + private boolean myValid = true; public ResourceBundleImpl(@NotNull final PropertiesFile defaultPropertiesFile) { myDefaultPropertiesFile = defaultPropertiesFile; @@ -94,6 +95,14 @@ public class ResourceBundleImpl extends ResourceBundle { return myDefaultPropertiesFile.getProject(); } + public boolean isValid() { + return myValid; + } + + public void invalidate() { + myValid = false; + } + public boolean equals(final Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; diff --git a/plugins/properties/properties-psi-impl/src/com/intellij/lang/properties/ResourceBundleManager.java b/plugins/properties/properties-psi-impl/src/com/intellij/lang/properties/ResourceBundleManager.java index 626961e8b9f2..318b12048825 100644 --- a/plugins/properties/properties-psi-impl/src/com/intellij/lang/properties/ResourceBundleManager.java +++ b/plugins/properties/properties-psi-impl/src/com/intellij/lang/properties/ResourceBundleManager.java @@ -215,6 +215,9 @@ public class ResourceBundleManager implements PersistentStateComponent{ if (!super.validate()) { return false; } - return Comparing.equal(getValue().getDefaultPropertiesFile().getResourceBundle(), getValue()); + final ResourceBundle newBundle = getValue().getDefaultPropertiesFile().getResourceBundle(); + final ResourceBundle currentBundle = getValue(); + if (!Comparing.equal(newBundle, currentBundle)) { + return false; + } + return !(currentBundle instanceof ResourceBundleImpl) || ((ResourceBundleImpl)currentBundle).isValid(); } } diff --git a/python/edu/course-creator-intellij-py/src/PyCCEduProjectTemplate.java b/python/edu/course-creator-intellij-py/src/PyCCEduProjectTemplate.java index d725173154b2..70e622108fab 100644 --- a/python/edu/course-creator-intellij-py/src/PyCCEduProjectTemplate.java +++ b/python/edu/course-creator-intellij-py/src/PyCCEduProjectTemplate.java @@ -82,7 +82,7 @@ public class PyCCEduProjectTemplate extends EduProjectTemplate { StartupManager.getInstance(project).runWhenProjectIsInitialized(new Runnable() { @Override public void run() { - PyCCProjectGenerator.generateProject(project, baseDir, panel.getName(), panel.getAuthor(), panel.getDescription()); + PyCCProjectGenerator.generateProject(project, baseDir, panel.getName(), panel.getAuthors(), panel.getDescription()); } }); } diff --git a/python/edu/course-creator-python/src/com/jetbrains/edu/coursecreator/PyCCProjectGenerator.java b/python/edu/course-creator-python/src/com/jetbrains/edu/coursecreator/PyCCProjectGenerator.java index e4ea96ad67de..4ab1edea86b6 100644 --- a/python/edu/course-creator-python/src/com/jetbrains/edu/coursecreator/PyCCProjectGenerator.java +++ b/python/edu/course-creator-python/src/com/jetbrains/edu/coursecreator/PyCCProjectGenerator.java @@ -55,17 +55,17 @@ public class PyCCProjectGenerator extends PythonProjectGenerator implements Dire public void generateProject(@NotNull final Project project, @NotNull final VirtualFile baseDir, @Nullable Object settings, @NotNull Module module) { generateProject(project, baseDir, mySettingsPanel.getName(), - mySettingsPanel.getAuthor(), mySettingsPanel.getDescription()); + mySettingsPanel.getAuthors(), mySettingsPanel.getDescription()); } public static void generateProject(@NotNull final Project project, @NotNull final VirtualFile baseDir, - @NotNull final String name, @NotNull final String author, + @NotNull final String name, @NotNull final String[] authors, @NotNull final String description) { final CCProjectService service = CCProjectService.getInstance(project); final Course course = new Course(); course.setName(name); - course.setAuthor(author); + course.setAuthors(authors); course.setDescription(description); course.setLanguage("Python"); service.setCourse(course); @@ -93,7 +93,7 @@ public class PyCCProjectGenerator extends PythonProjectGenerator implements Dire public ValidationResult validate(@NotNull String s) { String message = ""; message = mySettingsPanel.getDescription().isEmpty() ? "Enter description" : message; - message = mySettingsPanel.getAuthor().isEmpty() ? "Enter author name" : message; + message = mySettingsPanel.getAuthors().length == 0 ? "Enter author name" : message; message = mySettingsPanel.getName().isEmpty() ? "Enter course name" : message; return message.isEmpty() ? ValidationResult.OK : new ValidationResult(message); } diff --git a/python/edu/interactive-learning-python/src/com/jetbrains/edu/learning/PyStudyDirectoryProjectGenerator.java b/python/edu/interactive-learning-python/src/com/jetbrains/edu/learning/PyStudyDirectoryProjectGenerator.java index d49e373e5342..37eb89c49bef 100644 --- a/python/edu/interactive-learning-python/src/com/jetbrains/edu/learning/PyStudyDirectoryProjectGenerator.java +++ b/python/edu/interactive-learning-python/src/com/jetbrains/edu/learning/PyStudyDirectoryProjectGenerator.java @@ -102,7 +102,7 @@ public class PyStudyDirectoryProjectGenerator extends PythonProjectGenerator imp } public List getCourses() { - return myGenerator.getCourses(); + return myGenerator.getCourses(false); } public void setSelectedCourse(CourseInfo course) { diff --git a/python/educational/course-creator/src/com/jetbrains/edu/coursecreator/actions/CCChangeCourseInfo.java b/python/educational/course-creator/src/com/jetbrains/edu/coursecreator/actions/CCChangeCourseInfo.java index 1625f6361c16..e2588978df95 100644 --- a/python/educational/course-creator/src/com/jetbrains/edu/coursecreator/actions/CCChangeCourseInfo.java +++ b/python/educational/course-creator/src/com/jetbrains/edu/coursecreator/actions/CCChangeCourseInfo.java @@ -78,12 +78,12 @@ public class CCChangeCourseInfo extends DumbAwareAction { if (directory != null && !project.getBaseDir().equals(directory.getVirtualFile())) { return; } - CCNewProjectPanel panel = new CCNewProjectPanel(course.getName(), course.getAuthor(), course.getDescription()); + CCNewProjectPanel panel = new CCNewProjectPanel(course.getName(), Course.getAuthorsString(course.getAuthors()), course.getDescription()); ChangeCourseInfoDialog changeCourseInfoDialog = new ChangeCourseInfoDialog(project, panel); changeCourseInfoDialog.show(); if (changeCourseInfoDialog.getExitCode() == DialogWrapper.OK_EXIT_CODE) { - course.setAuthor(panel.getAuthor()); + course.setAuthors(panel.getAuthors()); course.setName(panel.getName()); course.setDescription(panel.getDescription()); ProjectView.getInstance(project).refresh(); diff --git a/python/educational/course-creator/src/com/jetbrains/edu/coursecreator/actions/CCPushLesson.java b/python/educational/course-creator/src/com/jetbrains/edu/coursecreator/actions/CCPushLesson.java index c48d802150c8..f484cff794c2 100644 --- a/python/educational/course-creator/src/com/jetbrains/edu/coursecreator/actions/CCPushLesson.java +++ b/python/educational/course-creator/src/com/jetbrains/edu/coursecreator/actions/CCPushLesson.java @@ -35,7 +35,7 @@ public class CCPushLesson extends DumbAwareAction { if (course == null) { return; } - PsiDirectory lessonDir = DirectoryChooserUtil.getOrChooseDirectory(view);; + PsiDirectory lessonDir = DirectoryChooserUtil.getOrChooseDirectory(view); if (lessonDir == null || !lessonDir.getName().contains("lesson")) { return; } diff --git a/python/educational/course-creator/src/com/jetbrains/edu/coursecreator/ui/CCNewProjectPanel.java b/python/educational/course-creator/src/com/jetbrains/edu/coursecreator/ui/CCNewProjectPanel.java index b5800fcf96d0..5e7de6356b55 100644 --- a/python/educational/course-creator/src/com/jetbrains/edu/coursecreator/ui/CCNewProjectPanel.java +++ b/python/educational/course-creator/src/com/jetbrains/edu/coursecreator/ui/CCNewProjectPanel.java @@ -51,8 +51,8 @@ public class CCNewProjectPanel { } @NotNull - public String getAuthor() { - return StringUtil.notNullize(myAuthorField.getText()); + public String[] getAuthors() { + return StringUtil.splitByLines(StringUtil.notNullize(myAuthorField.getText())); } public void registerValidators(FacetValidatorsManager manager) { diff --git a/python/educational/interactive-learning/src/com/jetbrains/edu/learning/courseGeneration/StudyProjectGenerator.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/courseGeneration/StudyProjectGenerator.java index 498948c3e126..63e90f5967a5 100644 --- a/python/educational/interactive-learning/src/com/jetbrains/edu/learning/courseGeneration/StudyProjectGenerator.java +++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/courseGeneration/StudyProjectGenerator.java @@ -211,10 +211,13 @@ public class StudyProjectGenerator { } writer = new PrintWriter(cashFile); for (CourseInfo courseInfo : myCourses) { - String line = String - .format("name=%s author=%s description=%s", courseInfo.getName(), courseInfo.getAuthor(), - courseInfo.getDescription()); - writer.println(line); + final List instructors = courseInfo.getInstructors(); + StringBuilder builder = new StringBuilder("name=").append(courseInfo.getName()).append("description=").append( + courseInfo.getDescription()); + for (CourseInfo.Instructor instructor : instructors) { + builder.append("instructor=").append(instructor.getName()); + } + writer.println(builder.toString()); } } catch (FileNotFoundException e) { @@ -228,12 +231,12 @@ public class StudyProjectGenerator { } } - public List getCourses() { - if (!myCourses.isEmpty()) { + public List getCourses(boolean force) { + if (force || myCourses.isEmpty()) { + myCourses = EduStepicConnector.getCourses(); return myCourses; } else { - myCourses = EduStepicConnector.getCourses(); return myCourses; } } diff --git a/python/educational/interactive-learning/src/com/jetbrains/edu/learning/ui/StudyNewProjectPanel.form b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/ui/StudyNewProjectPanel.form index 3c5369f403de..aeff7d7125ba 100644 --- a/python/educational/interactive-learning/src/com/jetbrains/edu/learning/ui/StudyNewProjectPanel.form +++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/ui/StudyNewProjectPanel.form @@ -1,6 +1,6 @@

- + @@ -67,6 +67,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/educational/interactive-learning/src/com/jetbrains/edu/learning/ui/StudyNewProjectPanel.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/ui/StudyNewProjectPanel.java index 679931cd2f2a..b84c7f526a9f 100644 --- a/python/educational/interactive-learning/src/com/jetbrains/edu/learning/ui/StudyNewProjectPanel.java +++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/ui/StudyNewProjectPanel.java @@ -3,9 +3,12 @@ package com.jetbrains.edu.learning.ui; import com.intellij.facet.ui.FacetValidatorsManager; import com.intellij.facet.ui.ValidationResult; import com.intellij.icons.AllIcons; +import com.intellij.ui.HideableDecorator; +import com.jetbrains.edu.courseFormat.Course; import com.jetbrains.edu.learning.StudyUtils; import com.jetbrains.edu.learning.courseGeneration.StudyProjectGenerator; import com.jetbrains.edu.stepic.CourseInfo; +import com.jetbrains.edu.stepic.EduStepicConnector; import org.jetbrains.annotations.NotNull; import javax.swing.*; @@ -19,6 +22,7 @@ import java.util.List; * data: 7/31/14. */ public class StudyNewProjectPanel{ + private final HideableDecorator myDecorator; private List myAvailableCourses = new ArrayList(); private JComboBox myCoursesComboBox; private JButton myRefreshButton; @@ -27,6 +31,11 @@ public class StudyNewProjectPanel{ private JLabel myDescriptionLabel; private JLabel myLabel; private JPanel myInfoPanel; + private JPanel myHideablePanel; + private JPanel myLoginPanel; + private JPasswordField myPasswordField; + private JTextField myLoginField; + private JButton myLogInButton; private final StudyProjectGenerator myGenerator; private static final String CONNECTION_ERROR = "Failed to download courses.
Check your Internet connection."; private static final String INVALID_COURSE = "Selected course is invalid"; @@ -34,7 +43,7 @@ public class StudyNewProjectPanel{ public StudyNewProjectPanel(StudyProjectGenerator generator) { myGenerator = generator; - myAvailableCourses = myGenerator.getCourses(); + myAvailableCourses = myGenerator.getCourses(false); if (myAvailableCourses.isEmpty()) { setError(CONNECTION_ERROR); } @@ -42,7 +51,7 @@ public class StudyNewProjectPanel{ for (CourseInfo courseInfo : myAvailableCourses) { myCoursesComboBox.addItem(courseInfo); } - myAuthorLabel.setText("Author: " + StudyUtils.getFirst(myAvailableCourses).getAuthor()); + myAuthorLabel.setText("Author: " + Course.getAuthorsString(StudyUtils.getFirst(myAvailableCourses).getInstructors())); myDescriptionLabel.setText(StudyUtils.getFirst(myAvailableCourses).getDescription()); //setting the first course in list as selected myGenerator.setSelectedCourse(StudyUtils.getFirst(myAvailableCourses)); @@ -53,12 +62,26 @@ public class StudyNewProjectPanel{ myRefreshButton.setIcon(AllIcons.Actions.Refresh); myLabel.setPreferredSize(new JLabel("Project name").getPreferredSize()); + myDecorator = new HideableDecorator(myHideablePanel, "Credentials", false); + myDecorator.setOn(false); + myDecorator.setContentComponent(myLoginPanel); + } private void initListeners() { - myRefreshButton.addActionListener(new RefreshActionListener()); myCoursesComboBox.addActionListener(new CourseSelectedListener()); + myLogInButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + final boolean isSuccess = EduStepicConnector.login(myLoginField.getText(), String.valueOf(myPasswordField.getPassword())); + if (!isSuccess) { + setError("Failed to log in"); + return; + } + refreshCoursesList(); + } + }); } private void setError(@NotNull final String errorMessage) { @@ -92,24 +115,28 @@ public class StudyNewProjectPanel{ private class RefreshActionListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { - final List courses = myGenerator.getCourses(); - if (courses.isEmpty()) { - setError(CONNECTION_ERROR); - return; - } - myCoursesComboBox.removeAllItems(); - - for (CourseInfo courseInfo : courses) { - myCoursesComboBox.addItem(courseInfo); - } - myGenerator.setSelectedCourse(StudyUtils.getFirst(courses)); - - myGenerator.setCourses(courses); - myAvailableCourses = courses; - myGenerator.flushCache(); + refreshCoursesList(); } } + private void refreshCoursesList() { + final List courses = myGenerator.getCourses(true); + if (courses.isEmpty()) { + setError(CONNECTION_ERROR); + return; + } + myCoursesComboBox.removeAllItems(); + + for (CourseInfo courseInfo : courses) { + myCoursesComboBox.addItem(courseInfo); + } + myGenerator.setSelectedCourse(StudyUtils.getFirst(courses)); + + myGenerator.setCourses(courses); + myAvailableCourses = courses; + myGenerator.flushCache(); + } + /** * Handles selecting course in combo box @@ -126,7 +153,7 @@ public class StudyNewProjectPanel{ myDescriptionLabel.setText(""); return; } - myAuthorLabel.setText("Author: " + selectedCourse.getAuthor()); + myAuthorLabel.setText("Author: " + Course.getAuthorsString(selectedCourse.getInstructors())); myCoursesComboBox.removeItem(CourseInfo.INVALID_COURSE); myDescriptionLabel.setText(selectedCourse.getDescription()); myGenerator.setSelectedCourse(selectedCourse); diff --git a/python/educational/interactive-learning/src/com/jetbrains/edu/learning/ui/StudyToolWindowFactory.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/ui/StudyToolWindowFactory.java index 739954cee6d5..0539c68a9965 100644 --- a/python/educational/interactive-learning/src/com/jetbrains/edu/learning/ui/StudyToolWindowFactory.java +++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/ui/StudyToolWindowFactory.java @@ -36,8 +36,7 @@ public class StudyToolWindowFactory implements ToolWindowFactory, DumbAware { } String courseName = UIUtil.toHtml("

" + course.getName() + "

", 10); String description = UIUtil.toHtml(course.getDescription(), 5); - String author = taskManager.getCourse().getAuthor(); - String authorLabel = UIUtil.toHtml("Author: " + author, 5); + String authorLabel = UIUtil.toHtml("Author: " + Course.getAuthorsString(course.getAuthors()), 5); contentPanel.add(new JLabel(courseName)); contentPanel.add(new JLabel(authorLabel)); contentPanel.add(Box.createRigidArea(new Dimension(0, 10))); diff --git a/python/educational/src/com/jetbrains/edu/courseFormat/Course.java b/python/educational/src/com/jetbrains/edu/courseFormat/Course.java index 0bde12d2c6ad..36498e4a528b 100644 --- a/python/educational/src/com/jetbrains/edu/courseFormat/Course.java +++ b/python/educational/src/com/jetbrains/edu/courseFormat/Course.java @@ -3,8 +3,11 @@ package com.jetbrains.edu.courseFormat; import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; import com.intellij.lang.Language; +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.util.Function; import com.jetbrains.edu.EduNames; import com.jetbrains.edu.EduUtils; +import com.jetbrains.edu.stepic.CourseInfo; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; @@ -17,7 +20,7 @@ public class Course { @Expose private String description; @Expose private String name; private String myCourseDirectory = ""; - @Expose private String author=""; + @Expose private List authors = new ArrayList(); private boolean myUpToDate; @Expose @SerializedName("language") @@ -56,12 +59,25 @@ public class Course { return lessons.get(lessonIndex); } - public String getAuthor() { - return author; + @NotNull + public List getAuthors() { + return authors; } - public void setAuthor(String author) { - this.author = author; + public static String getAuthorsString(@NotNull List authors) { + return StringUtil.join(authors, new Function() { + @Override + public String fun(CourseInfo.Instructor instructor) { + return instructor.getName(); + } + }, ", "); + } + + public void setAuthors(String[] authors) { + this.authors = new ArrayList(); + for (String name : authors) { + this.authors.add(new CourseInfo.Instructor(name)); + } } public String getName() { @@ -107,4 +123,8 @@ public class Course { public void setLanguage(@NotNull final String language) { myLanguage = language; } + + public void setAuthors(List instructors) { + this.authors = instructors; + } } diff --git a/python/educational/src/com/jetbrains/edu/stepic/CourseInfo.java b/python/educational/src/com/jetbrains/edu/stepic/CourseInfo.java index 38815badc45b..19f8898a3509 100644 --- a/python/educational/src/com/jetbrains/edu/stepic/CourseInfo.java +++ b/python/educational/src/com/jetbrains/edu/stepic/CourseInfo.java @@ -1,7 +1,9 @@ package com.jetbrains.edu.stepic; import com.google.gson.annotations.SerializedName; +import org.jetbrains.annotations.NotNull; +import java.util.ArrayList; import java.util.List; /** @@ -19,22 +21,18 @@ public class CourseInfo { //course type in format "pycharm " private String myType; - private String myAuthor; - public static CourseInfo INVALID_COURSE = new CourseInfo("", "", "", ""); + @SerializedName("instructors") + List myInstructors = new ArrayList(); - public CourseInfo(String name, String author, String description, String type) { - myName = name; - myAuthor = author; - myDescription = description; - myType = type; - } + public static CourseInfo INVALID_COURSE = new CourseInfo(); public String getName() { return myName; } - public String getAuthor() { - return myAuthor; + @NotNull + public List getInstructors() { + return myInstructors; } public String getDescription() { @@ -55,15 +53,27 @@ public class CourseInfo { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; CourseInfo that = (CourseInfo)o; - return that.getName().equals(myName) && that.getAuthor().equals(myAuthor) + if (that.getName() == null || that.getDescription() == null) return false; + return that.getName().equals(myName) && that.getDescription().equals(myDescription); } @Override public int hashCode() { int result = myName != null ? myName.hashCode() : 0; - result = 31 * result + (myAuthor != null ? myAuthor.hashCode() : 0); result = 31 * result + (myDescription != null ? myDescription.hashCode() : 0); return result; } + + public static class Instructor { + String name; + + public Instructor(String name) { + this.name = name; + } + + public String getName() { + return name; + } + } } diff --git a/python/educational/src/com/jetbrains/edu/stepic/EduStepicConnector.java b/python/educational/src/com/jetbrains/edu/stepic/EduStepicConnector.java index 564226d9a06c..a37c4680cf34 100644 --- a/python/educational/src/com/jetbrains/edu/stepic/EduStepicConnector.java +++ b/python/educational/src/com/jetbrains/edu/stepic/EduStepicConnector.java @@ -8,89 +8,164 @@ import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Document; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.util.io.HttpRequests; import com.intellij.util.net.ssl.CertificateManager; import com.jetbrains.edu.EduUtils; import com.jetbrains.edu.courseFormat.Course; import com.jetbrains.edu.courseFormat.Lesson; import com.jetbrains.edu.courseFormat.Task; import com.jetbrains.edu.courseFormat.TaskFile; -import org.apache.http.Header; +import org.apache.http.NameValuePair; import org.apache.http.StatusLine; +import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.methods.HttpRequestBase; +import org.apache.http.cookie.Cookie; import org.apache.http.entity.ContentType; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.BasicCookieStore; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.impl.client.HttpClients; -import org.apache.http.impl.cookie.BasicClientCookie; import org.apache.http.message.BasicHeader; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.protocol.HTTP; import org.apache.http.util.EntityUtils; import org.jetbrains.annotations.NotNull; -import java.io.BufferedReader; import java.io.IOException; +import java.io.UnsupportedEncodingException; import java.util.*; public class EduStepicConnector { - private static final String stepicApiUrl = "https://stepic.org/api/"; + private static final String stepicUrl = "https://stepic.org/"; + private static final String stepicApiUrl = stepicUrl + "api/"; private static final Logger LOG = Logger.getInstance(EduStepicConnector.class.getName()); private static final String ourDomain = "stepic.org"; - private static String ourSessionId = "524iethiwju2tjywaqmf7tbwx0p0jk1b"; - private static String ourCSRFToken = "LJ9n6OyLVA7hxU94dlYWUu65MF51Nx37"; + private static String ourCSRFToken = ""; + private static CloseableHttpClient ourClient; + //this prefix indicates that course can be opened by educational plugin - public static final String PYCHARM_PREFIX = "pycharm "; + public static final String PYCHARM_PREFIX = "pycharm"; + private static BasicCookieStore ourCookieStore; private EduStepicConnector() { } - private static T getFromStepic(String link, final Class container) throws IOException { - return HttpRequests.request(stepicApiUrl + link).connect(new HttpRequests.RequestProcessor() { - @Override - public T process(@NotNull HttpRequests.Request request) throws IOException { - final BufferedReader reader = request.getReader(); - Gson gson = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create(); - return gson.fromJson(reader, container); + public static boolean login(@NotNull final String user, @NotNull final String password) { + if (ourClient == null || ourCookieStore == null) + initializeClient(); + return postCredentials(user, password); + } + + private static void initializeClient() { + final HttpGet request = new HttpGet(stepicUrl); + request.addHeader(new BasicHeader("referer", "https://stepic.org")); + request.addHeader(new BasicHeader("content-type", "application/json")); + + HttpClientBuilder builder = HttpClients.custom().setSslcontext(CertificateManager.getInstance().getSslContext()).setMaxConnPerRoute(100); + ourCookieStore = new BasicCookieStore(); + ourClient = builder.setDefaultCookieStore(ourCookieStore).build(); + + try { + ourClient.execute(request); + saveCSRFToken(); + } + catch (IOException e) { + LOG.error(e.getMessage()); + } + } + + private static void saveCSRFToken() { + if (ourCookieStore == null) return; + final List cookies = ourCookieStore.getCookies(); + for (Cookie cookie : cookies) { + if (cookie.getName().equals("csrftoken")) { + ourCSRFToken = cookie.getValue(); } - }); + } + } + + private static boolean postCredentials(String user, String password) { + String url = stepicUrl + "accounts/login/"; + final HttpPost request = new HttpPost(url); + List nvps = new ArrayList (); + nvps.add(new BasicNameValuePair("csrfmiddlewaretoken", ourCSRFToken)); + nvps.add(new BasicNameValuePair("login", user)); + nvps.add(new BasicNameValuePair("next", "/")); + nvps.add(new BasicNameValuePair("password", password)); + nvps.add(new BasicNameValuePair("remember", "on")); + + try { + request.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8)); + } + catch (UnsupportedEncodingException e) { + LOG.error(e.getMessage()); + return false; + } + + setHeaders(request, "application/x-www-form-urlencoded"); + + try { + final CloseableHttpResponse response = ourClient.execute(request); + saveCSRFToken(); + final StatusLine line = response.getStatusLine(); + if (line.getStatusCode() != 302) { + LOG.error("Failed to login " + EntityUtils.toString(response.getEntity())); + return false; + } + } + catch (IOException e) { + LOG.error(e.getMessage()); + return false; + } + return true; + } + + private static T getFromStepic(String link, final Class container) throws IOException { + final HttpGet request = new HttpGet(stepicApiUrl + link); + if (ourClient == null) { + initializeClient(); + } + setHeaders(request, "application/json"); + + final CloseableHttpResponse response = ourClient.execute(request); + final String responseString = EntityUtils.toString(response.getEntity()); + Gson gson = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create(); + return gson.fromJson(responseString, container); } @NotNull public static List getCourses() { try { - return getFromStepic("courses/99", CoursesContainer.class).courses; + List result = new ArrayList(); + final List courseInfos = getFromStepic("courses", CoursesContainer.class).courses; + for (CourseInfo info : courseInfos) { + final String courseType = info.getType(); + if (StringUtil.isEmptyOrSpaces(courseType)) continue; + final List typeLanguage = StringUtil.split(courseType, " "); + if (typeLanguage.size() == 2 && PYCHARM_PREFIX.equals(typeLanguage.get(0))) { + result.add(info); + } + } + return result; } catch (IOException e) { - LOG.error("IOException " + e.getMessage()); + LOG.error("Cannot load course list " + e.getMessage()); } return Collections.emptyList(); - /*try { // TODO: uncomment - return HttpRequests.request(stepicApiUrl + "courses").connect(new HttpRequests.RequestProcessor>() { - - @Override - public List process(@NotNull HttpRequests.Request request) throws IOException { - final BufferedReader reader = request.getReader(); - Gson gson = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create(); - return gson.fromJson(reader, CoursesContainer.class).courses; - } - }); - } - catch (IOException e) { - LOG.error("IOException " + e.getMessage()); - } - return null;*/ } public static Course getCourse(@NotNull final CourseInfo info) { final Course course = new Course(); - course.setAuthor(info.getAuthor()); + course.setAuthors(info.getInstructors()); course.setDescription(info.getDescription()); course.setName(info.getName()); String courseType = info.getType(); - course.setLanguage(courseType.substring(PYCHARM_PREFIX.length())); + course.setLanguage(courseType.substring(PYCHARM_PREFIX.length() + 1)); course.setUpToDate(true); // TODO: get from stepic try { for (Integer section : info.sections) { @@ -128,7 +203,7 @@ public class EduStepicConnector { private static void createTask(Lesson lesson, Integer s) throws IOException { final Step step = getStep(s); final Task task = new Task(); - task.setName(step.name); + task.setName(step.options != null ? step.options.title : PYCHARM_PREFIX); task.setText(step.text); for (TestFileWrapper wrapper : step.options.test) { task.setTestsTexts(wrapper.name, wrapper.text); @@ -148,23 +223,29 @@ public class EduStepicConnector { } - public static boolean postLesson(Project project, @NotNull final Lesson lesson) { - final HttpPost request = new HttpPost(stepicApiUrl + "lessons"); - final ArrayList
headers = getHeaders(request); - HttpClientBuilder builder = HttpClients.custom().setSslcontext(CertificateManager.getInstance().getSslContext()); - final BasicCookieStore cookieStore = getCookies(); - final CloseableHttpClient client = builder.setDefaultHeaders(headers).setDefaultCookieStore(cookieStore).build(); + public static void showLoginDialog() { + final LoginDialog dialog = new LoginDialog(); + dialog.show(); + } + + public static void postLesson(Project project, @NotNull final Lesson lesson) { + final HttpPost request = new HttpPost(stepicApiUrl + "lessons"); + if (ourClient == null) { + showLoginDialog(); + } + + setHeaders(request, "application/json"); String requestBody = new Gson().toJson(new LessonWrapper(lesson)); request.setEntity(new StringEntity(requestBody, ContentType.APPLICATION_JSON)); try { - final CloseableHttpResponse response = client.execute(request); + final CloseableHttpResponse response = ourClient.execute(request); final String responseString = EntityUtils.toString(response.getEntity()); final StatusLine line = response.getStatusLine(); if (line.getStatusCode() != 201) { - LOG.error("Failed to push " + EntityUtils.toString(response.getEntity())); - return false; + LOG.error("Failed to push " + responseString); + return; } final Lesson postedLesson = new Gson().fromJson(responseString, Course.class).getLessons().get(0); for (Task task : lesson.getTaskList()) { @@ -174,56 +255,31 @@ public class EduStepicConnector { catch (IOException e) { LOG.error(e.getMessage()); } - return false; } - public static boolean postTask(Project project, @NotNull final Task task, int id) { + public static void postTask(Project project, @NotNull final Task task, int id) { final HttpPost request = new HttpPost(stepicApiUrl + "step-sources"); - final ArrayList
headers = getHeaders(request); - HttpClientBuilder builder = HttpClients.custom().setSslcontext(CertificateManager.getInstance().getSslContext()); - final BasicCookieStore cookieStore = getCookies(); - final CloseableHttpClient client = builder.setDefaultHeaders(headers).setDefaultCookieStore(cookieStore).build(); + setHeaders(request, "application/json"); final Gson gson = new GsonBuilder().setPrettyPrinting().excludeFieldsWithoutExposeAnnotation().create(); String requestBody = gson.toJson(new StepSourceWrapper(project, task, id)); request.setEntity(new StringEntity(requestBody, ContentType.APPLICATION_JSON)); try { - final CloseableHttpResponse response = client.execute(request); + final CloseableHttpResponse response = ourClient.execute(request); final StatusLine line = response.getStatusLine(); if (line.getStatusCode() != 201) { LOG.error("Failed to push " + EntityUtils.toString(response.getEntity())); } - return line.getStatusCode() == 201; } catch (IOException e) { LOG.error(e.getMessage()); } - - return false; } - private static BasicCookieStore getCookies() { - final BasicCookieStore cookieStore = new BasicCookieStore(); - final BasicClientCookie sessionid = new BasicClientCookie("sessionid", ourSessionId); - sessionid.setDomain(ourDomain); - sessionid.setPath("/"); - - cookieStore.addCookie(sessionid); - final BasicClientCookie csrfToken = new BasicClientCookie("csrftoken", ourCSRFToken); - csrfToken.setDomain(ourDomain); - csrfToken.setPath("/"); - - cookieStore.addCookie(csrfToken); - return cookieStore; - } - - private static ArrayList
getHeaders(HttpPost request) { - final ArrayList
headers = new ArrayList
(); - headers.add(new BasicHeader("referer", "https://stepic.org")); - headers.add(new BasicHeader("X-CSRFToken", ourCSRFToken)); - headers.add(new BasicHeader("content-type", "application/json")); - request.setHeaders(headers.toArray(new Header[headers.size()])); - return headers; + private static void setHeaders(@NotNull final HttpRequestBase request, String contentType) { + request.addHeader(new BasicHeader("referer", stepicUrl)); + request.addHeader(new BasicHeader("X-CSRFToken", ourCSRFToken)); + request.addHeader(new BasicHeader("content-type", contentType)); } private static class StepContainer { @@ -262,6 +318,7 @@ public class EduStepicConnector { @Override public void run() { final VirtualFile taskDir = task.getTaskDir(project); + assert taskDir != null; EduUtils.createStudentFileFromAnswer(project, taskDir, taskDir, entry); } }); diff --git a/python/educational/src/com/jetbrains/edu/stepic/LoginDialog.java b/python/educational/src/com/jetbrains/edu/stepic/LoginDialog.java new file mode 100644 index 000000000000..a670e83bc1b0 --- /dev/null +++ b/python/educational/src/com/jetbrains/edu/stepic/LoginDialog.java @@ -0,0 +1,62 @@ +package com.jetbrains.edu.stepic; + +import com.intellij.openapi.ui.DialogWrapper; +import org.jetbrains.annotations.NotNull; + +import javax.swing.*; + +public class LoginDialog extends DialogWrapper { + private final LoginPanel myLoginPanel; + + public LoginDialog() { + super(false); + myLoginPanel = new LoginPanel(this); + setTitle("Login to Stepic"); + setOKButtonText("Login"); + init(); + } + + @NotNull + protected Action[] createActions() { + return new Action[]{getOKAction(), getCancelAction()}; + } + + @Override + protected JComponent createCenterPanel() { + return myLoginPanel.getPanel(); + } + + @Override + protected String getHelpId() { + return "login_to_stepic"; + } + + @Override + public JComponent getPreferredFocusedComponent() { + return myLoginPanel.getPreferableFocusComponent(); + } + + @Override + protected void doOKAction() { + AuthDataHolder authData = myLoginPanel.getAuthData(); + final boolean success = EduStepicConnector.login(authData.email, authData.password); + if (!success) { + setErrorText("Log in failed"); + } + super.doOKAction(); + } + + public void clearErrors() { + setErrorText(null); + } + + public static class AuthDataHolder { + String email; + String password; + + public AuthDataHolder(String login, String password) { + email = login; + this.password = password; + } + } +} \ No newline at end of file diff --git a/python/educational/src/com/jetbrains/edu/stepic/LoginPanel.form b/python/educational/src/com/jetbrains/edu/stepic/LoginPanel.form new file mode 100644 index 000000000000..57570c149e93 --- /dev/null +++ b/python/educational/src/com/jetbrains/edu/stepic/LoginPanel.form @@ -0,0 +1,52 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/python/educational/src/com/jetbrains/edu/stepic/LoginPanel.java b/python/educational/src/com/jetbrains/edu/stepic/LoginPanel.java new file mode 100644 index 000000000000..3d883a774b24 --- /dev/null +++ b/python/educational/src/com/jetbrains/edu/stepic/LoginPanel.java @@ -0,0 +1,69 @@ +/* + * Copyright 2000-2015 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.edu.stepic; + +import com.intellij.ui.DocumentAdapter; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; + +public class LoginPanel { + private JPanel myPane; + private JTextField myLoginTextField; + private JPasswordField myPasswordField; + + public LoginPanel(final LoginDialog dialog) { + DocumentListener listener = new DocumentAdapter() { + @Override + protected void textChanged(DocumentEvent e) { + dialog.clearErrors(); + } + }; + myLoginTextField.getDocument().addDocumentListener(listener); + myPasswordField.getDocument().addDocumentListener(listener); + } + + public JComponent getPanel() { + return myPane; + } + + public void setLogin(@Nullable String login) { + myLoginTextField.setText(login); + } + + @NotNull + public String getLogin() { + return myLoginTextField.getText().trim(); + } + + @NotNull + private String getPassword() { + return String.valueOf(myPasswordField.getPassword()); + } + + public JComponent getPreferableFocusComponent() { + return myLoginTextField.isVisible() ? myLoginTextField : myPasswordField; + } + + @NotNull + public LoginDialog.AuthDataHolder getAuthData() { + return new LoginDialog.AuthDataHolder(getLogin(), getPassword()); + } +} + diff --git a/python/helpers/pydev/pydevd_breakpoints.py b/python/helpers/pydev/pydevd_breakpoints.py index ab8550f28998..fdd069abcd1e 100644 --- a/python/helpers/pydev/pydevd_breakpoints.py +++ b/python/helpers/pydev/pydevd_breakpoints.py @@ -95,18 +95,25 @@ def _excepthook(exctype, value, tb): return frames = [] + debugger = GetGlobalDebugger() + user_frames = [] while tb: + frame = tb.tb_frame + if exception_breakpoint.ignore_libraries and not debugger.not_in_scope(frame.f_code.co_filename): + user_frames.append(tb.tb_frame) frames.append(tb.tb_frame) tb = tb.tb_next thread = threadingCurrentThread() frames_byid = dict([(id(frame),frame) for frame in frames]) - frame = frames[-1] + if exception_breakpoint.ignore_libraries: + frame = user_frames[-1] + else: + frame = frames[-1] thread.additionalInfo.exception = (exctype, value, tb) thread.additionalInfo.pydev_force_stop_at_exception = (frame, frames_byid) thread.additionalInfo.message = exception_breakpoint.qname - debugger = GetGlobalDebugger() pydevd_tracing.SetTrace(None) #no tracing from here diff --git a/python/helpers/tools/versions.xml b/python/helpers/tools/versions.xml index b995dc6cadbf..853617f38d44 100644 --- a/python/helpers/tools/versions.xml +++ b/python/helpers/tools/versions.xml @@ -1 +1,4961 @@ -sqlite3.test.factoryimportlib.test.source.test_file_loadertest.test_future_builtins_dummy_threadpydoc_data.topicstest.test_epolldbm.gnutkinter.test.test_tkinter.test_fontlib2to3.fixer_utilimportlib.test.import_.test_cachingctypes.test.test_castbsddb.test.test_distributed_transactionsencodings.utf_8_sigantigravityjson.encodertest.test_future5test.test_future4test.json_tests.test_recursionrunpymultiprocessing.pooltkinter._fixtest.ssl_serverstest.test_floatlib2to3.fixes.fix_methodattrsctypes.test.test_funcptrturtledemo.minimal_hanoiturtledemo.fractalcurvesturtledemo.lindenmayertest.test_abstract_numbersctypes.test.test_picklinglib2to3.fixer_baselib2to3.fixes.fix_typesctypes.test.test_pep3118test.json_tests.test_separatorsimportlib.test.import_.test___package__xml.etreeimportlib.test.benchmarkjson.tests.test_unicodeturtledemo.colormixerlib2to3.fixes.fix_xreadlinestkinter.ttkemail.mime.messagedistutils.tests.test_coretest.test_hashlibencodings.cp720test.json_testsunittest.test.test_resulttest.test_schedturtledemo.yinyangctypes.test.test_slicingtest.test_xmlrpc_nettest.test_sys_setprofiletkinter.test.test_ttktest.test_ttk_textonlyfractionsimportlib.test.source.test_path_hookbsddb.test.test_fileidtkinter.fontunittest.__main__tkinter.commondialoglib2to3.fixes.fix_applytest.test_keywordonlyargtest.test_setcompstest.test_collectionsjson.tests.test_speedupsjson.tests.test_recursionnumberstest.test_cmdctypes.test.test_checkretvalsqlite3.testlib2to3.fixes.fix_longconcurrent.futures.processdistutils.tests.test_buildtest.test_urllib_responseidlelib.tabbedpagesurllib.requesttest.test_printargparsectypes.test.test_functionstest.test_multiprocessingctypes.test.test_keeprefstest.test_dbm_gnufunctoolsctypes.test.test_libcidlelib.macosxSupportimportlib.utiltest.json_tests.test_pass1uuidturtledemo.bytedesignlib2to3.pgen2.pgendistutils.tests.test_install_datatest.script_helpertest.test_readlineunittest.test.test_breakmultiprocessing.synchronizemultiprocessing.heaptest.bad_coding2test.test_dynamiclib2to3.fixes.fix_imports2lib2to3.fixes.fix_unicodetest.test_pep3120distutils.tests.test_logctypes.test.test_cfuncsctypes.test.test_inittest.test_asyncoreimportlib.test.builtin.test_finderdistutils.tests.test_build_extdistutils.command.uploadtest.test_http_cookiejarsqlite3.test.typesasttest.test_htmltest.bad_codingsqlite3.test.py25testsctypes.test.test_integersctypes.test.test_stringptrlib2to3.refactorunittest.test.test_setupsdistutils.tests.test_install_libtest.test_pep3131test.__main__test.badsyntax_pep3120_collectionslib2to3.fixes.fix_metaclasstkinter.test.test_ttk.test_functionsemail.mime.imageturtledemo.planet_and_moonunittest.test._test_warningstest.test_codingdistutils.tests.test_sdistimportlib.test.frozen.test_loadertest.test_lib2to3ctypes.macholib.dyldlib2to3.fixes.fix_idiomsunittest.test.test_skippinghashlibtest.test_contextlibtkinter.tixtest.infinite_reload_posixsubprocess_cursesturtledemo.clock_fileioreprliblib2to3.fixes.fix_printtest.test_rangectypes.test.test_simplesubclassesxmlrpc.clientctypes.test.test_byteswaplib2to3.fixes.fix_callablelib2to3wsgiref.handlersctypes.test.test_pointerslib2to3.fixes.fix_standarderrorabcimportlib.test.extension.test_case_sensitivity_sqlite3test.test_copyregdistutils.tests.test_ccompilerunittest.test.test_casectypes.macholibdistutils.tests.test_text_filetest.json_tests.test_indenttkinter.dialogtest.test_memoryviewjson.tests.test_scanstringjson.testsimportlib.test.import_.test_fromlistctypes._endianlib2to3.btm_matcherdistutils.tests.test_util_markupbaseimportlib.test.import_.test_meta_pathlib2to3.tests.pytree_idempotencylib2to3.fixes.fix_bufferxml.etree.ElementTreeturtledemo.foresttkinter.test.test_ttk.test_widgetstest.warning_testslib2to3.pgen2.convtest.test_sqliteimportlib.test.frozen.test_finderlib2to3.fixes.fix_renames_lsproftest.test_file2ktest.test_xml_etreebsddb.test.test_early_closehtml.parserctypes.test.test_bytespyexpat.modeltest.test_univnewlines2ktest.test_linecachelib2to3.pgen2.parselib2to3.fixes.fix_inputurllib.responsedistutils.tests.test_unixccompilerdistutils.tests.test_cleanmultiprocessing.utillib2to3.pgen2test.test_zipimport_supportbuild_classctypes.test.test_array_in_pointerctypeshttp.cookieslib2to3.fixes.fix_exitfunctest.json_tests.test_failctypes.test.test_prototypestest.badsyntax_3131lib2to3.tests.test_all_fixerstest.profilee_stringioctypes.test.test_callbacksctypes.test.test_python_apictypes.test.test_loadingtkinter.scrolledtextemail.mime.applicationtest.tracedmodules.testmodimportlib.test.extension.test_path_hookencodings.mac_croatianimportlib.test.import_.test_relative_importsdistutils.tests.test_bdist_msictypes.test.test_win32test.test_complex_argsencodings.utf_32turtledemo.nimlib2to3.fixes.fix_ws_commalib2to3.pgen2.grammartest.test_cmd_line_scriptencodings.mac_arabictest.test_wait4test.test_wait3distutils.command.bdist_msidistutils.tests.test_file_utiltkinter.test.test_ttk.test_styletest.test_http_cookiesjson.decoderctypes.test.test_errcheckunittest.test.test_programlib2to3.tests.test_refactoriomultiprocessing.queuesdbm.dumbsqlite3unittest.test.test_runnerctypes.test.test_anontest.test_propertytest.test_macosdistutils.tests.test_filelistctypes.test.test_macholibdistutils.tests.test_bdistctypes.macholib.dylibtest.test_dbm_dumbctypes.testdistutils.tests.test_archive_utillib2to3.fixes.fix_getcwdulib2to3.fixes.fix_raw_input_ctypes_testemail.mimetest.test_mutextest.test_argparsejson.toolctypes.test.test_findunittest.mainmultiprocessing.forkingjson.tests.test_decodemultiprocessing.dummytest.test_with_bytesioctypes.test.test_returnfuncptrsctypes.test.test_memfunctionstest.test_sysconfigdistutils.tests.test_uploadtest.test_py3kwarnencodings.mac_romaniantest.test_dictcompsbsddb.test.test_cursor_pget_bugmultiprocessing.reductiontest.win_console_handlertest.datetimetesterctypes.test.test_bufferslib2to3.fixes.fix_execfiletest.test_sys_settracectypes.test.test_structureswsgirefturtledemo.peacemultiprocessing.managerstest.test_old_mailboxencodings.mac_farsiunittest.loaderidlelib.AutoCompleteemail.mime.multipartbsddb.test.test_dbenvlib2to3.tests.test_parserimportlib.test.extension.utillib2to3.fixes.fix_dictbsddb.test.test_sequenceimportlib.machineryemail.test.test_email_renamedctypes.test.test_incompletexml.etree.ElementIncludelib2to3.fixes.fix_numliteralslib2to3.fixes.fix_map_pyio_structjson.tests.test_separatorsimportlib.test.test_utiltest.pydoc_modjson.tests.test_floatunittest.test.test_discoveryconcurrent.futures.threadtest.make_ssl_certslib2to3.fixes.fix_nonzerodistutils.tests.setuptools_build_extlib2to3.btm_utilsgenericpathspwdtest.test_defaultdictjson.tests.test_check_circulardistutils.tests.test_config_cmdconcurrentimportlib.test.test_abcemail.mime.audiotest.test_bigaddrspacedistutils.tests.test_checksqlite3.test.userfunctionsunittest.test.test_assertionsctypes.test.test_bitfieldsdistutils.tests.test_bdist_wininstturtledemo.painttest.tracedmoduleslib2to3.fixes.fix_raiseidlelib.MultiCalltest.time_hashliblib2to3.fixes.fix_execurllib.parse_elementtreetest.test_gdbtest.json_tests.test_pass2test.json_tests.test_pass3distutils.command.install_egg_infowsgiref.utiljson.tests.test_dumpctypes.test.test_unaligned_structureslib2to3.pygramhttp.servertkinter.constantstest.test_smtpddistutils.msvc9compilertest.json_tests.test_decodemultiprocessingtest.test_kqueueunittest.test.supportlib2to3.pytree_threadimportlib.testtest.test_cProfiledistutils.tests.test_spawnunittest.suite_ctypestest.test_reprlibjson.scannerimportlib.test.import_.test_packagesimportlib.test.regrtestlib2to3.fixes.fix_importstest.test_concurrent_futuresdistutils.tests.test_cygwinccompilerdistutils.tests.setuptools_extensiontkinter.testtest.json_tests.test_scanstringimportlib.test.abclib2to3.maindistutils.tests.test_msvc9compilertest.buffer_teststest.encoded_modulestkinter.messageboxtest.outstanding_bugsidlelib.HyperParserimportlib.test.source.test_source_encodingtest.fork_wait_ast_datetimeunittest.test.test_functiontestcaseimportlib.test.source.test_findertest.test_telnetlibwsgiref.headersdistutils.tests.test_extensionimportlib.test.import_.test_apixml.etree.ElementPathtkinter.test.test_ttk.test_extensionstest.test_int_literalimportlib._bootstrapimportlib.test.import_.test_pathimportlib.test.utillib2to3.fixes.fix_tuple_paramstest.encoded_modules.module_iso_8859_1importlib.test.sourcetest.test_numeric_towerctypes.test.test_unicodeturtledemo.two_canvasestest.test_zipfile64lib2to3.fixes.fix_operatorlib2to3.fixes.fix_isinstancetest.test_pydoc_weakrefsetlib2to3.fixes.fix_reducetest.test_ftplibturtledemo.chaostest.test_indextkinter.filedialogtest.test_fluflemail.mime.textsysconfigtkinter.__main__builtinstest.test_runpytest.test_cprofileimportlib.test.extensionpydoc_topicslib2to3.tests.test_fixersunittest.utillib2to3.fixesimportlib.test.source.utiltest.test_sunautest.test_raiselib2to3.fixes.fix_internlib2to3.pgen2.driverdistutils.versionpredicatetest.test_exception_variationsturtletest.test_wsgireftest.json_tests.test_speedupstest.test_uuidunittest.testctypes.utillib2to3.fixes.fix_has_keydistutils.tests.test_versionpredicateimportlib.test.import_test.test_compilealllib2to3.tests.test_utiltest.test_email_renamedimportlib.test.extension.test_finderlib2to3.patcompturtledemotest.json_tests.test_default_stringsqlite3.test.dumptest.test_fileiolib2to3.tests.test_mainctypes.test.test_numbersimportlib.test.__main__test.test_ctypesfpectlencodings.mac_centeurotest.inspect_fodder2test.test_SimpleHTTPServertest.mock_socketctypes.test.test_random_thingstest.json_tests.test_encode_basestring_asciidistutils.tests.test_bdist_rpmdistutils.configtest.test_dbm_ndbmdistutils.tests.test_configlib2to3.fixes.fix_reprtest.test_osx_envtest.test_modulefindertest.test_aifcwsgiref.simple_serverlib2to3.fixes.fix_import_hashlibtest.inspect_foddertest.test_platformcopyregctypes.test.test_internalstest.test_docxmlrpcconcurrent.futuresxml.etree.cElementTreeunittest.resultconcurrent.futures._baselib2to3.fixes.fix_xrangetkinter.test.test_tkinter_curses_panelfuture_builtinslib2to3.fixes.fix_itertools_importslib2to3.tests_iosqlite3.test.hooksdbm_multiprocessinglib2to3.fixes.fix_parentest.dis_module_compat_pickleimportlibjson.tests.test_encode_basestring_ascii_jsonpyexpat.errorsctypes.test.runtestscProfiletkinter.test.test_tkinter.test_loadtktest.test_memoryiolib2to3.fixes.fix_itertoolstest.test_rlcompletertest.test_sndhdrssltest.test_smtplibtest.test_intctypes.test.test_delattrdistutils.tests.test_bdist_dumbunittest.runnertest.test_dictviewsctypes.wintypestest.test_strlittest.test_ttk_guionlyencodings.cp858lib2to3.fixes.fix_urllibpydoc_datatest.test_xml_etree_clib2to3.fixes.fix_funcattrsplistlibmultiprocessing.dummy.connectionunittest.casejson.tests.test_indentdistutils.tests.test_dir_utiltest.json_tests.test_floattkinter.test.supportunittest.test.dummylib2to3.tests.test_pytreectypes.test.test_valuesjson.tests.test_fail_picklelib2to3.fixes.fix_ziptest.test_structmembersbsddb.test.test_replicationtkinter.dndsqlite3.dumptest.test_pkgutilimportlib.test.builtinjsonlib2to3.pgen2.tokenizeturtledemo.round_dancetest.encoded_modules.module_koi8_rtest.test_nntplibctypes.test.test_sizestkinterctypes.test.test_arrayssqlite3.test.transactionsctypes.test.test_stringsctypes.test.test_objectslib2to3.fixes.fix_basestringdistutils.tests.test_install_headerstest.test_importlibctypes.test.test_refcountssqlite3.test.dbapitest.test_smtpnettkinter.colorchooserencodings.utf_32_betest.test_tkturtledemo.penrosetest.json_tests.test_dumplib2to3.fixes.fix_throwtest.test_ssltest.test_xdrlibhtmlemail.test.test_email_codecs_renameddbm.ndbmturtledemo.wikipediahttpunittest.test.test_loaderctypes.test.test_struct_fieldsbsddb.test.test_dbxmlrpc.serverctypes.test.test_parametersurllib.errordistutils.tests.test_build_clibjson.tests.test_pass2json.tests.test_pass3json.tests.test_pass1test.test_weaksettest.test_strtodtest.test_iohtml.entitiestest.gdb_samplehttp.clienttest.test_msilibctypes.test.test_reprimportlib.test.frozen_dbmmultiprocessing.sharedctypesencodings.utf_32_letest.curses_teststkinter.simpledialogimportlib.test.builtin.utiltest.test_codecencodings_iso2022xmlrpctest.test_unpack_eximportlib.abcdistutils.tests.test_versiontest.test_bytestkinter.test.test_tkinter.test_textturtledemo.__main__test.supporttest.test_urllib2_localnettest.test_syslogmultiprocessing.processdistutils.tests.test_registerimportlib.test.source.test_abc_loaderimportlib.test.test_apitest.test_codetest.test_superlib2to3.fixes.fix_nexttkinter.test.runtkteststest.test_genericpathdistutils.tests.test_sysconfigtest.test_listcompstest.test_functoolstest.test_asthttp.cookiejarlib2to3.fixes.fix_set_literaldistutils.tests.test_dep_utilidlelib.RstripExtensiontest.test_ascii_formatdlib2to3.fixes.fix_futurejson.tests.test_defaultsqlite3.dbapi2test.relimportunittest.test.test_suite_functoolstest.lock_testslib2to3.pgen2.tokentest.test_typechecksctypes.macholib.frameworkidlelib.AutoCompleteWindowlib2to3.fixes.fix_exceptimportlib.test.builtin.test_loadersqlite3.test.regressiontest.json_tests.test_unicodelib2to3.tests.supportdistutils.command.checkurllib.robotparsermultiprocessing.connectiontest.test_fractionstest.test_abc_warningsimportlib.test.extension.test_loaderlib2to3.fixes.fix_netest.test_bufferlib2to3.fixes.fix_filterimportlib.test.source.test_case_sensitivitywsgiref.validateturtledemo.tree_typestest.test_pdbtest.test_timeitlib2to3.pgen2.literalsemail.mime.basectypes.test.test_as_parametertest.test_bigmemctypes.test.test_frombuffertest.test_undocumented_detailstest.test_pstatscontextlibemail.mime.nonmultiparttest.test_pipeslib2to3.fixes.fix_sys_exctest.test_poplibtest.test_metaclassctypes.test.test_varsize_struct_abcolllib2to3.__main__importlib.test.import_.utiltest.test_startfileunittest.signalsctypes.test.test_errnotest.test_pep352distutils.tests.test_cmdbsddb.test.test_comparetest.test_jsontest.test_httpserversbytearrayallmemoryviewnextbinbytesasciiformatanyprintimportlib.test.source.test_file_loadertest.test_future_builtins_dummy_threadpydoc_data.topicstest.test_epolldbm.gnutkinter.test.test_tkinter.test_fontlib2to3.fixer_utilimportlib.test.import_.test_cachingbsddb.test.test_distributed_transactionsantigravityjson.encodertest.test_future5test.test_future4test.json_tests.test_recursionmultiprocessing.pooltkinter._fixtest.ssl_serverslib2to3.fixes.fix_methodattrsturtledemo.minimal_hanoiturtledemo.fractalcurvesturtledemo.lindenmayertest.test_abstract_numbersctypes.test.test_picklinglib2to3.fixer_baselib2to3.fixes.fix_typesctypes.test.test_pep3118test.json_tests.test_separatorsimportlib.test.import_.test___package__importlib.test.benchmarkjson.tests.test_unicodeturtledemo.colormixerlib2to3.fixes.fix_xreadlinestkinter.ttkdistutils.tests.test_coreencodings.cp720test.json_testsunittest.test.test_resulttest.test_schedturtledemo.yinyangtest.test_xmlrpc_nettest.test_sys_setprofiletkinter.test.test_ttktest.test_ttk_textonlyfractionsimportlib.test.source.test_path_hookreconvertbsddb.test.test_fileidtkinter.fontunittest.__main__tkinter.commondialoglib2to3.fixes.fix_applytest.test_keywordonlyargtest.test_setcompstest.test_collectionsjson.tests.test_speedupsjson.tests.test_recursionnumberstest.test_cmdemail.MIMEBaselib2to3.fixes.fix_longconcurrent.futures.processdistutils.tests.test_buildtest.test_urllib_responseidlelib.tabbedpagesurllib.requesttest.test_printargparsetest.test_multiprocessingtest.test_dbm_gnuimportlib.utiltest.json_tests.test_pass1turtledemo.bytedesignlib2to3.pgen2.pgendistutils.tests.test_install_datatest.script_helpertest.test_readlineunittest.test.test_breakmultiprocessing.synchronizemultiprocessing.heaptest.test_dynamiclib2to3.fixes.fix_imports2lib2to3.fixes.fix_unicodetest.test_pep3120distutils.tests.test_logtest.test_asyncoreimportlib.test.builtin.test_finderdistutils.tests.test_build_exttest.test_http_cookiejarasttest.test_htmlsqlite3.test.py25testslib2to3.refactorunittest.test.test_setupsdistutils.tests.test_install_libtest.test_pep3131test.__main__test.badsyntax_pep3120_collectionslib2to3.fixes.fix_metaclasstkinter.test.test_ttk.test_functionsturtledemo.planet_and_moonunittest.test._test_warningsdistutils.tests.test_sdistimportlib.test.frozen.test_loadertest.test_lib2to3lib2to3.fixes.fix_idiomsunittest.test.test_skippingtkinter.tix_posixsubprocess_cursesturtledemo.clock_fileioreprliblib2to3.fixes.fix_printtest.test_rangexmlrpc.clientlib2to3.fixes.fix_callablelib2to3lib2to3.fixes.fix_standarderrorabcimportlib.test.extension.test_case_sensitivitytest.test_copyregdistutils.tests.test_ccompilerunittest.test.test_casedistutils.tests.test_text_filetest.json_tests.test_indenttkinter.dialogregex_syntaxtest.test_memoryviewjson.tests.test_scanstringjson.testsimportlib.test.import_.test_fromlistlib2to3.btm_matcherdistutils.tests.test_util_markupbasetest.test_regeximportlib.test.import_.test_meta_pathlib2to3.tests.pytree_idempotencylib2to3.fixes.fix_bufferturtledemo.foresttkinter.test.test_ttk.test_widgetstest.warning_testslib2to3.pgen2.convimportlib.test.frozen.test_finderlib2to3.fixes.fix_renamestest.test_file2kbsddb.test.test_early_closehtml.parserctypes.test.test_bytestest.test_univnewlines2ktest.test_linecachelib2to3.pgen2.parselib2to3.fixes.fix_inputurllib.responsedistutils.tests.test_unixccompilerdistutils.tests.test_cleanmultiprocessing.utillib2to3.pgen2test.test_zipimport_supportbuild_classhttp.cookieslib2to3.fixes.fix_exitfunctest.json_tests.test_failtest.badsyntax_3131lib2to3.tests.test_all_fixerstest.profilee_stringiotkinter.scrolledtexttest.tracedmodules.testmodimportlib.test.extension.test_path_hookimportlib.test.import_.test_relative_importsdistutils.tests.test_bdist_msiencodings.utf_32turtledemo.nimlib2to3.fixes.fix_ws_commalib2to3.pgen2.grammartest.test_cmd_line_scriptdistutils.tests.test_file_utiltkinter.test.test_ttk.test_styletest.test_http_cookiesjson.decoderunittest.test.test_programlib2to3.tests.test_refactoriomultiprocessing.queuesdbm.dumbunittest.test.test_runnertest.test_propertytest.test_macosdistutils.tests.test_filelistdistutils.tests.test_bdisttest.test_dbm_dumbdistutils.tests.test_archive_utillib2to3.fixes.fix_getcwdulib2to3.fixes.fix_raw_inputtest.test_mutextest.test_argparsejson.toolunittest.mainmultiprocessing.forkingjson.tests.test_decodemultiprocessing.dummy_bytesiotest.test_sysconfigdistutils.tests.test_uploadtest.test_py3kwarntest.test_dictcompsmultiprocessing.reductiontest.win_console_handlertest.datetimetesterlib2to3.fixes.fix_execfilewhrandomtest.test_sys_settraceturtledemo.peacemultiprocessing.managersunittest.loaderbsddb.test.test_dbenvlib2to3.tests.test_parserimportlib.test.extension.utillib2to3.fixes.fix_dictimportlib.machinerylib2to3.fixes.fix_numliteralslib2to3.fixes.fix_map_pyiojson.tests.test_separatorsimportlib.test.test_utiltest.pydoc_modjson.tests.test_floattzparseunittest.test.test_discoveryconcurrent.futures.threadtest.make_ssl_certslib2to3.fixes.fix_nonzerodistutils.tests.setuptools_build_extlib2to3.btm_utilsgenericpathjson.tests.test_check_circulardistutils.tests.test_config_cmdconcurrentimportlib.test.test_abcdistutils.tests.test_checkunittest.test.test_assertionsdistutils.tests.test_bdist_wininsttest.test_timingturtledemo.painttest.tracedmoduleslib2to3.fixes.fix_raiselib2to3.fixes.fix_execurllib.parsetest.test_gdbtest.json_tests.test_pass2test.json_tests.test_pass3json.tests.test_dumplib2to3.pygramhttp.servertkinter.constantstest.test_smtpddistutils.msvc9compilertest.json_tests.test_decodemultiprocessingtest.test_kqueueunittest.test.supportlib2to3.pytree_threadimportlib.testdistutils.tests.test_spawnunittest.suitetest.test_reprlibjson.scannerimportlib.test.import_.test_packagesimportlib.test.regrtestlib2to3.fixes.fix_importstest.test_concurrent_futuresdistutils.tests.test_cygwinccompilerdistutils.tests.setuptools_extensiontkinter.testtest.json_tests.test_scanstringimportlib.test.abclib2to3.mainregexemail.MIMEMessagedistutils.tests.test_msvc9compilertest.buffer_teststest.encoded_modulestkinter.messageboximportlib.test.source.test_source_encoding_datetimeunittest.test.test_functiontestcaseimportlib.test.source.test_findertest.test_telnetlibdistutils.tests.test_extensionimportlib.test.import_.test_apitkinter.test.test_ttk.test_extensionstest.test_int_literalimportlib._bootstrapimportlib.test.import_.test_pathimportlib.test.utillib2to3.fixes.fix_tuple_paramstest.encoded_modules.module_iso_8859_1importlib.test.sourcetest.test_numeric_towerturtledemo.two_canvaseslib2to3.fixes.fix_operatorlib2to3.fixes.fix_isinstancetest.test_pydoc_weakrefsetlib2to3.fixes.fix_reducetest.test_ftplibturtledemo.chaostkinter.filedialogtest.test_fluflsysconfigemail.MIMEImagetkinter.__main__email.MIMETextbuiltinstest.test_cprofileimportlib.test.extensionpydoc_topicslib2to3.tests.test_fixersunittest.utillib2to3.fixesimportlib.test.source.utiltest.test_sunautest.test_raiselib2to3.fixes.fix_internlib2to3.pgen2.driverturtletest.json_tests.test_speedupsunittest.testlib2to3.fixes.fix_has_keyimportlib.test.import_test.test_compilealllib2to3.tests.test_utilimportlib.test.extension.test_finderlib2to3.patcompturtledemotest.json_tests.test_default_stringidlelib.buildappsqlite3.test.dumptest.test_fileiolib2to3.tests.test_mainimportlib.test.__main__fpectltest.test_SimpleHTTPServertest.mock_sockettest.json_tests.test_encode_basestring_asciidistutils.tests.test_bdist_rpmdistutils.configtest.test_dbm_ndbmdistutils.tests.test_configlib2to3.fixes.fix_reprtest.test_osx_envtest.test_modulefindertest.test_aifclib2to3.fixes.fix_importcopyregtest.test_docxmlrpcconcurrent.futuresunittest.resultconcurrent.futures._basestatcachelib2to3.fixes.fix_xrangetkinter.test.test_tkinter_curses_panelfuture_builtinslib2to3.fixes.fix_itertools_importslib2to3.tests_iodbm_multiprocessinglib2to3.fixes.fix_parentest.dis_module_compat_pickleimportlibjson.tests.test_encode_basestring_ascii_jsontkinter.test.test_tkinter.test_loadtktest.test_memoryiolib2to3.fixes.fix_itertoolstest.test_rlcompletertest.test_sndhdrssltimingtest.test_smtplibtest.test_intdistutils.tests.test_bdist_dumbunittest.runnertest.test_dictviewstest.test_strlittest.test_ttk_guionlyencodings.cp858lib2to3.fixes.fix_urllibpydoc_datalib2to3.fixes.fix_funcattrsplistlibmultiprocessing.dummy.connectionunittest.casejson.tests.test_indentdistutils.tests.test_dir_utiltest.json_tests.test_floattkinter.test.supportunittest.test.dummylib2to3.tests.test_pytreejson.tests.test_fail_pickleemail.MIMEMultipartlib2to3.fixes.fix_zipbsddb.test.test_replicationtkinter.dndsqlite3.dumptest.test_pkgutilimportlib.test.builtinjsonlib2to3.pgen2.tokenizeturtledemo.round_dancetest.encoded_modules.module_koi8_rtest.test_nntplibtkinteremail.MIMENonMultipartlib2to3.fixes.fix_basestringdistutils.tests.test_install_headerstest.test_importlibtest.test_smtpnettkinter.colorchooserencodings.utf_32_betest.test_tkturtledemo.penrosetest.json_tests.test_dumplib2to3.fixes.fix_throwtest.test_sslhtmldbm.ndbmturtledemo.wikipediahttpunittest.test.test_loaderbsddb.test.test_dbxmlrpc.serverurllib.errordistutils.tests.test_build_clibjson.tests.test_pass2json.tests.test_pass3json.tests.test_pass1test.test_weaksettest.test_strtodtest.test_iohtml.entitiestest.gdb_samplehttp.clienttest.test_msilibimportlib.test.frozen_dbmmultiprocessing.sharedctypesencodings.utf_32_letest.curses_teststkinter.simpledialogimportlib.test.builtin.utiltest.test_codecencodings_iso2022xmlrpctest.test_unpack_eximportlib.abcdistutils.tests.test_versiontest.test_bytestkinter.test.test_tkinter.test_textturtledemo.__main__test.supporttest.test_syslogmultiprocessing.processdistutils.tests.test_registerimportlib.test.source.test_abc_loaderimportlib.test.test_apitest.test_superlib2to3.fixes.fix_nexttkinter.test.runtkteststest.test_genericpathdistutils.tests.test_sysconfigemail.MIMEAudiotest.test_listcompshttp.cookiejarlib2to3.fixes.fix_set_literaldistutils.tests.test_dep_utilidlelib.RstripExtensiontest.test_ascii_formatdlib2to3.fixes.fix_futurejson.tests.test_defaulttest.relimportunittest.test.test_suitetest.lock_testslib2to3.pgen2.tokentest.test_typecheckslib2to3.fixes.fix_exceptimportlib.test.builtin.test_loadertest.json_tests.test_unicodelib2to3.tests.supportdistutils.command.checkurllib.robotparsermultiprocessing.connectionregsubtest.test_fractionstest.test_abc_warningsimportlib.test.extension.test_loaderlib2to3.fixes.fix_netest.test_bufferlib2to3.fixes.fix_filterimportlib.test.source.test_case_sensitivityturtledemo.treetest.test_pdbtest.test_timeitlib2to3.pgen2.literalsctypes.test.test_frombuffertest.test_undocumented_detailstest.test_pstatstest.test_pipeslib2to3.fixes.fix_sys_exctest.test_poplibtest.test_metaclass_abcolllib2to3.__main__importlib.test.import_.utilunittest.signalsctypes.test.test_errnodistutils.tests.test_cmdtest.test_jsontest.test_httpserversbytearraymemoryviewnextbinbytesasciiformatprintimportlib.test.source.test_file_loader_dummy_threadbsddb.test.test_env_closepydoc_data.topicsdbm.gnutkinter.test.test_tkinter.test_fontimportlib.test.import_.test_cachingantigravitytest.json_tests.test_recursiontkinter._fixtest.ssl_serversturtledemo.minimal_hanoiturtledemo.fractalcurvesturtledemo.lindenmayertest.json_tests.test_separatorsimportlib.test.import_.test___package__importlib.test.benchmarkturtledemo.colormixertkinter.ttkencodings.cp720test.json_testsunittest.test.test_resulttest.test_schedturtledemo.yinyangtest.test_xmlrpc_nettest.test_sys_setprofiletkinter.test.test_ttktest.test_ttk_textonlyimportlib.test.source.test_path_hookreconvertbsddb.test.test_fileidtkinter.fontunittest.__main__tkinter.commondialogtest.test_keywordonlyargtest.test_setcompsemail.MIMEBaseconcurrent.futures.processtest.test_operationsdistutils.tests.test_buildtest.test_urllib_responseurllib.requestargparsetest.test_dbm_gnuimportlib.utiltest.json_tests.test_pass1turtledemo.bytedesignpsycopg2distutils.tests.test_install_datatest.script_helperunittest.test.test_breaktest.test_dynamictest.test_pep3120distutils.tests.test_logimportlib.test.builtin.test_findertest.test_http_cookiejartest.test_htmlunittest.test.test_setupstest.test_pep3131test.__main__test.badsyntax_pep3120tkinter.test.test_ttk.test_functionsturtledemo.planet_and_moonunittest.test._test_warningsimportlib.test.frozen.test_loaderidlelib.tabpageunittest.test.test_skippingtkinter.tix_posixsubprocess_cursesturtledemo.clockreprlibtest.test_rangexmlrpc.clientimportlib.test.extension.test_case_sensitivitytest.test_copyregdistutils.tests.test_ccompilerunittest.test.test_casedistutils.tests.test_text_filetest.json_tests.test_indenttkinter.dialogregex_syntaxtest.test_memoryviewimportlib.test.import_.test_fromlistlib2to3.btm_matcher_markupbasetest.test_regeximportlib.test.import_.test_meta_pathturtledemo.foresttkinter.test.test_ttk.test_widgetsimportlib.test.frozen.test_findertest.test_file2khtml.parserctypes.test.test_bytestest.test_univnewlines2kurllib.responsedistutils.tests.test_cleanbuild_classhttp.cookiestest.json_tests.test_failtest.badsyntax_3131_stringiotest.test_macfstkinter.scrolledtexttest.tracedmodules.testmodimportlib.test.extension.test_path_hookimportlib.test.import_.test_relative_importsdistutils.tests.test_bdist_msiturtledemo.nimdistutils.tests.test_file_utiltkinter.test.test_ttk.test_styletest.test_http_cookiesunittest.test.test_programdbm.dumbunittest.test.test_runnerdistutils.tests.test_bdisttest.test_dbm_dumbdistutils.tests.test_archive_utiltest.test_argparseunittest.maintest.test_sysconfigtest.test_dictcompstest.win_console_handlertest.datetimetesterwhrandomtest.test_sys_settraceturtledemo.peaceunittest.loaderbsddb.test.test_dbenvimportlib.test.extension.utiltest.test_rgbimgpsycopg2._psycopgimportlib.machinery_pyioimportlib.test.test_utiltzparseunittest.test.test_discoveryconcurrent.futures.threadtest.make_ssl_certslib2to3.btm_utilsjson.tests.test_check_circulardistutils.tests.test_config_cmdconcurrentimportlib.test.test_abcdistutils.tests.test_checkunittest.test.test_assertionstest.test_timingturtledemo.painttest.tracedmodulesurllib.parsetest.test_gdbtest.json_tests.test_pass2test.json_tests.test_pass3http.servertkinter.constantstest.test_smtpdtest.json_tests.test_decodeunittest.test.support_threadimportlib.testtest.test_cProfiledistutils.tests.test_spawnunittest.suitetest.test_reprlibimportlib.test.import_.test_packagesimportlib.test.regrtesttest.test_concurrent_futuresdistutils.tests.test_cygwinccompilertkinter.testtest.json_tests.test_scanstringimportlib.test.abcregexemail.MIMEMessagetest.encoded_modulestkinter.messageboximportlib.test.source.test_source_encoding_datetimeunittest.test.test_functiontestcaseimportlib.test.source.test_finderdistutils.tests.test_extensionimportlib.test.import_.test_apitkinter.test.test_ttk.test_extensionsimportlib._bootstrapimportlib.test.import_.test_pathimportlib.test.utiltest.encoded_modules.module_iso_8859_1importlib.test.sourcetest.test_numeric_towerturtledemo.two_canvases_weakrefsetturtledemo.chaostkinter.filedialogtest.test_fluflsysconfigemail.MIMEImagetkinter.__main__email.MIMETextbuiltinsimportlib.test.extensiongopherlibunittest.utilimportlib.test.source.utiltest.test_sunautest.test_raiseturtlebsddb.test.test_1413192test.json_tests.test_speedupsunittest.testimportlib.test.import_test.test_compileallimportlib.test.extension.test_finderturtledemotest.json_tests.test_default_stringidlelib.buildappimportlib.test.__main__fpectltest.mock_sockettest.json_tests.test_encode_basestring_asciidistutils.tests.test_bdist_rpmtest.test_dbm_ndbmtest.test_osx_envcopyregconcurrent.futuresunittest.resultconcurrent.futures._basestatcachetkinter.test.test_tkinter_curses_panel_iodbmtest.dis_module_compat_pickleimportlibtkinter.test.test_tkinter.test_loadtktest.test_rlcompletertest.test_sndhdrtimingdistutils.tests.test_bdist_dumbunittest.runnertest.test_dictviewstest.test_strlittest.test_ttk_guionlyencodings.cp858pydoc_dataunittest.casedistutils.tests.test_dir_utiltest.json_tests.test_floattkinter.test.supportunittest.test.dummy_pickleemail.MIMEMultiparttkinter.dndimportlib.test.builtinturtledemo.round_dancetest.encoded_modules.module_koi8_rtest.test_nntplibtkinteremail.MIMENonMultipartdistutils.tests.test_install_headerstest.test_importlibtkinter.colorchoosertest.test_tkturtledemo.penrosetest.json_tests.test_dumphtmldbm.ndbmturtledemo.wikipediahttpunittest.test.test_loadertest.test_hexoctbsddb.test.test_dbxmlrpc.serverurllib.errordistutils.tests.test_build_clibtest.test_weaksettest.test_strtodhtml.entitiestest.gdb_samplehttp.clienttest.test_msilibimportlib.test.frozen_dbmtkinter.simpledialogimportlib.test.builtin.utiltest.test_codecencodings_iso2022xmlrpctest.test_unpack_eximportlib.abcdistutils.tests.test_versiontkinter.test.test_tkinter.test_textturtledemo.__main__test.supporttest.test_syslogimportlib.test.source.test_abc_loaderimportlib.test.test_apitest.test_supertkinter.test.runtktestsemail.MIMEAudiotest.test_listcompshttp.cookiejardistutils.tests.test_dep_utilidlelib.RstripExtensiontest.test_ascii_formatdunittest.test.test_suiteimportlib.test.builtin.test_loadertest.json_tests.test_unicodedistutils.command.checkurllib.robotparserregsubimportlib.test.extension.test_loaderimportlib.test.source.test_case_sensitivityturtledemo.treetest.test_socket_ssl_typestest.test_pdbtest.test_timeittest.test_metaclasslib2to3.__main__importlib.test.import_.utilunittest.signalsdistutils.tests.test_cmdmemoryviewasciiimportlib.test.source.test_file_loader_dummy_threadbsddb.test.test_env_closedbm.gnutkinter.test.test_tkinter.test_fontimportlib.test.import_.test_cachingtest.json_tests.test_recursiontkinter._fixtest.ssl_serversturtledemo.minimal_hanoiturtledemo.fractalcurvesturtledemo.lindenmayertest.json_tests.test_separatorsimportlib.test.import_.test___package__importlib.test.benchmarkturtledemo.colormixertkinter.ttktest.json_teststest.test_schedturtledemo.yinyangtest.test_xmlrpc_nettkinter.test.test_ttkimportlib.test.source.test_path_hookreconverttkinter.fonttkinter.commondialogtest.test_keywordonlyargtest.test_profilehooksemail.MIMEBaseconcurrent.futures.processtest.test_operationstest.test_urllib_responseurllib.requesttest.test_dbm_gnuimportlib.utiltest.json_tests.test_pass1turtledemo.bytedesignpsycopg2test.test_dynamictest.test_pep3120distutils.tests.test_logimportlib.test.builtin.test_findertest.test_http_cookiejartest.test_htmltest.test_pep3131test.__main__test.badsyntax_pep3120tkinter.test.test_ttk.test_functionsturtledemo.planet_and_moonunittest.test._test_warningsimportlib.test.frozen.test_loaderidlelib.tabpagetkinter.tix_posixsubprocess_cursesturtledemo.clock_fileioreprlibtest.test_rangexmlrpc.clientimportlib.test.extension.test_case_sensitivitytest.test_copyregtest.json_tests.test_indenttkinter.dialogregex_syntaximportlib.test.import_.test_fromlist_markupbasetest.test_regeximportlib.test.import_.test_meta_pathturtledemo.foresttkinter.test.test_ttk.test_widgetstest.cjkencodings_testimportlib.test.frozen.test_finderhtml.parserctypes.test.test_bytesurllib.responsebuild_classhttp.cookiestest.json_tests.test_failtest.badsyntax_3131_stringiotest.test_macfstkinter.scrolledtextimportlib.test.extension.test_path_hookimportlib.test.import_.test_relative_importsturtledemo.nimtkinter.test.test_ttk.test_styletest.test_http_cookiesdbm.dumbtest.test_dbm_dumb_bytesiotest.datetimetesterwhrandomturtledemo.peaceimportlib.test.extension.utiltest.test_rgbimgpsycopg2._psycopgimportlib.machineryimportlib.test.test_utildistutils.mwerkscompilertzparseconcurrent.futures.threadtest.make_ssl_certsconcurrentimportlib.test.test_abctest.test_timingturtledemo.painturllib.parsetest.json_tests.test_pass2test.json_tests.test_pass3http.servertkinter.constantstest.test_smtpdtest.json_tests.test_decode_threadimportlib.testtest.test_cProfiletest.test_reprlibimportlib.test.import_.test_packagesimportlib.test.regrtesttest.test_concurrent_futuresdistutils.tests.test_cygwinccompilertkinter.testtest.json_tests.test_scanstringimportlib.test.abcregexemail.MIMEMessagetest.encoded_modulestkinter.messageboximportlib.test.source.test_source_encoding_datetimeimportlib.test.source.test_finderdistutils.tests.test_extensionimportlib.test.import_.test_apitkinter.test.test_ttk.test_extensionsimportlib._bootstrapimportlib.test.import_.test_pathimportlib.test.utiltest.encoded_modules.module_iso_8859_1importlib.test.sourcetest.test_numeric_towerturtledemo.two_canvasesturtledemo.chaostkinter.filedialogtest.test_fluflemail.MIMEImagetkinter.__main__email.MIMETextbuiltinsimportlib.test.extensionpydoc_topicsgopherlibimportlib.test.source.utiltest.test_sunautest.test_raiseturtlebsddb.test.test_1413192test.json_tests.test_speedupsimportlib.test.import_importlib.test.extension.test_finderturtledemotest.json_tests.test_default_stringidlelib.buildappimportlib.test.__main__fpectltest.mock_sockettest.json_tests.test_encode_basestring_asciitest.test_dbm_ndbmtest.test_osx_envcopyregconcurrent.futuresconcurrent.futures._basestatcachetkinter.test.test_tkinter_curses_paneldbmtest.dis_module_compat_pickletkinter.test.test_tkinter.test_loadtktest.test_sndhdrtimingtest.test_strlittest.json_tests.test_floattkinter.test.support_pickleemail.MIMEMultiparttkinter.dndimportlib.test.builtinturtledemo.round_dancetest.encoded_modules.module_koi8_rtest.test_nntplibtkinteremail.MIMENonMultiparttkinter.colorchooserturtledemo.penrosetest.json_tests.test_dumphtmldbm.ndbmturtledemo.wikipediahttptest.test_hexoctxmlrpc.serverurllib.errorhtml.entitieshttp.clientimportlib.test.frozen_dbmtkinter.simpledialogimportlib.test.builtin.utiltest.test_codecencodings_iso2022xmlrpctest.test_unpack_eximportlib.abctkinter.test.test_tkinter.test_textturtledemo.__main__test.supporttest.test_syslogimportlib.test.source.test_abc_loaderimportlib.test.test_apitest.test_supertkinter.test.runtktestsemail.MIMEAudiotest.test_listcompshttp.cookiejarimportlib.test.builtin.test_loadertest.json_tests.test_unicodeurllib.robotparserregsubimportlib.test.extension.test_loaderimportlib.test.source.test_case_sensitivityturtledemo.treetest.test_socket_ssl_typestest.test_timeittest.test_metaclassimportlib.test.import_.utilasciiimportlib.test.source.test_file_loadertest.test_future_builtinsbsddb.testbsddb.test.test_basicsbsddb.test.test_env_closetest.test_alpydoc_data.topicsmimifytkinter.test.test_tkinter.test_fontimportlib.test.import_.test_cachingbsddb.test.test_distributed_transactionstest.test_fpformattest.test_getargstest.test_multifiletest.json_tests.test_recursiontest.ssl_serversturtledemo.minimal_hanoitoaiffturtledemo.fractalcurvesturtledemo.lindenmayerUserListtest.json_tests.test_separatorsnewtest.test_cdimportlib.test.import_.test___package__importlib.test.benchmarkturtledemo.colormixertkinter.ttkStringIOencodings.cp720test.json_testsunittest.test.test_resulttest.test_schedBastionturtledemo.yinyangcopy_regtest.test_sys_setprofiletkinter.test.test_ttktest.test_ttk_textonlycPickleimportlib.test.source.test_path_hookreconverttest.test_email_codecscompiler.syntaxbsddb.test.test_fileidanydbmunittest.__main__exceptionscompiler.pyassememail.MIMEBasestropconcurrent.futures.processtest.test_operationsbsddb.dbshelvedistutils.tests.test_buildtest.test_urllib_responsehtmlentitydefsargparsetest.test_mimetoolstest.test_sunaudiodevtest.test_cookielibencodings.hex_codecbsddb.test.test_dbtablesimportlib.utiltest.json_tests.test_pass1turtledemo.bytedesignpsycopg2distutils.tests.test_install_datatest.script_helpertest.test_readlineunittest.test.test_breaktest.test_dynamicdistutils.tests.test_logtest.test_mhlibimportlib.test.builtin.test_findertest.test_copy_regtest.test_htmlsqlite3.test.py25testsmd5threadtest.test_cookieunittest.test.test_setupsdistutils.tests.test_install_libtest.__main__xmllibtkinter.test.test_ttk.test_functionsturtledemo.planet_and_moonunittest.test._test_warningsimportlib.test.frozen.test_loaderidlelib.tabpageunittest.test.test_skippingtest.infinite_reload_posixsubprocess_cursesturtledemo.clockencodings.string_escapestringoldtest.test_MimeWritersetsimportlib.test.extension.test_case_sensitivity_sqlite3distutils.tests.test_ccompilerunittest.test.test_casedistutils.tests.test_text_filetest.json_tests.test_indentcompiler.futureencodings.rot_13regex_syntaxdbhashlinuxaudiodevimportlib.test.import_.test_fromlistfpformatlib2to3.btm_matcherdistutils.tests.test_utiltest.test_linuxaudiodevtest.test_regeximportlib.test.import_.test_meta_pathturtledemo.foresttkinter.test.test_ttk.test_widgetsimportlib.test.frozen.test_findertest.test_file2kcompilerbsddb.test.test_early_closetest.test_univnewlines2ktest.test_linecachedistutils.tests.test_unixccompilerdistutils.tests.test_cleanmutexlib2to3.fixes.fix_exitfunctest.json_tests.test_failtest.test_macfsencodings.bz2_codecdummy_threadtest.tracedmodules.testmodimportlib.test.extension.test_path_hookimportlib.test.import_.test_relative_importsdistutils.tests.test_bdist_msibsddb.test.test_get_nonetest.test_complex_argsturtledemo.nimtest.test_gldistutils.tests.test_file_utiltest.test_aepacktkinter.test.test_ttk.test_styleaudiodevcompiler.astunittest.test.test_programtest.test_cltest.test_popen2test.test_stropbsddb.dbutilstest.test_setsrfc822unittest.test.test_runnerusertest.test_macosdistutils.tests.test_filelistdistutils.tests.test_bdisturlparsehtmllibmhlibtest.test_applesinglebsddb.test.test_dbobjdistutils.tests.test_archive_utiltest.test_newtest.test_mutextest.test_argparseunittest.maintest.test_sysconfigtest.test_py3kwarnbsddb.test.test_cursor_pget_bugtest.win_console_handlertest.datetimetesterHTMLParsertest.test_dumbdbmwhrandomtest.test_sys_settracetest.test_imgfileturtledemo.peacetest.test_old_mailboxtest.test_long_futurebsddb.test.test_queueUserDictunittest.loadercompiler.visitortest.test_md5bsddb.test.test_dbenvimportlib.test.extension.utiltest.test_rgbimgbsddb.test.test_sequencepsycopg2._psycopgimportlib.machineryemail.test.test_email_renamedtest.test_sha_pyioimportlib.test.test_utilmimetoolstzparseunittest.test.test_discoveryconcurrent.futures.threadtest.make_ssl_certsdistutils.tests.setuptools_build_extlib2to3.btm_utilsjson.tests.test_check_circulardistutils.tests.test_config_cmdurllib2concurrentimportlib.test.test_abcdistutils.tests.test_checktest.test_StringIObsddb.dbobjunittest.test.test_assertionsdistutils.tests.test_bdist_wininsttest.test_timingturtledemo.painthotshot.statstest.test_bsddb185hotshot.stonestest.tracedmodulestest.test_gdbtest.testalltest.json_tests.test_pass2test.json_tests.test_pass3test.test_scriptpackagestest.test_smtpdtest.json_tests.test_decodeunittest.test.supporttest.test_macostoolstest.test_coercionimportlib.testtest.test_cProfiledistutils.tests.test_spawnunittest.suiteimportlib.test.import_.test_packagesimportlib.test.regrtest_hotshotcompiler.miscSimpleXMLRPCServertest.test_concurrent_futuresdistutils.tests.test_cygwinccompilerdistutils.tests.setuptools_extensiontkinter.testtest.json_tests.test_scanstringimportlib.test.abcregexemail.MIMEMessagebsddb.test.test_picklerexectest.encoded_modulesposixfileimportlib.test.source.test_source_encoding_datetimeunittest.test.test_functiontestcaseimportlib.test.source.test_findertest.test_hotshotmarkupbasetest.test_htmllibCGIHTTPServerdistutils.tests.test_extensionbsddb.test.test_associateimputilimportlib.test.import_.test_apitkinter.test.test_ttk.test_extensionsdumbdbmimportlib._bootstrapimportlib.test.import_.test_pathimportlib.test.utiltest.encoded_modules.module_iso_8859_1importlib.test.sourcetest.test_numeric_towerturtledemo.two_canvasescompiler.symbolslib2to3.fixes.fix_operatorturtledemo.chaostest.test_fluflsysconfigemail.MIMEImagetest.test_supporttkinter.__main__email.MIMETextsgmllibimportlib.test.extensiongopherlibMimeWriterunittest.utiltest.test_bastionencodings.base64_codecimportlib.test.source.utiltest.test_sunautest.test_imageopstatvfscStringIOcompiler.constsbsddb.test.test_1413192BaseHTTPServertest.json_tests.test_speedupstest.test_rfc822unittest.testUserStringbsddb.dbtablestest.test_transformerimportlib.test.import_test.test_compilealltest.test_email_renamedimportlib.test.extension.test_finderturtledemotest.json_tests.test_default_stringidlelib.buildappencodings.uu_codecencodings.zlib_codecihookslib2to3.tests.test_mainimportlib.test.__main__fpectltest.test_bsddb3_LWPCookieJarshatest.mock_sockettest.json_tests.test_encode_basestring_asciidistutils.tests.test_bdist_rpmcompiler.transformertest.test_aifctest.test_bsddbconcurrent.futuresunittest.resultencodings.quopri_codecconcurrent.futures._basetest.test_dlstatcachetkinter.test.test_tkinter_curses_panelfuture_builtins_io_compat_pickleimportlibtest.test_dircachebsddb.test.test_misctkinter.test.test_tkinter.test_loadtktest.test_rlcompletertest.test_sndhdrreprtest.test_xrangehotshottimingcookielibdistutils.tests.test_bdist_dumbunittest.runnerwhichdbdircachetest.test_reprtest.test_ttk_guionlypopen2encodings.cp858pydoc_datatest.test_anydbmtest.test_compiler_MozillaCookieJarunittest.casedistutils.tests.test_dir_utiltest.json_tests.test_floattkinter.test.supportunittest.test.dummybsddb.test.test_lockcommandsemail.MIMEMultipartbsddb.test.test_replicationrobotparsertest.test_gdbmbsddb.dbimportlib.test.builtinturtledemo.round_dancetest.encoded_modules.module_koi8_rtest.test_nntplibtest.test_cpickleemail.MIMENonMultiparthotshot.logmultifiledistutils.tests.test_install_headerstest.test_importlibtest.test_smtpnettest.test_tkturtledemo.penrosecompiler.pycodegentest.json_tests.test_dumpbsddb.test.test_dbshelveturtledemo.wikipediabsddb.test.test_compatunittest.test.test_loadertest.test_hexoctbsddb.test.test_dbdistutils.tests.test_build_clibtest.test_strtest.test_strtodtest.gdb_samplebsddb.dbreciotest.test_msilibimportlib.test.frozen_dbmimportlib.test.builtin.utiltest.test_codecencodings_iso2022httplibimportlib.abcdistutils.tests.test_versiontkinter.test.test_tkinter.test_textturtledemo.__main__test.test_whichdbimportlib.test.source.test_abc_loaderimportlib.test.test_apiSimpleHTTPServertkinter.test.runtkteststest.test_xmllibemail.MIMEAudiodistutils.tests.test_dep_utilidlelib.RstripExtensiontest.test_ascii_formatdbsddb.test.test_joinunittest.test.test_suitesretest.lock_tests__builtin__importlib.test.builtin.test_loadertest.json_tests.test_unicodedistutils.command.checkregsubCookieimportlib.test.extension.test_loadertest.test_bufferimportlib.test.source.test_case_sensitivityturtledemo.treetest.test_socket_ssl_typestest.test_pdbtest.test_timeitDocXMLRPCServerbsddb.test.test_threadtest.test_xpickletest.test_undocumented_detailsbsddb.test.test_allbsddblib2to3.__main__importlib.test.import_.utiltest.test_sgmllibtest.test_commandsunittest.signalssunaudiotest.test_softspacebsddb.test.test_recnoxmlrpclibdistutils.tests.test_cmdbsddb.test.test_compareunicodeapplybasestringlongraw_inputreloadxrangereducecoerceinternfileunichrexecfilebuffercallabletest.test_future_builtinsbsddb.testbsddb.test.test_basicsbsddb.test.test_env_closetest.test_almimifytkinter.test.test_tkinter.test_fontbsddb.test.test_distributed_transactionstest.test_fpformattest.test_getargstest.test_multifiletest.json_tests.test_recursiontest.ssl_serversturtledemo.minimal_hanoitoaiffturtledemo.fractalcurvesturtledemo.lindenmayerUserListtest.json_tests.test_separatorsnewtest.test_cdturtledemo.colormixerStringIOencodings.cp720test.json_testsunittest.test.test_resulttest.test_schedBastionturtledemo.yinyangcopy_regcPicklereconverttest.test_email_codecscompiler.syntaxbsddb.test.test_fileidanydbmunittest.__main__exceptionstest.test_profilehookscompiler.pyassememail.MIMEBasestropconcurrent.futures.processtest.test_operationsbsddb.dbshelvedistutils.tests.test_buildhtmlentitydefsargparsetest.test_mimetoolstest.test_sunaudiodevtest.test_cookielibencodings.hex_codecbsddb.test.test_dbtablestest.json_tests.test_pass1turtledemo.bytedesignpsycopg2test.test_readlineunittest.test.test_breaktest.test_dynamictest.test_mhlibtest.test_copy_regtest.test_htmlsqlite3.test.py25testsmd5threadtest.test_cookieunittest.test.test_setupstest.__main__xmllibturtledemo.planet_and_moonunittest.test._test_warningsidlelib.tabpageunittest.test.test_skippingtest.infinite_reload_posixsubprocessturtledemo.clock_fileioencodings.string_escapestringoldtest.test_MimeWritersetsdistutils.tests.test_ccompilerunittest.test.test_casetest.json_tests.test_indentcompiler.futureencodings.rot_13regex_syntaxdbhashlinuxaudiodevfpformattest.test_linuxaudiodevtest.test_regexturtledemo.foresttest.cjkencodings_testtest.test_file2kcompilerbsddb.test.test_early_closetest.test_univnewlines2kmutexbuild_classtest.json_tests.test_fail_stringiotest.test_macfsencodings.bz2_codecdummy_threaddistutils.tests.test_bdist_msibsddb.test.test_get_nonetest.test_complex_argsturtledemo.nimtest.test_gltest.test_aepackaudiodevcompiler.astunittest.test.test_programtest.test_cltest.test_popen2test.test_stropbsddb.dbutilstest.test_setsrfc822unittest.test.test_runnerusertest.test_macosurlparsehtmllibmhlibtest.test_applesinglebsddb.test.test_dbobjtest.test_newtest.test_mutextest.test_argparseunittest.main_bytesiotest.test_sysconfigtest.test_py3kwarnbsddb.test.test_cursor_pget_bugtest.win_console_handlertest.datetimetesterHTMLParsertest.test_dumbdbmwhrandomtest.test_imgfileturtledemo.peacetest.test_old_mailboxtest.test_long_futurebsddb.test.test_queueUserDictunittest.loadercompiler.visitortest.test_md5bsddb.test.test_dbenvtest.test_rgbimgbsddb.test.test_sequencepsycopg2._psycopgemail.test.test_email_renamedtest.test_shadistutils.mwerkscompilermimetoolstzparseunittest.test.test_discoveryconcurrent.futures.threadtest.make_ssl_certsdistutils.tests.setuptools_build_extjson.tests.test_check_circularurllib2concurrenttest.test_StringIObsddb.dbobjunittest.test.test_assertionstest.test_timingturtledemo.painthotshot.statstest.test_bsddb185hotshot.stonestest.test_gdbtest.testalltest.json_tests.test_pass2test.json_tests.test_pass3test.test_scriptpackagestest.test_smtpdtest.json_tests.test_decodeunittest.test.supporttest.test_macostoolstest.test_coerciontest.test_cProfileunittest.suiteimportlib.test.regrtest_hotshotcompiler.miscSimpleXMLRPCServertest.test_concurrent_futuresdistutils.tests.setuptools_extensiontest.json_tests.test_scanstringregexemail.MIMEMessagebsddb.test.test_picklerexectest.encoded_modulesposixfile_datetimeunittest.test.test_functiontestcasetest.test_hotshotmarkupbasetest.test_htmllibCGIHTTPServerbsddb.test.test_associateimputilimportlib.test.import_.test_apidumbdbmtest.encoded_modules.module_iso_8859_1test.test_numeric_towerturtledemo.two_canvasescompiler.symbolsturtledemo.chaossysconfigemail.MIMEImagetest.test_supporttkinter.__main__email.MIMETextsgmllibpydoc_topicsgopherlibMimeWriterunittest.utiltest.test_bastionencodings.base64_codectest.test_imageopstatvfscStringIOcompiler.constsbsddb.test.test_1413192BaseHTTPServertest.json_tests.test_speedupstest.test_rfc822unittest.testUserStringbsddb.dbtablestest.test_transformertest.test_email_renamedturtledemotest.json_tests.test_default_stringidlelib.buildappencodings.uu_codecencodings.zlib_codecihooksimportlib.test.__main__test.test_bsddb3_LWPCookieJarshatest.mock_sockettest.json_tests.test_encode_basestring_asciicompiler.transformertest.test_bsddbconcurrent.futuresunittest.resultencodings.quopri_codecconcurrent.futures._basetest.test_dlstatcachefuture_builtinstest.test_dircachebsddb.test.test_miscreprtest.test_xrangehotshottimingcookielibunittest.runnerwhichdbdircachetest.test_reprpopen2encodings.cp858test.test_anydbmtest.test_compiler_MozillaCookieJarunittest.casetest.json_tests.test_floatunittest.test.dummybsddb.test.test_lockcommandsemail.MIMEMultipartbsddb.test.test_replicationrobotparsertest.test_gdbmbsddb.dbturtledemo.round_dancetest.encoded_modules.module_koi8_rtest.test_nntplibtest.test_cpickleemail.MIMENonMultiparthotshot.logmultifileturtledemo.penrosecompiler.pycodegentest.json_tests.test_dumpemail.test.test_email_codecs_renamedbsddb.test.test_dbshelveturtledemo.wikipediabsddb.test.test_compatunittest.test.test_loadertest.test_hexoctbsddb.test.test_dbtest.test_strtest.gdb_samplebsddb.dbreciotest.test_codecencodings_iso2022httplibturtledemo.__main__test.test_whichdbSimpleHTTPServertest.test_xmllibemail.MIMEAudiodistutils.tests.test_dep_utilbsddb.test.test_joinunittest.test.test_suitesre__builtin__test.json_tests.test_unicoderegsubCookietest.test_bufferturtledemo.treetest.test_socket_ssl_typestest.test_timeitDocXMLRPCServerbsddb.test.test_threadtest.test_xpickletest.test_undocumented_detailsbsddb.test.test_allbsddblib2to3.__main__test.test_sgmllibtest.test_commandsunittest.signalssunaudiotest.test_softspacebsddb.test.test_recnoxmlrpclibbsddb.test.test_compareunicodeapplybasestringlongraw_inputreloadcmpxrangereducecoerceinternfileunichrexecfilebuffercallabletest.test_future_builtinsbsddb.testbsddb.test.test_basicsbsddb.test.test_env_closetest.test_almimifybsddb.test.test_distributed_transactionstest.test_fpformattest.test_getargstest.test_multifiletoaiffUserListnewtest.test_cdjson.tests.test_unicodeStringIOBastioncopy_regcPicklereconverttest.test_email_codecscompiler.syntaxbsddb.test.test_fileidanydbmexceptionsjson.tests.test_speedupstest.test_profilehooksjson.tests.test_recursioncompiler.pyassememail.MIMEBasestroptest.test_operationsbsddb.dbshelvehtmlentitydefstest.test_mimetoolstest.test_sunaudiodevtest.test_cookielibbsddb.test.test_dbtablespsycopg2test.test_mhlibtest.test_copy_regsqlite3.test.py25testsmd5threadtest.test_cookiexmllibidlelib.tabpagetest.infinite_reload_curses_fileioencodings.string_escapestringoldtest.test_MimeWritersets_sqlite3distutils.tests.test_ccompilercompiler.futureregex_syntaxdbhashjson.tests.test_scanstringjson.testslinuxaudiodevfpformattest.test_linuxaudiodevtest.test_regextest.cjkencodings_testtest.test_file2kcompilerbsddb.test.test_early_closetest.test_univnewlines2kmutexbuild_class_stringiotest.test_macfsdummy_threadbsddb.test.test_get_nonetest.test_complex_argstest.test_gltest.test_aepackaudiodevcompiler.asttest.test_cltest.test_popen2test.test_stropbsddb.dbutilstest.test_setsrfc822usertest.test_macosurlparsehtmllibmhlibtest.test_applesinglebsddb.test.test_dbobjtest.test_newtest.test_mutexjson.tests.test_decode_bytesiotest.test_py3kwarnbsddb.test.test_cursor_pget_bugHTMLParsertest.test_dumbdbmwhrandomtest.test_imgfiletest.test_old_mailboxtest.test_long_futurebsddb.test.test_queueUserDictcompiler.visitortest.test_md5bsddb.test.test_dbenvtest.test_rgbimgbsddb.test.test_sequencepsycopg2._psycopgemail.test.test_email_renamedtest.test_shajson.tests.test_separatorsdistutils.mwerkscompilermimetoolsjson.tests.test_floattzparsetest.badsyntax_nocaretdistutils.tests.setuptools_build_extjson.tests.test_check_circularurllib2test.test_StringIObsddb.dbobjtest.test_timinghotshot.statstest.test_bsddb185hotshot.stonestest.testalljson.tests.test_dumptest.test_scriptpackagestest.test_macostoolstest.test_coerciontest.test_cProfile_hotshotcompiler.miscSimpleXMLRPCServerdistutils.tests.setuptools_extensionregexemail.MIMEMessagebsddb.test.test_picklerexecposixfiletest.test_hotshotmarkupbasetest.test_htmllibCGIHTTPServerbsddb.test.test_associateimputildumbdbmcompiler.symbolsemail.MIMEImagetest.test_supportemail.MIMETextsgmllibpydoc_topicsgopherlibMimeWritertest.test_bastiontest.test_imageopstatvfscStringIOcompiler.constsbsddb.test.test_1413192BaseHTTPServertest.test_rfc822UserStringbsddb.dbtablestest.test_transformertest.test_email_renamedidlelib.buildappihooksfpectltest.test_bsddb3_LWPCookieJarshatest.test_SimpleHTTPServercompiler.transformertest.test_bsddbtest.test_dlstatcache_curses_panelfuture_builtinsjson.tests.test_encode_basestring_asciitest.test_dircachebsddb.test.test_miscreprtest.test_xrangehotshottimingcookielibwhichdbdircachetest.test_reprpopen2test.test_anydbmtest.test_compiler_MozillaCookieJarjson.tests.test_indentbsddb.test.test_lockcommandsjson.tests.test_failemail.MIMEMultipartbsddb.test.test_replicationrobotparsertest.test_gdbmbsddb.dbtest.test_cpickleemail.MIMENonMultiparthotshot.logmultifilecompiler.pycodegenemail.test.test_email_codecs_renamedbsddb.test.test_dbshelvebsddb.test.test_compattest.test_hexoctbsddb.test.test_dbjson.tests.test_pass2json.tests.test_pass3json.tests.test_pass1test.test_strbsddb.dbrecio_dbmhttplibtest.test_whichdbSimpleHTTPServertest.test_xmllibemail.MIMEAudiotest.test_ascii_formatdbsddb.test.test_joinjson.tests.test_defaultsre__builtin__regsubCookietest.test_buffertest.test_socket_ssl_typesDocXMLRPCServerbsddb.test.test_threadtest.test_xpickletest.test_undocumented_detailsbsddb.test.test_allbsddblib2to3.__main__test.test_sgmllibtest.test_commandssunaudiotest.test_softspacebsddb.test.test_recnoxmlrpclibbsddb.test.test_compareunicodeapplybasestringlongraw_inputreloadcmpxrangereducecoerceinternfileunichrexecfilebufferdistutils.tests.test_ccompilerbsddb.test.test_fileidbsddb.testhotshot.statsbsddb.test.test_basicsbsddb.test.test_env_closetest.test_altest.test_bsddb185hotshot.stonesjson.tests.test_unicodemimifybsddb.test.test_distributed_transactionstest.test_fpformattest.test_getargstest.test_cookielibtest.test_multifilejson.tests.test_dumptest.test_strtest.test_scriptpackagestoaifftest.test_macostoolstest.test_shafpformattest.test_regexnewtest.test_coercionStringIOtest.testall_hotshotcompiler.miscbsddb.test.test_associateBastiontest.test_old_mailboxemail.MIMEMessagebsddb.test.test_picklebsddb.test.test_misccPickleposixfilejson.tests.test_check_circularreconverttest.test_email_codecscompiler.syntaxtest.test_timinganydbmtest.test_hotshotmarkupbasetest.test_htmllibexceptionsjson.tests.test_speedupsCGIHTTPServerimputilcompiler.pyassemstroptest.test_operationsbsddb.dbshelveMimeWritertest.test_imageophtmlentitydefscompiler.symbolstest.test_mimetoolstest.test_sunaudiodevwhichdbemail.MIMETextdumbdbmpsycopg2cookielibpydoc_topicsgopherlibtest.test_bastiontest.test_cProfilehttplibstatvfstest.test_mhlibcStringIObsddb.test.test_1413192BaseHTTPServerdircachetest.test_rfc822UserStringbsddb.dbtablestest.test_email_renamedsqlite3.test.py25testsidlelib.buildappmd5threadihooksfpectltest.test_bsddb3test.test_copy_reg_LWPCookieJartest.test_SimpleHTTPServeremail.MIMEMultipartidlelib.tabpagetest.infinite_reload_curses_fileiotest.test_cdtest.test_aepacktest.test_cltest.test_bsddbtest.test_MimeWritertest.test_dlstatcachesets_sqlite3mhlib_curses_panelfuture_builtinscompiler.futureregex_syntaxstringolddbhashbsddb.test.test_dbobjjson.testslinuxaudiodevUserListjson.tests.test_encode_basestring_asciitest.test_dircachepyexpat.errorsrexectest.cjkencodings_testreprtest.test_xrangehotshottimingtest.test_file2kcompilercompiler.constsemail.MIMEImagebsddb.test.test_early_closeshatest.test_reprpyexpat.modeltest.test_univnewlines2kpopen2compiler.transformertest.test_anydbmtest.test_compilerbsddb.test.test_dbtablesmutex_MozillaCookieJarjson.tests.test_indentbuild_classsgmllibbsddb.test.test_lockcommandstest.test_cpickle_stringiobsddb.test.test_threadtest.test_macfsdistutils.tests.setuptools_extensionbsddb.test.test_replicationdummy_threadrobotparsertest.test_gdbmbsddb.dbbsddb.test.test_get_nonetest.test_complex_argsSimpleXMLRPCServertest.test_future_builtinsemail.MIMENonMultiparttest.test_glhotshot.logmultifileencodings.string_escapeaudiodevcopy_regtest.test_profilehooksjson.tests.test_recursionemail.MIMEBasetest.test_popen2compiler.pycodegentest.test_stropbsddb.dbutilsemail.test.test_email_codecs_renamedbsddb.test.test_dbshelvetest.test_setsrfc822bsddb.test.test_compattest.test_hexoctbsddb.test.test_dbuserxmllibtest.badsyntax_nocarettest.test_macosurlparsehtmllibtest.test_cookiejson.tests.test_pass2json.tests.test_pass3test.test_applesinglejson.tests.test_pass1json.tests.test_scanstringtest.test_linuxaudiodevbsddb.dbreciotest.test_newtest.test_mutexjson.tests.test_decodecompiler.ast_bytesiotest.test_py3kwarnwhrandomtest.test_whichdbbsddb.test.test_cursor_pget_bugSimpleHTTPServerpsycopg2._psycopgemail.test.test_email_renamedHTMLParserdistutils.tests.setuptools_build_exttest.test_xmllibemail.MIMEAudiotest.test_imgfileregextest.test_long_futuretest.test_ascii_formatdbsddb.test.test_queueUserDictbsddb.test.test_joinjson.tests.test_defaultcompiler.visitorsretest.test_md5bsddb.test.test_dbenv__builtin__test.test_transformertest.test_rgbimgregsubbsddb.test.test_sequenceCookietest.test_socket_ssl_typesjson.tests.test_separatorsDocXMLRPCServerjson.tests.test_faildistutils.mwerkscompilermimetoolstest.test_xpicklejson.tests.test_floatbsddb.dbobjtzparsebsddb.test.test_alltest.test_dumbdbm_dbm_abcollbsddbtest.test_sgmllibtest.test_commandsurllib2sunaudiotest.test_softspacebsddb.test.test_recnotest.test_StringIOxmlrpclibtest.test_undocumented_detailsbsddb.test.test_comparefilebufferxrangereducecoerceinternunicodeapplyunichrbasestringraw_inputexecfilelongreloadcmpdistutils.tests.test_ccompilerimportlib.test.source.test_file_loaderbsddb.test.test_fileidbsddb.testhotshot.statsbsddb.test.test_basicsbsddb.test.test_env_closetest.test_altest.test_bsddb185hotshot.stonesjson.tests.test_unicodemimifybsddb.test.test_distributed_transactionstest.test_fpformattest.test_getargstest.test_cookielibtest.json_tests.test_pass2test.json_tests.test_pass3test.json_tests.test_pass1test.test_multifilejson.tests.test_dumptest.test_strtest.test_scriptpackagestest.json_tests.test_decodetoaifftest.test_macostoolstest.test_shafpformattest.test_regextest.json_tests.test_separatorsnewtest.test_coercionimportlib.testimportlib.test.import_.test___package__importlib.test.benchmarkimportlib.test.import_.test_packagesStringIOimportlib.test.regrtest_hotshotcompiler.misctest.json_testsbsddb.test.test_associateBastiontest.json_tests.test_scanstringtest.test_old_mailboxemail.MIMEMessagebsddb.test.test_picklebsddb.test.test_misccPickleposixfilejson.tests.test_check_circularimportlib.test.source.test_source_encodingtest.test_email_codecscompiler.syntaxtest.test_timinganydbmimportlib.test.source.test_findertest.test_hotshotmarkupbasetest.test_htmllibexceptionsjson.tests.test_speedupsCGIHTTPServerimputilimportlib.test.import_.test_apicompiler.pyassemimportlib.test.import_.test_pathstroptest.test_operationsbsddb.dbshelveMimeWritertest.test_imageopimportlib.test.utilimportlib.test.sourcehtmlentitydefscompiler.symbolstest.test_mimetoolstest.test_sunaudiodevtest.test_multiprocessinghotshotwhichdbemail.MIMETextdumbdbmtest.json_tests.test_recursionpsycopg2cookielibimportlib.test.extensionpydoc_topicsgopherlibtest.json_tests.test_speedupstest.test_bastionimportlib.test.source.utilhttplibstatvfstest.test_mhlibcStringIOimportlib.test.builtin.test_finderBaseHTTPServerdircachetest.test_rfc822importlib.test.import_.test_cachingUserStringbsddb.dbtablesimportlib.test.import_test.test_email_renamedtest.json_tests.test_defaultsqlite3.test.py25testsidlelib.buildappmd5threadihooksimportlib.test.__main__fpectltest.test_bsddb3test.test_copy_reg_LWPCookieJartest.test_codingtest.test_SimpleHTTPServerimportlib.test.frozen.test_loaderemail.MIMEMultipartidlelib.tabpagetest.json_tests.test_encode_basestring_asciitest.infinite_reload_curses_fileio_hashlibtest.test_cdtest.test_aepacktest.test_cltest.test_bsddbtest.test_MimeWritertest.test_dlstatcachesetsimportlib.test.extension.test_case_sensitivity_sqlite3mhlib_curses_panelfuture_builtinstest.json_tests.test_indentcompiler.futureregex_syntaxstringolddbhashbsddb.test.test_dbobjjson.testslinuxaudiodevUserListjson.tests.test_encode_basestring_asciitest.test_dircachepyexpat.errorsimportlib.test.import_.test_meta_pathrexectest.cjkencodings_testreprtest.test_xrangeimportlib.test.frozen.test_findertimingtest.test_file2kcompilercompiler.constsemail.MIMEImagebsddb.test.test_early_closeshatest.test_reprpyexpat.modeltest.test_univnewlines2kpopen2compiler.transformertest.test_anydbmtest.test_compilerbsddb.test.test_dbtablesmutex_MozillaCookieJarjson.tests.test_indentbuild_classsgmllibtest.json_tests.test_floattest.json_tests.test_failbsddb.test.test_lockcommandstest.test_cpickle_stringiobsddb.test.test_threadtest.test_macfsdistutils.tests.setuptools_extensionbsddb.test.test_replicationdummy_threadimportlib.test.extension.test_finderrobotparserimportlib.test.extension.test_path_hooktest.test_gdbmbsddb.dbimportlib.test.import_.test_relative_importsimportlib.test.builtinbsddb.test.test_get_nonetest.test_complex_argsimportlib.test.source.test_case_sensitivitySimpleXMLRPCServertest.test_future_builtinsemail.MIMENonMultiparttest.test_glimportlib.test.builtin.utilhotshot.logmultifileencodings.string_escapeaudiodevcopy_regtest.test_profilehooksjson.tests.test_recursiontest.testallemail.MIMEBasetest.test_popen2compiler.pycodegentest.test_stroptest.json_tests.test_dumpbsddb.dbutilsemail.test.test_email_codecs_renamedbsddb.test.test_dbshelvetest.test_setsrfc822bsddb.test.test_compattest.test_hexoctbsddb.test.test_dbuserxmllibtest.badsyntax_nocarettest.test_macosurlparsehtmllibtest.test_cookiejson.tests.test_pass2json.tests.test_pass3test.test_applesinglejson.tests.test_pass1json.tests.test_scanstringimportlib.test.import_.test_fromlisttest.test_linuxaudiodevbsddb.dbrecioimportlib.test.frozentest.test_newtest.test_mutextest.test_cProfilemultiprocessing.forkingjson.tests.test_decodecompiler.ast_bytesiotest.test_py3kwarnwhrandomtest.test_whichdbbsddb.test.test_cursor_pget_bugimportlib.test.source.test_abc_loaderimportlib.test.test_apiSimpleHTTPServerpsycopg2._psycopgemail.test.test_email_renamedHTMLParserdistutils.tests.setuptools_build_exttest.test_xmllibemail.MIMEAudiotest.test_imgfileregextest.test_long_futuretest.test_ascii_formatdbsddb.test.test_queueUserDictbsddb.test.test_joinjson.tests.test_defaultimportlib.test.abccompiler.visitorsretest.test_md5bsddb.test.test_dbenv__builtin__importlib.test.extension.utilimportlib.test.builtin.test_loadertest.test_transformertest.test_rgbimgtest.json_tests.test_unicoderegsubbsddb.test.test_sequenceCookiebsddb.test.test_1413192importlib.test.source.test_path_hookimportlib.test.extension.test_loadertest.test_socket_ssl_typesjson.tests.test_separatorsimportlib.test.test_utilDocXMLRPCServerjson.tests.test_faildistutils.mwerkscompilermimetoolstest.test_xpicklejson.tests.test_floatbsddb.dbobjtzparsebsddb.test.test_alltest.test_dumbdbm_dbm_abcollbsddbimportlib.test.import_.utiltest.test_sgmllibtest.test_commandsurllib2reconvertsunaudiotest.test_softspaceimportlib.test.test_abcbsddb.test.test_recnotest.test_StringIOxmlrpclibtest.test_undocumented_detailsbsddb.test.test_comparefilebufferxrangereducecoerceinternunicodeunichrapplybasestringraw_inputexecfilelongreloadcmp \ No newline at end of file + + + + CDROM + DLFCN + TYPES + _LWPCookieJar + _MozillaCookieJar + _abcoll + _ast + _bisect + _bootlocale + _bytesio + _codecs_cn + _codecs_hk + _codecs_iso2022 + _codecs_jp + _codecs_kr + _codecs_tw + _collections + _collections_abc + _compat_pickle + _crypt + _ctypes + _ctypes_test + _curses + _curses_panel + _datetime + _decimal + _dummy_thread + _elementtree + _fileio + _functools + _hashlib + _heapq + _imp + _io + _json + _lsprof + _markupbase + _md5 + _multibytecodec + _multiprocessing + _opcode + _operator + _osx_support + _pickle + _posixsubprocess + _pydecimal + _pyio + _sha + _sha1 + _sha256 + _sha512 + _signal + _sitebuiltins + _ssl + _stat + _string + _stringio + _struct + _sysconfigdata + _testbuffer + _testimportmultiple + _thread + _threading_local + _tracemalloc + _types + _warnings + _weakrefset + abc + antigravity + argparse + ast + asyncio + asyncio.base_events + asyncio.base_subprocess + asyncio.constants + asyncio.coroutines + asyncio.events + asyncio.futures + asyncio.locks + asyncio.log + asyncio.proactor_events + asyncio.protocols + asyncio.queues + asyncio.selector_events + asyncio.sslproto + asyncio.streams + asyncio.subprocess + asyncio.tasks + asyncio.test_utils + asyncio.transports + asyncio.unix_events + asyncio.windows_events + asyncio.windows_utils + audioop + bsddb.test.test_1413192 + bsddb.test.test_compare + bsddb.test.test_cursor_pget_bug + bsddb.test.test_db + bsddb.test.test_dbenv + bsddb.test.test_distributed_transactions + bsddb.test.test_early_close + bsddb.test.test_fileid + bsddb.test.test_pickle + bsddb.test.test_replication + bsddb.test.test_sequence + build_class + builtins + bz2 + cProfile + collections + collections.__main__ + collections.abc + concurrent + concurrent.futures + concurrent.futures._base + concurrent.futures.process + concurrent.futures.thread + configparser + contextlib + cookielib + copyreg + crypt + ctypes + ctypes._endian + ctypes.macholib + ctypes.macholib.dyld + ctypes.macholib.dylib + ctypes.macholib.framework + ctypes.test + ctypes.test.__main__ + ctypes.test.runtests + ctypes.test.test_anon + ctypes.test.test_array_in_pointer + ctypes.test.test_arrays + ctypes.test.test_as_parameter + ctypes.test.test_bitfields + ctypes.test.test_buffers + ctypes.test.test_bytes + ctypes.test.test_byteswap + ctypes.test.test_callbacks + ctypes.test.test_cast + ctypes.test.test_cfuncs + ctypes.test.test_checkretval + ctypes.test.test_delattr + ctypes.test.test_errcheck + ctypes.test.test_errno + ctypes.test.test_find + ctypes.test.test_frombuffer + ctypes.test.test_funcptr + ctypes.test.test_functions + ctypes.test.test_incomplete + ctypes.test.test_init + ctypes.test.test_integers + ctypes.test.test_internals + ctypes.test.test_keeprefs + ctypes.test.test_libc + ctypes.test.test_loading + ctypes.test.test_macholib + ctypes.test.test_memfunctions + ctypes.test.test_numbers + ctypes.test.test_objects + ctypes.test.test_parameters + ctypes.test.test_pep3118 + ctypes.test.test_pickling + ctypes.test.test_pointers + ctypes.test.test_prototypes + ctypes.test.test_python_api + ctypes.test.test_random_things + ctypes.test.test_refcounts + ctypes.test.test_repr + ctypes.test.test_returnfuncptrs + ctypes.test.test_simplesubclasses + ctypes.test.test_sizes + ctypes.test.test_slicing + ctypes.test.test_stringptr + ctypes.test.test_strings + ctypes.test.test_struct_fields + ctypes.test.test_structures + ctypes.test.test_unaligned_structures + ctypes.test.test_unicode + ctypes.test.test_values + ctypes.test.test_varsize_struct + ctypes.test.test_win32 + ctypes.test.test_wintypes + ctypes.util + ctypes.wintypes + dbm + dbm.dumb + dbm.gnu + dbm.ndbm + decimal + distutils.command.bdist_msi + distutils.command.check + distutils.command.install_egg_info + distutils.command.upload + distutils.config + distutils.msvc9compiler + distutils.tests + distutils.tests.setuptools_build_ext + distutils.tests.setuptools_extension + distutils.tests.support + distutils.tests.test_archive_util + distutils.tests.test_bdist + distutils.tests.test_bdist_dumb + distutils.tests.test_bdist_msi + distutils.tests.test_bdist_rpm + distutils.tests.test_bdist_wininst + distutils.tests.test_build + distutils.tests.test_build_clib + distutils.tests.test_build_ext + distutils.tests.test_build_py + distutils.tests.test_build_scripts + distutils.tests.test_ccompiler + distutils.tests.test_check + distutils.tests.test_clean + distutils.tests.test_cmd + distutils.tests.test_config + distutils.tests.test_config_cmd + distutils.tests.test_core + distutils.tests.test_cygwinccompiler + distutils.tests.test_dep_util + distutils.tests.test_dir_util + distutils.tests.test_dist + distutils.tests.test_extension + distutils.tests.test_file_util + distutils.tests.test_filelist + distutils.tests.test_install + distutils.tests.test_install_data + distutils.tests.test_install_headers + distutils.tests.test_install_lib + distutils.tests.test_install_scripts + distutils.tests.test_log + distutils.tests.test_msvc9compiler + distutils.tests.test_register + distutils.tests.test_sdist + distutils.tests.test_spawn + distutils.tests.test_sysconfig + distutils.tests.test_text_file + distutils.tests.test_unixccompiler + distutils.tests.test_upload + distutils.tests.test_util + distutils.tests.test_version + distutils.tests.test_versionpredicate + distutils.versionpredicate + email.FeedParser + email._encoded_words + email._header_value_parser + email._policybase + email.base64mime + email.charset + email.contentmanager + email.encoders + email.errors + email.feedparser + email.generator + email.header + email.headerregistry + email.iterators + email.message + email.mime + email.mime.application + email.mime.audio + email.mime.base + email.mime.image + email.mime.message + email.mime.multipart + email.mime.nonmultipart + email.mime.text + email.parser + email.policy + email.quoprimime + email.test.test_email_codecs_renamed + email.test.test_email_renamed + email.utils + encodings.big5 + encodings.big5hkscs + encodings.bz2_codec + encodings.cp1125 + encodings.cp273 + encodings.cp65001 + encodings.cp720 + encodings.cp858 + encodings.cp932 + encodings.cp949 + encodings.cp950 + encodings.euc_jis_2004 + encodings.euc_jisx0213 + encodings.euc_jp + encodings.euc_kr + encodings.gb18030 + encodings.gb2312 + encodings.gbk + encodings.hp_roman8 + encodings.hz + encodings.iso2022_jp + encodings.iso2022_jp_1 + encodings.iso2022_jp_2 + encodings.iso2022_jp_2004 + encodings.iso2022_jp_3 + encodings.iso2022_jp_ext + encodings.iso2022_kr + encodings.iso8859_11 + encodings.iso8859_16 + encodings.johab + encodings.mac_arabic + encodings.mac_centeuro + encodings.mac_croatian + encodings.mac_farsi + encodings.mac_romanian + encodings.ptcp154 + encodings.shift_jis + encodings.shift_jis_2004 + encodings.shift_jisx0213 + encodings.tis_620 + encodings.utf_32 + encodings.utf_32_be + encodings.utf_32_le + encodings.utf_8_sig + ensurepip + ensurepip.__main__ + ensurepip._uninstall + enum + faulthandler + fractions + functools + future_builtins + genericpath + hashlib + html + html.entities + html.parser + http + http.client + http.cookiejar + http.cookies + http.server + idlelib.AutoComplete + idlelib.AutoCompleteWindow + idlelib.CodeContext + idlelib.HyperParser + idlelib.MultiCall + idlelib.RstripExtension + idlelib.__main__ + idlelib.idle_test + idlelib.idle_test.htest + idlelib.idle_test.mock_idle + idlelib.idle_test.mock_tk + idlelib.idle_test.test_autocomplete + idlelib.idle_test.test_autoexpand + idlelib.idle_test.test_calltips + idlelib.idle_test.test_config_name + idlelib.idle_test.test_configdialog + idlelib.idle_test.test_delegator + idlelib.idle_test.test_formatparagraph + idlelib.idle_test.test_grep + idlelib.idle_test.test_hyperparser + idlelib.idle_test.test_idlehistory + idlelib.idle_test.test_parenmatch + idlelib.idle_test.test_pathbrowser + idlelib.idle_test.test_rstrip + idlelib.idle_test.test_searchdialogbase + idlelib.idle_test.test_searchengine + idlelib.idle_test.test_text + idlelib.idle_test.test_textview + idlelib.idle_test.test_warning + idlelib.idle_test.test_widgetredir + idlelib.macosxSupport + idlelib.tabbedpages + importlib + importlib._bootstrap + importlib.abc + importlib.machinery + importlib.test + importlib.test.__main__ + importlib.test.abc + importlib.test.benchmark + importlib.test.builtin + importlib.test.builtin.test_finder + importlib.test.builtin.test_loader + importlib.test.builtin.util + importlib.test.extension + importlib.test.extension.test_case_sensitivity + importlib.test.extension.test_finder + importlib.test.extension.test_loader + importlib.test.extension.test_path_hook + importlib.test.extension.util + importlib.test.frozen + importlib.test.frozen.test_finder + importlib.test.frozen.test_loader + importlib.test.import_ + importlib.test.import_.test___package__ + importlib.test.import_.test_api + importlib.test.import_.test_caching + importlib.test.import_.test_fromlist + importlib.test.import_.test_meta_path + importlib.test.import_.test_packages + importlib.test.import_.test_path + importlib.test.import_.test_relative_imports + importlib.test.import_.util + importlib.test.regrtest + importlib.test.source + importlib.test.source.test_abc_loader + importlib.test.source.test_case_sensitivity + importlib.test.source.test_file_loader + importlib.test.source.test_finder + importlib.test.source.test_path_hook + importlib.test.source.test_source_encoding + importlib.test.source.util + importlib.test.test_abc + importlib.test.test_api + importlib.test.test_util + importlib.test.util + importlib.util + io + ipaddress + json + json.decoder + json.encoder + json.scanner + json.tests + json.tests.test_check_circular + json.tests.test_decode + json.tests.test_default + json.tests.test_dump + json.tests.test_encode_basestring_ascii + json.tests.test_fail + json.tests.test_float + json.tests.test_indent + json.tests.test_pass1 + json.tests.test_pass2 + json.tests.test_pass3 + json.tests.test_recursion + json.tests.test_scanstring + json.tests.test_separators + json.tests.test_speedups + json.tests.test_tool + json.tests.test_unicode + json.tool + lib2to3 + lib2to3.__main__ + lib2to3.btm_matcher + lib2to3.btm_utils + lib2to3.fixer_base + lib2to3.fixer_util + lib2to3.fixes + lib2to3.fixes.fix_apply + lib2to3.fixes.fix_asserts + lib2to3.fixes.fix_basestring + lib2to3.fixes.fix_buffer + lib2to3.fixes.fix_callable + lib2to3.fixes.fix_dict + lib2to3.fixes.fix_except + lib2to3.fixes.fix_exec + lib2to3.fixes.fix_execfile + lib2to3.fixes.fix_exitfunc + lib2to3.fixes.fix_filter + lib2to3.fixes.fix_funcattrs + lib2to3.fixes.fix_future + lib2to3.fixes.fix_getcwdu + lib2to3.fixes.fix_has_key + lib2to3.fixes.fix_idioms + lib2to3.fixes.fix_import + lib2to3.fixes.fix_imports + lib2to3.fixes.fix_imports2 + lib2to3.fixes.fix_input + lib2to3.fixes.fix_intern + lib2to3.fixes.fix_isinstance + lib2to3.fixes.fix_itertools + lib2to3.fixes.fix_itertools_imports + lib2to3.fixes.fix_long + lib2to3.fixes.fix_map + lib2to3.fixes.fix_metaclass + lib2to3.fixes.fix_methodattrs + lib2to3.fixes.fix_ne + lib2to3.fixes.fix_next + lib2to3.fixes.fix_nonzero + lib2to3.fixes.fix_numliterals + lib2to3.fixes.fix_operator + lib2to3.fixes.fix_paren + lib2to3.fixes.fix_print + lib2to3.fixes.fix_raise + lib2to3.fixes.fix_raw_input + lib2to3.fixes.fix_reduce + lib2to3.fixes.fix_reload + lib2to3.fixes.fix_renames + lib2to3.fixes.fix_repr + lib2to3.fixes.fix_set_literal + lib2to3.fixes.fix_standarderror + lib2to3.fixes.fix_sys_exc + lib2to3.fixes.fix_throw + lib2to3.fixes.fix_tuple_params + lib2to3.fixes.fix_types + lib2to3.fixes.fix_unicode + lib2to3.fixes.fix_urllib + lib2to3.fixes.fix_ws_comma + lib2to3.fixes.fix_xrange + lib2to3.fixes.fix_xreadlines + lib2to3.fixes.fix_zip + lib2to3.main + lib2to3.patcomp + lib2to3.pgen2 + lib2to3.pgen2.conv + lib2to3.pgen2.driver + lib2to3.pgen2.grammar + lib2to3.pgen2.literals + lib2to3.pgen2.parse + lib2to3.pgen2.pgen + lib2to3.pgen2.token + lib2to3.pgen2.tokenize + lib2to3.pygram + lib2to3.pytree + lib2to3.refactor + lib2to3.tests + lib2to3.tests.__main__ + lib2to3.tests.pytree_idempotency + lib2to3.tests.support + lib2to3.tests.test_all_fixers + lib2to3.tests.test_fixers + lib2to3.tests.test_main + lib2to3.tests.test_parser + lib2to3.tests.test_pytree + lib2to3.tests.test_refactor + lib2to3.tests.test_util + linuxaudiodev + lzma + multiprocessing + multiprocessing.connection + multiprocessing.context + multiprocessing.dummy + multiprocessing.dummy.connection + multiprocessing.forking + multiprocessing.forkserver + multiprocessing.heap + multiprocessing.managers + multiprocessing.pool + multiprocessing.popen_fork + multiprocessing.popen_forkserver + multiprocessing.popen_spawn_posix + multiprocessing.popen_spawn_win32 + multiprocessing.process + multiprocessing.queues + multiprocessing.reduction + multiprocessing.resource_sharer + multiprocessing.semaphore_tracker + multiprocessing.sharedctypes + multiprocessing.spawn + multiprocessing.synchronize + multiprocessing.util + nis + numbers + ossaudiodev + pathlib + plistlib + pydoc_data + pydoc_data.topics + pydoc_topics + queue + readline + reprlib + runpy + selectors + socketserver + spwd + sqlite3 + sqlite3.dbapi2 + sqlite3.dump + sqlite3.test + sqlite3.test.dbapi + sqlite3.test.dump + sqlite3.test.factory + sqlite3.test.hooks + sqlite3.test.py25tests + sqlite3.test.regression + sqlite3.test.transactions + sqlite3.test.types + sqlite3.test.userfunctions + ssl + statistics + subprocess + sysconfig + tkinter + tkinter.__main__ + tkinter._fix + tkinter.colorchooser + tkinter.commondialog + tkinter.constants + tkinter.dialog + tkinter.dnd + tkinter.filedialog + tkinter.font + tkinter.messagebox + tkinter.scrolledtext + tkinter.simpledialog + tkinter.test + tkinter.test.runtktests + tkinter.test.support + tkinter.test.test_tkinter + tkinter.test.test_tkinter.test_font + tkinter.test.test_tkinter.test_geometry_managers + tkinter.test.test_tkinter.test_images + tkinter.test.test_tkinter.test_loadtk + tkinter.test.test_tkinter.test_misc + tkinter.test.test_tkinter.test_text + tkinter.test.test_tkinter.test_variables + tkinter.test.test_tkinter.test_widgets + tkinter.test.test_ttk + tkinter.test.test_ttk.test_extensions + tkinter.test.test_ttk.test_functions + tkinter.test.test_ttk.test_style + tkinter.test.test_ttk.test_widgets + tkinter.test.widget_tests + tkinter.tix + tkinter.ttk + tracemalloc + ttk + turtledemo + turtledemo.__main__ + turtledemo.bytedesign + turtledemo.chaos + turtledemo.clock + turtledemo.colormixer + turtledemo.forest + turtledemo.fractalcurves + turtledemo.lindenmayer + turtledemo.minimal_hanoi + turtledemo.nim + turtledemo.paint + turtledemo.peace + turtledemo.penrose + turtledemo.planet_and_moon + turtledemo.round_dance + turtledemo.sorting_animate + turtledemo.tree + turtledemo.two_canvases + turtledemo.wikipedia + turtledemo.yinyang + unittest.__main__ + unittest.case + unittest.loader + unittest.main + unittest.mock + unittest.result + unittest.runner + unittest.signals + unittest.suite + unittest.test + unittest.test.__main__ + unittest.test._test_warnings + unittest.test.dummy + unittest.test.support + unittest.test.test_assertions + unittest.test.test_break + unittest.test.test_case + unittest.test.test_discovery + unittest.test.test_functiontestcase + unittest.test.test_loader + unittest.test.test_program + unittest.test.test_result + unittest.test.test_runner + unittest.test.test_setups + unittest.test.test_skipping + unittest.test.test_suite + unittest.test.testmock + unittest.test.testmock.__main__ + unittest.test.testmock.support + unittest.test.testmock.testcallable + unittest.test.testmock.testhelpers + unittest.test.testmock.testmagicmethods + unittest.test.testmock.testmock + unittest.test.testmock.testpatch + unittest.test.testmock.testsentinel + unittest.test.testmock.testwith + unittest.util + urllib.error + urllib.parse + urllib.request + urllib.response + urllib.robotparser + uuid + venv + venv.__main__ + wsgiref + wsgiref.handlers + wsgiref.headers + wsgiref.simple_server + wsgiref.util + wsgiref.validate + xml.etree + xml.etree.ElementInclude + xml.etree.ElementPath + xml.etree.ElementTree + xml.etree.cElementTree + xmlrpc + xmlrpc.client + xmlrpc.server + xxlimited + zlib + BaseException + BlockingIOError + BrokenPipeError + BufferError + BytesWarning + ChildProcessError + ConnectionAbortedError + ConnectionError + ConnectionRefusedError + ConnectionResetError + FileExistsError + FileNotFoundError + GeneratorExit + ImportWarning + InterruptedError + IsADirectoryError + NotADirectoryError + PermissionError + ProcessLookupError + ResourceWarning + TimeoutError + UnicodeWarning + __build_class__ + __loader__ + __package__ + __spec__ + all + any + ascii + bin + bytearray + bytes + exec + format + frozenset + memoryview + next + print + reversed + set + sorted + + + CDROM + DLFCN + FCNTL + TERMIOS + TYPES + _abcoll + _ast + _bootlocale + _bytesio + _collections + _collections_abc + _compat_pickle + _crypt + _ctypes + _ctypes_test + _curses + _curses_panel + _datetime + _decimal + _dummy_thread + _elementtree + _fileio + _functools + _hashlib + _imp + _io + _json + _lsprof + _markupbase + _md5 + _multiprocessing + _opcode + _operator + _osx_support + _pickle + _posixsubprocess + _pydecimal + _pyio + _sha + _sha1 + _sha256 + _sha512 + _signal + _sitebuiltins + _ssl + _stat + _string + _stringio + _struct + _sysconfigdata + _testbuffer + _testimportmultiple + _thread + _tracemalloc + _types + _warnings + _weakrefset + abc + antigravity + argparse + ast + asyncio + asyncio.base_events + asyncio.base_subprocess + asyncio.constants + asyncio.coroutines + asyncio.events + asyncio.futures + asyncio.locks + asyncio.log + asyncio.proactor_events + asyncio.protocols + asyncio.queues + asyncio.selector_events + asyncio.sslproto + asyncio.streams + asyncio.subprocess + asyncio.tasks + asyncio.test_utils + asyncio.transports + asyncio.unix_events + asyncio.windows_events + asyncio.windows_utils + bsddb.test.test_compare + bsddb.test.test_cursor_pget_bug + bsddb.test.test_db + bsddb.test.test_dbenv + bsddb.test.test_distributed_transactions + bsddb.test.test_early_close + bsddb.test.test_fileid + bsddb.test.test_replication + bsddb.test.test_sequence + build_class + builtins + bz2 + cProfile + collections.__main__ + collections.abc + concurrent + concurrent.futures + concurrent.futures._base + concurrent.futures.process + concurrent.futures.thread + configparser + contextlib + copyreg + crypt + ctypes + ctypes._endian + ctypes.macholib + ctypes.macholib.dyld + ctypes.macholib.dylib + ctypes.macholib.framework + ctypes.test + ctypes.test.__main__ + ctypes.test.runtests + ctypes.test.test_anon + ctypes.test.test_array_in_pointer + ctypes.test.test_arrays + ctypes.test.test_as_parameter + ctypes.test.test_bitfields + ctypes.test.test_buffers + ctypes.test.test_bytes + ctypes.test.test_byteswap + ctypes.test.test_callbacks + ctypes.test.test_cast + ctypes.test.test_cfuncs + ctypes.test.test_checkretval + ctypes.test.test_delattr + ctypes.test.test_errcheck + ctypes.test.test_errno + ctypes.test.test_find + ctypes.test.test_frombuffer + ctypes.test.test_funcptr + ctypes.test.test_functions + ctypes.test.test_incomplete + ctypes.test.test_init + ctypes.test.test_integers + ctypes.test.test_internals + ctypes.test.test_keeprefs + ctypes.test.test_libc + ctypes.test.test_loading + ctypes.test.test_macholib + ctypes.test.test_memfunctions + ctypes.test.test_numbers + ctypes.test.test_objects + ctypes.test.test_parameters + ctypes.test.test_pep3118 + ctypes.test.test_pickling + ctypes.test.test_pointers + ctypes.test.test_prototypes + ctypes.test.test_python_api + ctypes.test.test_random_things + ctypes.test.test_refcounts + ctypes.test.test_repr + ctypes.test.test_returnfuncptrs + ctypes.test.test_simplesubclasses + ctypes.test.test_sizes + ctypes.test.test_slicing + ctypes.test.test_stringptr + ctypes.test.test_strings + ctypes.test.test_struct_fields + ctypes.test.test_structures + ctypes.test.test_unaligned_structures + ctypes.test.test_unicode + ctypes.test.test_values + ctypes.test.test_varsize_struct + ctypes.test.test_win32 + ctypes.test.test_wintypes + ctypes.util + ctypes.wintypes + dbm + dbm.dumb + dbm.gnu + dbm.ndbm + distutils.command.bdist_msi + distutils.command.check + distutils.command.install_egg_info + distutils.command.upload + distutils.config + distutils.msvc9compiler + distutils.tests.setuptools_build_ext + distutils.tests.setuptools_extension + distutils.tests.test_archive_util + distutils.tests.test_bdist + distutils.tests.test_bdist_dumb + distutils.tests.test_bdist_msi + distutils.tests.test_bdist_rpm + distutils.tests.test_bdist_wininst + distutils.tests.test_build + distutils.tests.test_build_clib + distutils.tests.test_build_ext + distutils.tests.test_ccompiler + distutils.tests.test_check + distutils.tests.test_clean + distutils.tests.test_cmd + distutils.tests.test_config + distutils.tests.test_config_cmd + distutils.tests.test_core + distutils.tests.test_cygwinccompiler + distutils.tests.test_dep_util + distutils.tests.test_dir_util + distutils.tests.test_extension + distutils.tests.test_file_util + distutils.tests.test_filelist + distutils.tests.test_install_data + distutils.tests.test_install_headers + distutils.tests.test_install_lib + distutils.tests.test_log + distutils.tests.test_msvc9compiler + distutils.tests.test_register + distutils.tests.test_sdist + distutils.tests.test_spawn + distutils.tests.test_sysconfig + distutils.tests.test_text_file + distutils.tests.test_unixccompiler + distutils.tests.test_upload + distutils.tests.test_util + distutils.tests.test_version + distutils.tests.test_versionpredicate + distutils.versionpredicate + email._compat21 + email._compat22 + email._encoded_words + email._header_value_parser + email._policybase + email.base64mime + email.charset + email.contentmanager + email.encoders + email.errors + email.feedparser + email.generator + email.header + email.headerregistry + email.iterators + email.message + email.mime + email.mime.application + email.mime.audio + email.mime.base + email.mime.image + email.mime.message + email.mime.multipart + email.mime.nonmultipart + email.mime.text + email.parser + email.policy + email.quoprimime + email.test.test_email_codecs_renamed + email.test.test_email_renamed + email.utils + encodings.cp1125 + encodings.cp273 + encodings.cp65001 + encodings.cp720 + encodings.cp858 + encodings.mac_arabic + encodings.mac_centeuro + encodings.mac_croatian + encodings.mac_farsi + encodings.mac_romanian + encodings.utf_32 + encodings.utf_32_be + encodings.utf_32_le + encodings.utf_8_sig + ensurepip + ensurepip.__main__ + ensurepip._uninstall + enum + faulthandler + fractions + functools + future_builtins + genericpath + hashlib + html + html.entities + html.parser + http + http.client + http.cookiejar + http.cookies + http.server + idlelib.AutoComplete + idlelib.AutoCompleteWindow + idlelib.HyperParser + idlelib.MultiCall + idlelib.RstripExtension + idlelib.__main__ + idlelib.idle_test + idlelib.idle_test.htest + idlelib.idle_test.mock_idle + idlelib.idle_test.mock_tk + idlelib.idle_test.test_autocomplete + idlelib.idle_test.test_autoexpand + idlelib.idle_test.test_calltips + idlelib.idle_test.test_config_name + idlelib.idle_test.test_configdialog + idlelib.idle_test.test_delegator + idlelib.idle_test.test_formatparagraph + idlelib.idle_test.test_grep + idlelib.idle_test.test_hyperparser + idlelib.idle_test.test_idlehistory + idlelib.idle_test.test_parenmatch + idlelib.idle_test.test_pathbrowser + idlelib.idle_test.test_rstrip + idlelib.idle_test.test_searchdialogbase + idlelib.idle_test.test_searchengine + idlelib.idle_test.test_text + idlelib.idle_test.test_textview + idlelib.idle_test.test_warning + idlelib.idle_test.test_widgetredir + idlelib.macosxSupport + idlelib.tabbedpages + importlib + importlib._bootstrap + importlib.abc + importlib.machinery + importlib.test + importlib.test.__main__ + importlib.test.abc + importlib.test.benchmark + importlib.test.builtin + importlib.test.builtin.test_finder + importlib.test.builtin.test_loader + importlib.test.builtin.util + importlib.test.extension + importlib.test.extension.test_case_sensitivity + importlib.test.extension.test_finder + importlib.test.extension.test_loader + importlib.test.extension.test_path_hook + importlib.test.extension.util + importlib.test.frozen + importlib.test.frozen.test_finder + importlib.test.frozen.test_loader + importlib.test.import_ + importlib.test.import_.test___package__ + importlib.test.import_.test_api + importlib.test.import_.test_caching + importlib.test.import_.test_fromlist + importlib.test.import_.test_meta_path + importlib.test.import_.test_packages + importlib.test.import_.test_path + importlib.test.import_.test_relative_imports + importlib.test.import_.util + importlib.test.regrtest + importlib.test.source + importlib.test.source.test_abc_loader + importlib.test.source.test_case_sensitivity + importlib.test.source.test_file_loader + importlib.test.source.test_finder + importlib.test.source.test_path_hook + importlib.test.source.test_source_encoding + importlib.test.source.util + importlib.test.test_abc + importlib.test.test_api + importlib.test.test_util + importlib.test.util + importlib.util + io + ipaddress + json + json.decoder + json.encoder + json.scanner + json.tests + json.tests.test_check_circular + json.tests.test_decode + json.tests.test_default + json.tests.test_dump + json.tests.test_encode_basestring_ascii + json.tests.test_fail + json.tests.test_float + json.tests.test_indent + json.tests.test_pass1 + json.tests.test_pass2 + json.tests.test_pass3 + json.tests.test_recursion + json.tests.test_scanstring + json.tests.test_separators + json.tests.test_speedups + json.tests.test_tool + json.tests.test_unicode + json.tool + lib2to3 + lib2to3.__main__ + lib2to3.btm_matcher + lib2to3.btm_utils + lib2to3.fixer_base + lib2to3.fixer_util + lib2to3.fixes + lib2to3.fixes.fix_apply + lib2to3.fixes.fix_asserts + lib2to3.fixes.fix_basestring + lib2to3.fixes.fix_buffer + lib2to3.fixes.fix_callable + lib2to3.fixes.fix_dict + lib2to3.fixes.fix_except + lib2to3.fixes.fix_exec + lib2to3.fixes.fix_execfile + lib2to3.fixes.fix_exitfunc + lib2to3.fixes.fix_filter + lib2to3.fixes.fix_funcattrs + lib2to3.fixes.fix_future + lib2to3.fixes.fix_getcwdu + lib2to3.fixes.fix_has_key + lib2to3.fixes.fix_idioms + lib2to3.fixes.fix_import + lib2to3.fixes.fix_imports + lib2to3.fixes.fix_imports2 + lib2to3.fixes.fix_input + lib2to3.fixes.fix_intern + lib2to3.fixes.fix_isinstance + lib2to3.fixes.fix_itertools + lib2to3.fixes.fix_itertools_imports + lib2to3.fixes.fix_long + lib2to3.fixes.fix_map + lib2to3.fixes.fix_metaclass + lib2to3.fixes.fix_methodattrs + lib2to3.fixes.fix_ne + lib2to3.fixes.fix_next + lib2to3.fixes.fix_nonzero + lib2to3.fixes.fix_numliterals + lib2to3.fixes.fix_operator + lib2to3.fixes.fix_paren + lib2to3.fixes.fix_print + lib2to3.fixes.fix_raise + lib2to3.fixes.fix_raw_input + lib2to3.fixes.fix_reduce + lib2to3.fixes.fix_reload + lib2to3.fixes.fix_renames + lib2to3.fixes.fix_repr + lib2to3.fixes.fix_set_literal + lib2to3.fixes.fix_standarderror + lib2to3.fixes.fix_sys_exc + lib2to3.fixes.fix_throw + lib2to3.fixes.fix_tuple_params + lib2to3.fixes.fix_types + lib2to3.fixes.fix_unicode + lib2to3.fixes.fix_urllib + lib2to3.fixes.fix_ws_comma + lib2to3.fixes.fix_xrange + lib2to3.fixes.fix_xreadlines + lib2to3.fixes.fix_zip + lib2to3.main + lib2to3.patcomp + lib2to3.pgen2 + lib2to3.pgen2.conv + lib2to3.pgen2.driver + lib2to3.pgen2.grammar + lib2to3.pgen2.literals + lib2to3.pgen2.parse + lib2to3.pgen2.pgen + lib2to3.pgen2.token + lib2to3.pgen2.tokenize + lib2to3.pygram + lib2to3.pytree + lib2to3.refactor + lib2to3.tests + lib2to3.tests.__main__ + lib2to3.tests.pytree_idempotency + lib2to3.tests.support + lib2to3.tests.test_all_fixers + lib2to3.tests.test_fixers + lib2to3.tests.test_main + lib2to3.tests.test_parser + lib2to3.tests.test_pytree + lib2to3.tests.test_refactor + lib2to3.tests.test_util + linuxaudiodev + lzma + multiprocessing + multiprocessing.connection + multiprocessing.context + multiprocessing.dummy + multiprocessing.dummy.connection + multiprocessing.forking + multiprocessing.forkserver + multiprocessing.heap + multiprocessing.managers + multiprocessing.pool + multiprocessing.popen_fork + multiprocessing.popen_forkserver + multiprocessing.popen_spawn_posix + multiprocessing.popen_spawn_win32 + multiprocessing.process + multiprocessing.queues + multiprocessing.reduction + multiprocessing.resource_sharer + multiprocessing.semaphore_tracker + multiprocessing.sharedctypes + multiprocessing.spawn + multiprocessing.synchronize + multiprocessing.util + nis + numbers + ossaudiodev + pathlib + pcre + plistlib + pre + pydoc_data + pydoc_data.topics + pydoc_topics + queue + readline + reprlib + rotor + runpy + selectors + socketserver + spwd + sqlite3 + sqlite3.dbapi2 + sqlite3.dump + sqlite3.test + sqlite3.test.dbapi + sqlite3.test.dump + sqlite3.test.factory + sqlite3.test.hooks + sqlite3.test.py25tests + sqlite3.test.regression + sqlite3.test.transactions + sqlite3.test.types + sqlite3.test.userfunctions + ssl + statistics + sysconfig + tkinter + tkinter.__main__ + tkinter._fix + tkinter.colorchooser + tkinter.commondialog + tkinter.constants + tkinter.dialog + tkinter.dnd + tkinter.filedialog + tkinter.font + tkinter.messagebox + tkinter.scrolledtext + tkinter.simpledialog + tkinter.test + tkinter.test.runtktests + tkinter.test.support + tkinter.test.test_tkinter + tkinter.test.test_tkinter.test_font + tkinter.test.test_tkinter.test_geometry_managers + tkinter.test.test_tkinter.test_images + tkinter.test.test_tkinter.test_loadtk + tkinter.test.test_tkinter.test_misc + tkinter.test.test_tkinter.test_text + tkinter.test.test_tkinter.test_variables + tkinter.test.test_tkinter.test_widgets + tkinter.test.test_ttk + tkinter.test.test_ttk.test_extensions + tkinter.test.test_ttk.test_functions + tkinter.test.test_ttk.test_style + tkinter.test.test_ttk.test_widgets + tkinter.test.widget_tests + tkinter.tix + tkinter.ttk + tracemalloc + ttk + turtledemo + turtledemo.__main__ + turtledemo.bytedesign + turtledemo.chaos + turtledemo.clock + turtledemo.colormixer + turtledemo.forest + turtledemo.fractalcurves + turtledemo.lindenmayer + turtledemo.minimal_hanoi + turtledemo.nim + turtledemo.paint + turtledemo.peace + turtledemo.penrose + turtledemo.planet_and_moon + turtledemo.round_dance + turtledemo.sorting_animate + turtledemo.tree + turtledemo.two_canvases + turtledemo.wikipedia + turtledemo.yinyang + unittest.__main__ + unittest.case + unittest.loader + unittest.main + unittest.mock + unittest.result + unittest.runner + unittest.signals + unittest.suite + unittest.test + unittest.test.__main__ + unittest.test._test_warnings + unittest.test.dummy + unittest.test.support + unittest.test.test_assertions + unittest.test.test_break + unittest.test.test_case + unittest.test.test_discovery + unittest.test.test_functiontestcase + unittest.test.test_loader + unittest.test.test_program + unittest.test.test_result + unittest.test.test_runner + unittest.test.test_setups + unittest.test.test_skipping + unittest.test.test_suite + unittest.test.testmock + unittest.test.testmock.__main__ + unittest.test.testmock.support + unittest.test.testmock.testcallable + unittest.test.testmock.testhelpers + unittest.test.testmock.testmagicmethods + unittest.test.testmock.testmock + unittest.test.testmock.testpatch + unittest.test.testmock.testsentinel + unittest.test.testmock.testwith + unittest.util + urllib.error + urllib.parse + urllib.request + urllib.response + urllib.robotparser + uuid + venv + venv.__main__ + wsgiref + wsgiref.handlers + wsgiref.headers + wsgiref.simple_server + wsgiref.util + wsgiref.validate + xml.etree + xml.etree.ElementInclude + xml.etree.ElementPath + xml.etree.ElementTree + xml.etree.cElementTree + xmlrpc + xmlrpc.client + xmlrpc.server + xreadlines + xxlimited + zlib + BaseException + BlockingIOError + BrokenPipeError + BufferError + BytesWarning + ChildProcessError + ConnectionAbortedError + ConnectionError + ConnectionRefusedError + ConnectionResetError + FileExistsError + FileNotFoundError + GeneratorExit + ImportWarning + InterruptedError + IsADirectoryError + NotADirectoryError + PermissionError + ProcessLookupError + ResourceWarning + TimeoutError + UnicodeWarning + __build_class__ + __loader__ + __package__ + __spec__ + all + any + ascii + bin + bytearray + bytes + exec + format + memoryview + next + print + + + CDROM + DLFCN + FCNTL + TERMIOS + TYPES + _abcoll + _bootlocale + _bytesio + _collections + _collections_abc + _compat_pickle + _crypt + _datetime + _decimal + _dummy_thread + _fileio + _imp + _io + _json + _markupbase + _multiprocessing + _opcode + _operator + _osx_support + _pickle + _posixsubprocess + _pydecimal + _pyio + _sha1 + _sha256 + _sha512 + _signal + _sitebuiltins + _stat + _string + _stringio + _sysconfigdata + _testbuffer + _testimportmultiple + _thread + _tracemalloc + _warnings + _weakrefset + abc + antigravity + argparse + ast + asyncio + asyncio.base_events + asyncio.base_subprocess + asyncio.constants + asyncio.coroutines + asyncio.events + asyncio.futures + asyncio.locks + asyncio.log + asyncio.proactor_events + asyncio.protocols + asyncio.queues + asyncio.selector_events + asyncio.sslproto + asyncio.streams + asyncio.subprocess + asyncio.tasks + asyncio.test_utils + asyncio.transports + asyncio.unix_events + asyncio.windows_events + asyncio.windows_utils + bsddb.test.test_db + bsddb.test.test_dbenv + bsddb.test.test_distributed_transactions + bsddb.test.test_early_close + bsddb.test.test_fileid + bsddb.test.test_replication + build_class + builtins + bz2 + collections.__main__ + collections.abc + concurrent + concurrent.futures + concurrent.futures._base + concurrent.futures.process + concurrent.futures.thread + configparser + copyreg + ctypes.test.__main__ + ctypes.test.test_bytes + ctypes.test.test_errno + ctypes.test.test_frombuffer + ctypes.test.test_pep3118 + ctypes.test.test_pickling + ctypes.test.test_wintypes + dbm + dbm.dumb + dbm.gnu + dbm.ndbm + distutils.command.check + distutils.config + distutils.msvc9compiler + distutils.tests.setuptools_build_ext + distutils.tests.setuptools_extension + distutils.tests.test_archive_util + distutils.tests.test_bdist + distutils.tests.test_bdist_dumb + distutils.tests.test_bdist_msi + distutils.tests.test_bdist_rpm + distutils.tests.test_bdist_wininst + distutils.tests.test_build + distutils.tests.test_build_clib + distutils.tests.test_build_ext + distutils.tests.test_ccompiler + distutils.tests.test_check + distutils.tests.test_clean + distutils.tests.test_cmd + distutils.tests.test_config + distutils.tests.test_config_cmd + distutils.tests.test_core + distutils.tests.test_cygwinccompiler + distutils.tests.test_dep_util + distutils.tests.test_dir_util + distutils.tests.test_extension + distutils.tests.test_file_util + distutils.tests.test_filelist + distutils.tests.test_install_data + distutils.tests.test_install_headers + distutils.tests.test_install_lib + distutils.tests.test_log + distutils.tests.test_msvc9compiler + distutils.tests.test_register + distutils.tests.test_sdist + distutils.tests.test_spawn + distutils.tests.test_sysconfig + distutils.tests.test_text_file + distutils.tests.test_unixccompiler + distutils.tests.test_upload + distutils.tests.test_util + distutils.tests.test_version + email.Charset + email.Encoders + email.Errors + email.FeedParser + email.Generator + email.Header + email.Iterators + email.MIMEAudio + email.MIMEBase + email.MIMEImage + email.MIMEMessage + email.MIMEMultipart + email.MIMENonMultipart + email.MIMEText + email.Message + email.Parser + email.Utils + email._compat21 + email._compat22 + email._encoded_words + email._header_value_parser + email._policybase + email.base64MIME + email.contentmanager + email.headerregistry + email.policy + email.quopriMIME + encodings.cp1125 + encodings.cp273 + encodings.cp65001 + encodings.cp720 + encodings.cp858 + encodings.utf_32 + encodings.utf_32_be + encodings.utf_32_le + ensurepip + ensurepip.__main__ + ensurepip._uninstall + enum + faulthandler + fractions + future_builtins + genericpath + html + html.entities + html.parser + http + http.client + http.cookiejar + http.cookies + http.server + idlelib.RstripExtension + idlelib.__main__ + idlelib.buildapp + idlelib.idle_test + idlelib.idle_test.htest + idlelib.idle_test.mock_idle + idlelib.idle_test.mock_tk + idlelib.idle_test.test_autocomplete + idlelib.idle_test.test_autoexpand + idlelib.idle_test.test_calltips + idlelib.idle_test.test_config_name + idlelib.idle_test.test_configdialog + idlelib.idle_test.test_delegator + idlelib.idle_test.test_formatparagraph + idlelib.idle_test.test_grep + idlelib.idle_test.test_hyperparser + idlelib.idle_test.test_idlehistory + idlelib.idle_test.test_parenmatch + idlelib.idle_test.test_pathbrowser + idlelib.idle_test.test_rstrip + idlelib.idle_test.test_searchdialogbase + idlelib.idle_test.test_searchengine + idlelib.idle_test.test_text + idlelib.idle_test.test_textview + idlelib.idle_test.test_warning + idlelib.idle_test.test_widgetredir + idlelib.tabbedpages + importlib + importlib._bootstrap + importlib.abc + importlib.machinery + importlib.test + importlib.test.__main__ + importlib.test.abc + importlib.test.benchmark + importlib.test.builtin + importlib.test.builtin.test_finder + importlib.test.builtin.test_loader + importlib.test.builtin.util + importlib.test.extension + importlib.test.extension.test_case_sensitivity + importlib.test.extension.test_finder + importlib.test.extension.test_loader + importlib.test.extension.test_path_hook + importlib.test.extension.util + importlib.test.frozen + importlib.test.frozen.test_finder + importlib.test.frozen.test_loader + importlib.test.import_ + importlib.test.import_.test___package__ + importlib.test.import_.test_api + importlib.test.import_.test_caching + importlib.test.import_.test_fromlist + importlib.test.import_.test_meta_path + importlib.test.import_.test_packages + importlib.test.import_.test_path + importlib.test.import_.test_relative_imports + importlib.test.import_.util + importlib.test.regrtest + importlib.test.source + importlib.test.source.test_abc_loader + importlib.test.source.test_case_sensitivity + importlib.test.source.test_file_loader + importlib.test.source.test_finder + importlib.test.source.test_path_hook + importlib.test.source.test_source_encoding + importlib.test.source.util + importlib.test.test_abc + importlib.test.test_api + importlib.test.test_util + importlib.test.util + importlib.util + io + ipaddress + json + json.decoder + json.encoder + json.scanner + json.tests + json.tests.test_check_circular + json.tests.test_decode + json.tests.test_default + json.tests.test_dump + json.tests.test_encode_basestring_ascii + json.tests.test_fail + json.tests.test_float + json.tests.test_indent + json.tests.test_pass1 + json.tests.test_pass2 + json.tests.test_pass3 + json.tests.test_recursion + json.tests.test_scanstring + json.tests.test_separators + json.tests.test_speedups + json.tests.test_tool + json.tests.test_unicode + json.tool + lib2to3 + lib2to3.__main__ + lib2to3.btm_matcher + lib2to3.btm_utils + lib2to3.fixer_base + lib2to3.fixer_util + lib2to3.fixes + lib2to3.fixes.fix_apply + lib2to3.fixes.fix_asserts + lib2to3.fixes.fix_basestring + lib2to3.fixes.fix_buffer + lib2to3.fixes.fix_callable + lib2to3.fixes.fix_dict + lib2to3.fixes.fix_except + lib2to3.fixes.fix_exec + lib2to3.fixes.fix_execfile + lib2to3.fixes.fix_exitfunc + lib2to3.fixes.fix_filter + lib2to3.fixes.fix_funcattrs + lib2to3.fixes.fix_future + lib2to3.fixes.fix_getcwdu + lib2to3.fixes.fix_has_key + lib2to3.fixes.fix_idioms + lib2to3.fixes.fix_import + lib2to3.fixes.fix_imports + lib2to3.fixes.fix_imports2 + lib2to3.fixes.fix_input + lib2to3.fixes.fix_intern + lib2to3.fixes.fix_isinstance + lib2to3.fixes.fix_itertools + lib2to3.fixes.fix_itertools_imports + lib2to3.fixes.fix_long + lib2to3.fixes.fix_map + lib2to3.fixes.fix_metaclass + lib2to3.fixes.fix_methodattrs + lib2to3.fixes.fix_ne + lib2to3.fixes.fix_next + lib2to3.fixes.fix_nonzero + lib2to3.fixes.fix_numliterals + lib2to3.fixes.fix_operator + lib2to3.fixes.fix_paren + lib2to3.fixes.fix_print + lib2to3.fixes.fix_raise + lib2to3.fixes.fix_raw_input + lib2to3.fixes.fix_reduce + lib2to3.fixes.fix_reload + lib2to3.fixes.fix_renames + lib2to3.fixes.fix_repr + lib2to3.fixes.fix_set_literal + lib2to3.fixes.fix_standarderror + lib2to3.fixes.fix_sys_exc + lib2to3.fixes.fix_throw + lib2to3.fixes.fix_tuple_params + lib2to3.fixes.fix_types + lib2to3.fixes.fix_unicode + lib2to3.fixes.fix_urllib + lib2to3.fixes.fix_ws_comma + lib2to3.fixes.fix_xrange + lib2to3.fixes.fix_xreadlines + lib2to3.fixes.fix_zip + lib2to3.main + lib2to3.patcomp + lib2to3.pgen2 + lib2to3.pgen2.conv + lib2to3.pgen2.driver + lib2to3.pgen2.grammar + lib2to3.pgen2.literals + lib2to3.pgen2.parse + lib2to3.pgen2.pgen + lib2to3.pgen2.token + lib2to3.pgen2.tokenize + lib2to3.pygram + lib2to3.pytree + lib2to3.refactor + lib2to3.tests + lib2to3.tests.__main__ + lib2to3.tests.pytree_idempotency + lib2to3.tests.support + lib2to3.tests.test_all_fixers + lib2to3.tests.test_fixers + lib2to3.tests.test_main + lib2to3.tests.test_parser + lib2to3.tests.test_pytree + lib2to3.tests.test_refactor + lib2to3.tests.test_util + linuxaudiodev + lzma + multiprocessing + multiprocessing.connection + multiprocessing.context + multiprocessing.dummy + multiprocessing.dummy.connection + multiprocessing.forking + multiprocessing.forkserver + multiprocessing.heap + multiprocessing.managers + multiprocessing.pool + multiprocessing.popen_fork + multiprocessing.popen_forkserver + multiprocessing.popen_spawn_posix + multiprocessing.popen_spawn_win32 + multiprocessing.process + multiprocessing.queues + multiprocessing.reduction + multiprocessing.resource_sharer + multiprocessing.semaphore_tracker + multiprocessing.sharedctypes + multiprocessing.spawn + multiprocessing.synchronize + multiprocessing.util + numbers + ossaudiodev + pathlib + pcre + plistlib + pre + pydoc_data + pydoc_data.topics + pydoc_topics + queue + readline + reconvert + regex + regex_syntax + regsub + reprlib + rotor + selectors + socketserver + sqlite3.dump + sqlite3.test.dump + sqlite3.test.py25tests + ssl + statcache + statistics + sysconfig + timing + tkinter + tkinter.__main__ + tkinter._fix + tkinter.colorchooser + tkinter.commondialog + tkinter.constants + tkinter.dialog + tkinter.dnd + tkinter.filedialog + tkinter.font + tkinter.messagebox + tkinter.scrolledtext + tkinter.simpledialog + tkinter.test + tkinter.test.runtktests + tkinter.test.support + tkinter.test.test_tkinter + tkinter.test.test_tkinter.test_font + tkinter.test.test_tkinter.test_geometry_managers + tkinter.test.test_tkinter.test_images + tkinter.test.test_tkinter.test_loadtk + tkinter.test.test_tkinter.test_misc + tkinter.test.test_tkinter.test_text + tkinter.test.test_tkinter.test_variables + tkinter.test.test_tkinter.test_widgets + tkinter.test.test_ttk + tkinter.test.test_ttk.test_extensions + tkinter.test.test_ttk.test_functions + tkinter.test.test_ttk.test_style + tkinter.test.test_ttk.test_widgets + tkinter.test.widget_tests + tkinter.tix + tkinter.ttk + tracemalloc + ttk + turtledemo + turtledemo.__main__ + turtledemo.bytedesign + turtledemo.chaos + turtledemo.clock + turtledemo.colormixer + turtledemo.forest + turtledemo.fractalcurves + turtledemo.lindenmayer + turtledemo.minimal_hanoi + turtledemo.nim + turtledemo.paint + turtledemo.peace + turtledemo.penrose + turtledemo.planet_and_moon + turtledemo.round_dance + turtledemo.sorting_animate + turtledemo.tree + turtledemo.two_canvases + turtledemo.wikipedia + turtledemo.yinyang + tzparse + unittest.__main__ + unittest.case + unittest.loader + unittest.main + unittest.mock + unittest.result + unittest.runner + unittest.signals + unittest.suite + unittest.test + unittest.test.__main__ + unittest.test._test_warnings + unittest.test.dummy + unittest.test.support + unittest.test.test_assertions + unittest.test.test_break + unittest.test.test_case + unittest.test.test_discovery + unittest.test.test_functiontestcase + unittest.test.test_loader + unittest.test.test_program + unittest.test.test_result + unittest.test.test_runner + unittest.test.test_setups + unittest.test.test_skipping + unittest.test.test_suite + unittest.test.testmock + unittest.test.testmock.__main__ + unittest.test.testmock.support + unittest.test.testmock.testcallable + unittest.test.testmock.testhelpers + unittest.test.testmock.testmagicmethods + unittest.test.testmock.testmock + unittest.test.testmock.testpatch + unittest.test.testmock.testsentinel + unittest.test.testmock.testwith + unittest.util + urllib.error + urllib.parse + urllib.request + urllib.response + urllib.robotparser + venv + venv.__main__ + whrandom + xmlrpc + xmlrpc.client + xmlrpc.server + xreadlines + xxlimited + BlockingIOError + BrokenPipeError + BufferError + BytesWarning + ChildProcessError + ConnectionAbortedError + ConnectionError + ConnectionRefusedError + ConnectionResetError + FileExistsError + FileNotFoundError + InterruptedError + IsADirectoryError + NotADirectoryError + OverflowWarning + PermissionError + ProcessLookupError + ResourceWarning + TimeoutError + __build_class__ + __loader__ + __package__ + __spec__ + ascii + bin + bytearray + bytes + exec + format + memoryview + next + print + + + CDROM + DLFCN + FCNTL + TERMIOS + TYPES + _bootlocale + _collections_abc + _compat_pickle + _crypt + _curses + _curses_panel + _datetime + _decimal + _dummy_thread + _hashlib + _imp + _io + _markupbase + _opcode + _operator + _osx_support + _pickle + _posixsubprocess + _pydecimal + _pyio + _sha1 + _sha256 + _sha512 + _signal + _sitebuiltins + _ssl + _stat + _string + _stringio + _sysconfigdata + _testbuffer + _testimportmultiple + _thread + _tracemalloc + _types + _weakrefset + antigravity + argparse + asyncio + asyncio.base_events + asyncio.base_subprocess + asyncio.constants + asyncio.coroutines + asyncio.events + asyncio.futures + asyncio.locks + asyncio.log + asyncio.proactor_events + asyncio.protocols + asyncio.queues + asyncio.selector_events + asyncio.sslproto + asyncio.streams + asyncio.subprocess + asyncio.tasks + asyncio.test_utils + asyncio.transports + asyncio.unix_events + asyncio.windows_events + asyncio.windows_utils + bsddb.test.test_1413192 + bsddb.test.test_db + bsddb.test.test_dbenv + bsddb.test.test_env_close + bsddb.test.test_fileid + build_class + builtins + bz2 + collections.__main__ + collections.abc + concurrent + concurrent.futures + concurrent.futures._base + concurrent.futures.process + concurrent.futures.thread + configparser + copyreg + crypt + ctypes.test.__main__ + ctypes.test.test_bytes + ctypes.test.test_wintypes + dbm + dbm.dumb + dbm.gnu + dbm.ndbm + distutils.command.check + distutils.tests.test_archive_util + distutils.tests.test_bdist + distutils.tests.test_bdist_dumb + distutils.tests.test_bdist_msi + distutils.tests.test_bdist_rpm + distutils.tests.test_build + distutils.tests.test_build_clib + distutils.tests.test_ccompiler + distutils.tests.test_check + distutils.tests.test_clean + distutils.tests.test_cmd + distutils.tests.test_config_cmd + distutils.tests.test_cygwinccompiler + distutils.tests.test_dep_util + distutils.tests.test_dir_util + distutils.tests.test_extension + distutils.tests.test_file_util + distutils.tests.test_install_data + distutils.tests.test_install_headers + distutils.tests.test_log + distutils.tests.test_spawn + distutils.tests.test_text_file + distutils.tests.test_version + email.Charset + email.Encoders + email.Errors + email.FeedParser + email.Generator + email.Header + email.Iterators + email.MIMEAudio + email.MIMEBase + email.MIMEImage + email.MIMEMessage + email.MIMEMultipart + email.MIMENonMultipart + email.MIMEText + email.Message + email.Parser + email.Utils + email._compat21 + email._compat22 + email._encoded_words + email._header_value_parser + email._policybase + email.base64MIME + email.contentmanager + email.headerregistry + email.policy + email.quopriMIME + encodings.cp1125 + encodings.cp273 + encodings.cp65001 + encodings.cp720 + encodings.cp858 + ensurepip + ensurepip.__main__ + ensurepip._uninstall + enum + faulthandler + gopherlib + html + html.entities + html.parser + http + http.client + http.cookiejar + http.cookies + http.server + idlelib.RstripExtension + idlelib.__main__ + idlelib.buildapp + idlelib.idle_test + idlelib.idle_test.htest + idlelib.idle_test.mock_idle + idlelib.idle_test.mock_tk + idlelib.idle_test.test_autocomplete + idlelib.idle_test.test_autoexpand + idlelib.idle_test.test_calltips + idlelib.idle_test.test_config_name + idlelib.idle_test.test_configdialog + idlelib.idle_test.test_delegator + idlelib.idle_test.test_formatparagraph + idlelib.idle_test.test_grep + idlelib.idle_test.test_hyperparser + idlelib.idle_test.test_idlehistory + idlelib.idle_test.test_parenmatch + idlelib.idle_test.test_pathbrowser + idlelib.idle_test.test_rstrip + idlelib.idle_test.test_searchdialogbase + idlelib.idle_test.test_searchengine + idlelib.idle_test.test_text + idlelib.idle_test.test_textview + idlelib.idle_test.test_warning + idlelib.idle_test.test_widgetredir + idlelib.tabpage + importlib + importlib._bootstrap + importlib.abc + importlib.machinery + importlib.test + importlib.test.__main__ + importlib.test.abc + importlib.test.benchmark + importlib.test.builtin + importlib.test.builtin.test_finder + importlib.test.builtin.test_loader + importlib.test.builtin.util + importlib.test.extension + importlib.test.extension.test_case_sensitivity + importlib.test.extension.test_finder + importlib.test.extension.test_loader + importlib.test.extension.test_path_hook + importlib.test.extension.util + importlib.test.frozen + importlib.test.frozen.test_finder + importlib.test.frozen.test_loader + importlib.test.import_ + importlib.test.import_.test___package__ + importlib.test.import_.test_api + importlib.test.import_.test_caching + importlib.test.import_.test_fromlist + importlib.test.import_.test_meta_path + importlib.test.import_.test_packages + importlib.test.import_.test_path + importlib.test.import_.test_relative_imports + importlib.test.import_.util + importlib.test.regrtest + importlib.test.source + importlib.test.source.test_abc_loader + importlib.test.source.test_case_sensitivity + importlib.test.source.test_file_loader + importlib.test.source.test_finder + importlib.test.source.test_path_hook + importlib.test.source.test_source_encoding + importlib.test.source.util + importlib.test.test_abc + importlib.test.test_api + importlib.test.test_util + importlib.test.util + importlib.util + ipaddress + json.tests.test_check_circular + json.tests.test_tool + lib2to3.__main__ + lib2to3.btm_matcher + lib2to3.btm_utils + lib2to3.fixes.fix_asserts + lib2to3.fixes.fix_reload + lib2to3.tests.__main__ + linuxaudiodev + lzma + multiprocessing.context + multiprocessing.forkserver + multiprocessing.popen_fork + multiprocessing.popen_forkserver + multiprocessing.popen_spawn_posix + multiprocessing.popen_spawn_win32 + multiprocessing.resource_sharer + multiprocessing.semaphore_tracker + multiprocessing.spawn + nis + ossaudiodev + pathlib + pcre + pre + pydoc_data + pydoc_data.topics + queue + readline + reconvert + regex + regex_syntax + regsub + reprlib + rotor + selectors + socketserver + statcache + statistics + sysconfig + timing + tkinter + tkinter.__main__ + tkinter._fix + tkinter.colorchooser + tkinter.commondialog + tkinter.constants + tkinter.dialog + tkinter.dnd + tkinter.filedialog + tkinter.font + tkinter.messagebox + tkinter.scrolledtext + tkinter.simpledialog + tkinter.test + tkinter.test.runtktests + tkinter.test.support + tkinter.test.test_tkinter + tkinter.test.test_tkinter.test_font + tkinter.test.test_tkinter.test_geometry_managers + tkinter.test.test_tkinter.test_images + tkinter.test.test_tkinter.test_loadtk + tkinter.test.test_tkinter.test_misc + tkinter.test.test_tkinter.test_text + tkinter.test.test_tkinter.test_variables + tkinter.test.test_tkinter.test_widgets + tkinter.test.test_ttk + tkinter.test.test_ttk.test_extensions + tkinter.test.test_ttk.test_functions + tkinter.test.test_ttk.test_style + tkinter.test.test_ttk.test_widgets + tkinter.test.widget_tests + tkinter.tix + tkinter.ttk + tracemalloc + ttk + turtledemo + turtledemo.__main__ + turtledemo.bytedesign + turtledemo.chaos + turtledemo.clock + turtledemo.colormixer + turtledemo.forest + turtledemo.fractalcurves + turtledemo.lindenmayer + turtledemo.minimal_hanoi + turtledemo.nim + turtledemo.paint + turtledemo.peace + turtledemo.penrose + turtledemo.planet_and_moon + turtledemo.round_dance + turtledemo.sorting_animate + turtledemo.tree + turtledemo.two_canvases + turtledemo.wikipedia + turtledemo.yinyang + tzparse + unittest.__main__ + unittest.case + unittest.loader + unittest.main + unittest.mock + unittest.result + unittest.runner + unittest.signals + unittest.suite + unittest.test + unittest.test.__main__ + unittest.test._test_warnings + unittest.test.dummy + unittest.test.support + unittest.test.test_assertions + unittest.test.test_break + unittest.test.test_case + unittest.test.test_discovery + unittest.test.test_functiontestcase + unittest.test.test_loader + unittest.test.test_program + unittest.test.test_result + unittest.test.test_runner + unittest.test.test_setups + unittest.test.test_skipping + unittest.test.test_suite + unittest.test.testmock + unittest.test.testmock.__main__ + unittest.test.testmock.support + unittest.test.testmock.testcallable + unittest.test.testmock.testhelpers + unittest.test.testmock.testmagicmethods + unittest.test.testmock.testmock + unittest.test.testmock.testpatch + unittest.test.testmock.testsentinel + unittest.test.testmock.testwith + unittest.util + urllib.error + urllib.parse + urllib.request + urllib.response + urllib.robotparser + venv + venv.__main__ + whrandom + xmlrpc + xmlrpc.client + xmlrpc.server + xreadlines + xxlimited + zlib + BlockingIOError + BrokenPipeError + ChildProcessError + ConnectionAbortedError + ConnectionError + ConnectionRefusedError + ConnectionResetError + FileExistsError + FileNotFoundError + InterruptedError + IsADirectoryError + NotADirectoryError + OverflowWarning + PermissionError + ProcessLookupError + ResourceWarning + TimeoutError + __build_class__ + __loader__ + __spec__ + ascii + exec + memoryview + + + FCNTL + TERMIOS + _bootlocale + _bytesio + _collections_abc + _compat_pickle + _crypt + _datetime + _decimal + _dummy_thread + _fileio + _imp + _markupbase + _md5 + _opcode + _operator + _pickle + _posixsubprocess + _pydecimal + _sha + _sha1 + _sha256 + _sha512 + _signal + _sitebuiltins + _stat + _string + _stringio + _testbuffer + _testimportmultiple + _thread + _tracemalloc + _types + asyncio + asyncio.base_events + asyncio.base_subprocess + asyncio.constants + asyncio.coroutines + asyncio.events + asyncio.futures + asyncio.locks + asyncio.log + asyncio.proactor_events + asyncio.protocols + asyncio.queues + asyncio.selector_events + asyncio.sslproto + asyncio.streams + asyncio.subprocess + asyncio.tasks + asyncio.test_utils + asyncio.transports + asyncio.unix_events + asyncio.windows_events + asyncio.windows_utils + bsddb.test.test_1413192 + bsddb.test.test_env_close + build_class + builtins + bz2 + collections.__main__ + collections.abc + concurrent + concurrent.futures + concurrent.futures._base + concurrent.futures.process + concurrent.futures.thread + configparser + copyreg + crypt_failed + ctypes.test.__main__ + ctypes.test.test_bytes + ctypes.test.test_errcheck + ctypes.test.test_integers + dbm + dbm.dumb + dbm.gnu + dbm.ndbm + distutils.mwerkscompiler + distutils.tests.test_cygwinccompiler + distutils.tests.test_extension + distutils.tests.test_log + email.Charset + email.Encoders + email.Errors + email.FeedParser + email.Generator + email.Header + email.Iterators + email.MIMEAudio + email.MIMEBase + email.MIMEImage + email.MIMEMessage + email.MIMEMultipart + email.MIMENonMultipart + email.MIMEText + email.Message + email.Parser + email.Utils + email._compat21 + email._compat22 + email._encoded_words + email._header_value_parser + email._policybase + email.base64MIME + email.contentmanager + email.headerregistry + email.policy + email.quopriMIME + encodings.cp1125 + encodings.cp273 + encodings.cp65001 + ensurepip + ensurepip.__main__ + ensurepip._uninstall + enum + faulthandler + gopherlib + html + html.entities + html.parser + http + http.client + http.cookiejar + http.cookies + http.server + idlelib.__main__ + idlelib.buildapp + idlelib.idle_test.test_configdialog + idlelib.idle_test.test_searchdialogbase + idlelib.idle_test.test_widgetredir + idlelib.tabpage + importlib._bootstrap + importlib.abc + importlib.machinery + importlib.test + importlib.test.__main__ + importlib.test.abc + importlib.test.benchmark + importlib.test.builtin + importlib.test.builtin.test_finder + importlib.test.builtin.test_loader + importlib.test.builtin.util + importlib.test.extension + importlib.test.extension.test_case_sensitivity + importlib.test.extension.test_finder + importlib.test.extension.test_loader + importlib.test.extension.test_path_hook + importlib.test.extension.util + importlib.test.frozen + importlib.test.frozen.test_finder + importlib.test.frozen.test_loader + importlib.test.import_ + importlib.test.import_.test___package__ + importlib.test.import_.test_api + importlib.test.import_.test_caching + importlib.test.import_.test_fromlist + importlib.test.import_.test_meta_path + importlib.test.import_.test_packages + importlib.test.import_.test_path + importlib.test.import_.test_relative_imports + importlib.test.import_.util + importlib.test.regrtest + importlib.test.source + importlib.test.source.test_abc_loader + importlib.test.source.test_case_sensitivity + importlib.test.source.test_file_loader + importlib.test.source.test_finder + importlib.test.source.test_path_hook + importlib.test.source.test_source_encoding + importlib.test.source.util + importlib.test.test_abc + importlib.test.test_api + importlib.test.test_util + importlib.test.util + importlib.util + ipaddress + lib2to3.fixes.fix_asserts + lib2to3.fixes.fix_reload + lib2to3.tests.__main__ + lzma + multiprocessing.context + multiprocessing.forkserver + multiprocessing.popen_fork + multiprocessing.popen_forkserver + multiprocessing.popen_spawn_posix + multiprocessing.popen_spawn_win32 + multiprocessing.resource_sharer + multiprocessing.semaphore_tracker + multiprocessing.spawn + nis_failed + pathlib + pcre + pre + pydoc_topics + queue + reconvert + regex + regex_syntax + regsub + reprlib + rotor + selectors + socketserver + statcache + statistics + timing + tkinter + tkinter.__main__ + tkinter._fix + tkinter.colorchooser + tkinter.commondialog + tkinter.constants + tkinter.dialog + tkinter.dnd + tkinter.filedialog + tkinter.font + tkinter.messagebox + tkinter.scrolledtext + tkinter.simpledialog + tkinter.test + tkinter.test.runtktests + tkinter.test.support + tkinter.test.test_tkinter + tkinter.test.test_tkinter.test_font + tkinter.test.test_tkinter.test_geometry_managers + tkinter.test.test_tkinter.test_images + tkinter.test.test_tkinter.test_loadtk + tkinter.test.test_tkinter.test_misc + tkinter.test.test_tkinter.test_text + tkinter.test.test_tkinter.test_variables + tkinter.test.test_tkinter.test_widgets + tkinter.test.test_ttk + tkinter.test.test_ttk.test_extensions + tkinter.test.test_ttk.test_functions + tkinter.test.test_ttk.test_style + tkinter.test.test_ttk.test_widgets + tkinter.test.widget_tests + tkinter.tix + tkinter.ttk + tracemalloc + turtledemo + turtledemo.__main__ + turtledemo.bytedesign + turtledemo.chaos + turtledemo.clock + turtledemo.colormixer + turtledemo.forest + turtledemo.fractalcurves + turtledemo.lindenmayer + turtledemo.minimal_hanoi + turtledemo.nim + turtledemo.paint + turtledemo.peace + turtledemo.penrose + turtledemo.planet_and_moon + turtledemo.round_dance + turtledemo.sorting_animate + turtledemo.tree + turtledemo.two_canvases + turtledemo.wikipedia + turtledemo.yinyang + tzparse + unittest.mock + unittest.test.__main__ + unittest.test._test_warnings + unittest.test.testmock + unittest.test.testmock.__main__ + unittest.test.testmock.support + unittest.test.testmock.testcallable + unittest.test.testmock.testhelpers + unittest.test.testmock.testmagicmethods + unittest.test.testmock.testmock + unittest.test.testmock.testpatch + unittest.test.testmock.testsentinel + unittest.test.testmock.testwith + urllib.error + urllib.parse + urllib.request + urllib.response + urllib.robotparser + venv + venv.__main__ + whrandom + xmlrpc + xmlrpc.client + xmlrpc.server + xreadlines + xxlimited + BlockingIOError + BrokenPipeError + ChildProcessError + ConnectionAbortedError + ConnectionError + ConnectionRefusedError + ConnectionResetError + FileExistsError + FileNotFoundError + InterruptedError + IsADirectoryError + NotADirectoryError + OverflowWarning + PermissionError + ProcessLookupError + ResourceWarning + TimeoutError + __build_class__ + __loader__ + __spec__ + ascii + exec + + + BaseHTTPServer + Bastion + CDROM + CGIHTTPServer + Canvas + ConfigParser + Cookie + DLFCN + Dialog + DocXMLRPCServer + FCNTL + FileDialog + FixTk + HTMLParser + MimeWriter + Queue + ScrolledText + SimpleDialog + SimpleHTTPServer + SimpleXMLRPCServer + SocketServer + StringIO + TERMIOS + TYPES + Tix + Tkconstants + Tkdnd + Tkinter + UserDict + UserList + UserString + _LWPCookieJar + _MozillaCookieJar + __builtin__ + _bootlocale + _collections_abc + _compat_pickle + _crypt + _curses + _curses_panel + _datetime + _decimal + _hashlib + _hotshot + _imp + _io + _md5 + _opcode + _operator + _osx_support + _posixsubprocess + _pydecimal + _pyio + _sha + _sha1 + _sha256 + _sha512 + _signal + _sitebuiltins + _ssl + _stat + _string + _sysconfigdata + _testbuffer + _testimportmultiple + _tracemalloc + _types + anydbm + argparse + asyncio + asyncio.base_events + asyncio.base_subprocess + asyncio.constants + asyncio.coroutines + asyncio.events + asyncio.futures + asyncio.locks + asyncio.log + asyncio.proactor_events + asyncio.protocols + asyncio.queues + asyncio.selector_events + asyncio.sslproto + asyncio.streams + asyncio.subprocess + asyncio.tasks + asyncio.test_utils + asyncio.transports + asyncio.unix_events + asyncio.windows_events + asyncio.windows_utils + audiodev + bsddb + bsddb.db + bsddb.dbobj + bsddb.dbrecio + bsddb.dbshelve + bsddb.dbtables + bsddb.dbutils + bsddb.test + bsddb.test.test_1413192 + bsddb.test.test_all + bsddb.test.test_associate + bsddb.test.test_basics + bsddb.test.test_compare + bsddb.test.test_compat + bsddb.test.test_cursor_pget_bug + bsddb.test.test_db + bsddb.test.test_dbenv + bsddb.test.test_dbobj + bsddb.test.test_dbshelve + bsddb.test.test_dbtables + bsddb.test.test_distributed_transactions + bsddb.test.test_early_close + bsddb.test.test_env_close + bsddb.test.test_fileid + bsddb.test.test_get_none + bsddb.test.test_join + bsddb.test.test_lock + bsddb.test.test_misc + bsddb.test.test_pickle + bsddb.test.test_queue + bsddb.test.test_recno + bsddb.test.test_replication + bsddb.test.test_sequence + bsddb.test.test_thread + bz2 + cPickle + cStringIO + collections.__main__ + collections.abc + commands + compiler + compiler.ast + compiler.consts + compiler.future + compiler.misc + compiler.pyassem + compiler.pycodegen + compiler.symbols + compiler.syntax + compiler.transformer + compiler.visitor + concurrent + concurrent.futures + concurrent.futures._base + concurrent.futures.process + concurrent.futures.thread + cookielib + copy_reg + crypt + ctypes.test.__main__ + ctypes.test.test_wintypes + dbhash + dircache + distutils.command.check + distutils.tests.setuptools_build_ext + distutils.tests.setuptools_extension + distutils.tests.test_archive_util + distutils.tests.test_bdist + distutils.tests.test_bdist_dumb + distutils.tests.test_bdist_msi + distutils.tests.test_bdist_rpm + distutils.tests.test_bdist_wininst + distutils.tests.test_build + distutils.tests.test_build_clib + distutils.tests.test_ccompiler + distutils.tests.test_check + distutils.tests.test_clean + distutils.tests.test_cmd + distutils.tests.test_config_cmd + distutils.tests.test_cygwinccompiler + distutils.tests.test_dep_util + distutils.tests.test_dir_util + distutils.tests.test_extension + distutils.tests.test_file_util + distutils.tests.test_filelist + distutils.tests.test_install_data + distutils.tests.test_install_headers + distutils.tests.test_install_lib + distutils.tests.test_log + distutils.tests.test_spawn + distutils.tests.test_text_file + distutils.tests.test_unixccompiler + distutils.tests.test_util + distutils.tests.test_version + dumbdbm + dummy_thread + email.Charset + email.Encoders + email.Errors + email.FeedParser + email.Generator + email.Header + email.Iterators + email.MIMEAudio + email.MIMEBase + email.MIMEImage + email.MIMEMessage + email.MIMEMultipart + email.MIMENonMultipart + email.MIMEText + email.Message + email.Parser + email.Utils + email._compat21 + email._compat22 + email._encoded_words + email._header_value_parser + email._policybase + email.base64MIME + email.contentmanager + email.headerregistry + email.policy + email.quopriMIME + email.test.test_email_renamed + encodings.base64_codec + encodings.bz2_codec + encodings.cp1125 + encodings.cp273 + encodings.cp65001 + encodings.cp720 + encodings.cp858 + encodings.hex_codec + encodings.quopri_codec + encodings.rot_13 + encodings.string_escape + encodings.uu_codec + encodings.zlib_codec + ensurepip + ensurepip.__main__ + ensurepip._uninstall + enum + exceptions + faulthandler + fpformat + future_builtins + gopherlib + hotshot + hotshot.log + hotshot.stats + hotshot.stones + htmlentitydefs + htmllib + httplib + idlelib.RstripExtension + idlelib.__main__ + idlelib.buildapp + idlelib.idle_test + idlelib.idle_test.htest + idlelib.idle_test.mock_idle + idlelib.idle_test.mock_tk + idlelib.idle_test.test_autocomplete + idlelib.idle_test.test_autoexpand + idlelib.idle_test.test_calltips + idlelib.idle_test.test_config_name + idlelib.idle_test.test_configdialog + idlelib.idle_test.test_delegator + idlelib.idle_test.test_formatparagraph + idlelib.idle_test.test_grep + idlelib.idle_test.test_hyperparser + idlelib.idle_test.test_idlehistory + idlelib.idle_test.test_parenmatch + idlelib.idle_test.test_pathbrowser + idlelib.idle_test.test_rstrip + idlelib.idle_test.test_searchdialogbase + idlelib.idle_test.test_searchengine + idlelib.idle_test.test_text + idlelib.idle_test.test_textview + idlelib.idle_test.test_warning + idlelib.idle_test.test_widgetredir + idlelib.tabpage + ihooks + importlib + importlib._bootstrap + importlib.abc + importlib.machinery + importlib.test + importlib.test.__main__ + importlib.test.abc + importlib.test.benchmark + importlib.test.builtin + importlib.test.builtin.test_finder + importlib.test.builtin.test_loader + importlib.test.builtin.util + importlib.test.extension + importlib.test.extension.test_case_sensitivity + importlib.test.extension.test_finder + importlib.test.extension.test_loader + importlib.test.extension.test_path_hook + importlib.test.extension.util + importlib.test.frozen + importlib.test.frozen.test_finder + importlib.test.frozen.test_loader + importlib.test.import_ + importlib.test.import_.test___package__ + importlib.test.import_.test_api + importlib.test.import_.test_caching + importlib.test.import_.test_fromlist + importlib.test.import_.test_meta_path + importlib.test.import_.test_packages + importlib.test.import_.test_path + importlib.test.import_.test_relative_imports + importlib.test.import_.util + importlib.test.regrtest + importlib.test.source + importlib.test.source.test_abc_loader + importlib.test.source.test_case_sensitivity + importlib.test.source.test_file_loader + importlib.test.source.test_finder + importlib.test.source.test_path_hook + importlib.test.source.test_source_encoding + importlib.test.source.util + importlib.test.test_abc + importlib.test.test_api + importlib.test.test_util + importlib.test.util + importlib.util + imputil + ipaddress + json.tests.test_check_circular + json.tests.test_tool + lib2to3.__main__ + lib2to3.btm_matcher + lib2to3.btm_utils + lib2to3.fixes.fix_asserts + lib2to3.fixes.fix_exitfunc + lib2to3.fixes.fix_operator + lib2to3.fixes.fix_reload + lib2to3.tests.__main__ + lib2to3.tests.test_main + linuxaudiodev + lzma + markupbase + md5 + mhlib + mimetools + mimify + multifile + multiprocessing.context + multiprocessing.forkserver + multiprocessing.popen_fork + multiprocessing.popen_forkserver + multiprocessing.popen_spawn_posix + multiprocessing.popen_spawn_win32 + multiprocessing.resource_sharer + multiprocessing.semaphore_tracker + multiprocessing.spawn + mutex + new + nis + ossaudiodev + pathlib + pcre + popen2 + posixfile + pre + pydoc_data + pydoc_data.topics + readline + reconvert + regex + regex_syntax + regsub + repr + rexec + rfc822 + robotparser + rotor + selectors + sets + sgmllib + sha + sqlite3.test.py25tests + sre + statcache + statistics + statvfs + stringold + strop + sunaudio + sysconfig + thread + timing + tkColorChooser + tkCommonDialog + tkFileDialog + tkFont + tkMessageBox + tkSimpleDialog + tkinter.__main__ + tkinter.test + tkinter.test.runtktests + tkinter.test.support + tkinter.test.test_tkinter + tkinter.test.test_tkinter.test_font + tkinter.test.test_tkinter.test_geometry_managers + tkinter.test.test_tkinter.test_images + tkinter.test.test_tkinter.test_loadtk + tkinter.test.test_tkinter.test_misc + tkinter.test.test_tkinter.test_text + tkinter.test.test_tkinter.test_variables + tkinter.test.test_tkinter.test_widgets + tkinter.test.test_ttk + tkinter.test.test_ttk.test_extensions + tkinter.test.test_ttk.test_functions + tkinter.test.test_ttk.test_style + tkinter.test.test_ttk.test_widgets + tkinter.test.widget_tests + tkinter.ttk + toaiff + tracemalloc + ttk + turtledemo + turtledemo.__main__ + turtledemo.bytedesign + turtledemo.chaos + turtledemo.clock + turtledemo.colormixer + turtledemo.forest + turtledemo.fractalcurves + turtledemo.lindenmayer + turtledemo.minimal_hanoi + turtledemo.nim + turtledemo.paint + turtledemo.peace + turtledemo.penrose + turtledemo.planet_and_moon + turtledemo.round_dance + turtledemo.sorting_animate + turtledemo.tree + turtledemo.two_canvases + turtledemo.wikipedia + turtledemo.yinyang + tzparse + unittest.__main__ + unittest.case + unittest.loader + unittest.main + unittest.mock + unittest.result + unittest.runner + unittest.signals + unittest.suite + unittest.test + unittest.test.__main__ + unittest.test._test_warnings + unittest.test.dummy + unittest.test.support + unittest.test.test_assertions + unittest.test.test_break + unittest.test.test_case + unittest.test.test_discovery + unittest.test.test_functiontestcase + unittest.test.test_loader + unittest.test.test_program + unittest.test.test_result + unittest.test.test_runner + unittest.test.test_setups + unittest.test.test_skipping + unittest.test.test_suite + unittest.test.testmock + unittest.test.testmock.__main__ + unittest.test.testmock.support + unittest.test.testmock.testcallable + unittest.test.testmock.testhelpers + unittest.test.testmock.testmagicmethods + unittest.test.testmock.testmock + unittest.test.testmock.testpatch + unittest.test.testmock.testsentinel + unittest.test.testmock.testwith + unittest.util + urllib2 + urlparse + user + venv + venv.__main__ + whichdb + whrandom + xmllib + xmlrpclib + xreadlines + xxlimited + zlib + BlockingIOError + BrokenPipeError + ChildProcessError + ConnectionAbortedError + ConnectionError + ConnectionRefusedError + ConnectionResetError + FileExistsError + FileNotFoundError + InterruptedError + IsADirectoryError + NotADirectoryError + OverflowWarning + PermissionError + ProcessLookupError + ResourceWarning + StandardError + TimeoutError + __loader__ + __spec__ + apply + basestring + buffer + callable + cmp + coerce + execfile + file + intern + long + raw_input + reduce + reload + unichr + unicode + xrange + + + BaseHTTPServer + Bastion + CDROM + CGIHTTPServer + Canvas + ConfigParser + Cookie + DLFCN + Dialog + DocXMLRPCServer + FCNTL + FileDialog + FixTk + HTMLParser + MimeWriter + Queue + ScrolledText + SimpleDialog + SimpleHTTPServer + SimpleXMLRPCServer + SocketServer + StringIO + TERMIOS + TYPES + Tix + Tkconstants + Tkdnd + Tkinter + UserDict + UserList + UserString + _LWPCookieJar + _MozillaCookieJar + __builtin__ + _bootlocale + _bytesio + _collections_abc + _crypt + _datetime + _decimal + _fileio + _hotshot + _imp + _md5 + _opcode + _operator + _osx_support + _posixsubprocess + _pydecimal + _sha + _sha1 + _sha256 + _sha512 + _signal + _sitebuiltins + _stat + _string + _stringio + _sysconfigdata + _testbuffer + _testimportmultiple + _tracemalloc + _types + anydbm + argparse + asyncio + asyncio.base_events + asyncio.base_subprocess + asyncio.constants + asyncio.coroutines + asyncio.events + asyncio.futures + asyncio.locks + asyncio.log + asyncio.proactor_events + asyncio.protocols + asyncio.queues + asyncio.selector_events + asyncio.sslproto + asyncio.streams + asyncio.subprocess + asyncio.tasks + asyncio.test_utils + asyncio.transports + asyncio.unix_events + asyncio.windows_events + asyncio.windows_utils + audiodev + bsddb + bsddb.db + bsddb.dbobj + bsddb.dbrecio + bsddb.dbshelve + bsddb.dbtables + bsddb.dbutils + bsddb.test + bsddb.test.test_1413192 + bsddb.test.test_all + bsddb.test.test_associate + bsddb.test.test_basics + bsddb.test.test_compare + bsddb.test.test_compat + bsddb.test.test_cursor_pget_bug + bsddb.test.test_db + bsddb.test.test_dbenv + bsddb.test.test_dbobj + bsddb.test.test_dbshelve + bsddb.test.test_dbtables + bsddb.test.test_distributed_transactions + bsddb.test.test_early_close + bsddb.test.test_env_close + bsddb.test.test_fileid + bsddb.test.test_get_none + bsddb.test.test_join + bsddb.test.test_lock + bsddb.test.test_misc + bsddb.test.test_pickle + bsddb.test.test_queue + bsddb.test.test_recno + bsddb.test.test_replication + bsddb.test.test_sequence + bsddb.test.test_thread + build_class + bz2 + cPickle + cStringIO + collections.__main__ + collections.abc + commands + compiler + compiler.ast + compiler.consts + compiler.future + compiler.misc + compiler.pyassem + compiler.pycodegen + compiler.symbols + compiler.syntax + compiler.transformer + compiler.visitor + concurrent + concurrent.futures + concurrent.futures._base + concurrent.futures.process + concurrent.futures.thread + cookielib + copy_reg + crypt_failed + ctypes.test.__main__ + ctypes.test.test_wintypes + dbhash + dircache + distutils.mwerkscompiler + distutils.tests.setuptools_build_ext + distutils.tests.setuptools_extension + distutils.tests.test_bdist_msi + distutils.tests.test_build + distutils.tests.test_ccompiler + distutils.tests.test_dep_util + dumbdbm + dummy_thread + email.Charset + email.Encoders + email.Errors + email.FeedParser + email.Generator + email.Header + email.Iterators + email.MIMEAudio + email.MIMEBase + email.MIMEImage + email.MIMEMessage + email.MIMEMultipart + email.MIMENonMultipart + email.MIMEText + email.Message + email.Parser + email.Utils + email._compat21 + email._compat22 + email._encoded_words + email._header_value_parser + email._policybase + email.base64MIME + email.contentmanager + email.headerregistry + email.policy + email.quopriMIME + email.test.test_email_codecs_renamed + email.test.test_email_renamed + encodings.base64_codec + encodings.bz2_codec + encodings.cp1125 + encodings.cp273 + encodings.cp65001 + encodings.cp720 + encodings.cp858 + encodings.hex_codec + encodings.quopri_codec + encodings.rot_13 + encodings.string_escape + encodings.uu_codec + encodings.zlib_codec + ensurepip + ensurepip.__main__ + ensurepip._uninstall + enum + exceptions + faulthandler + fpformat + future_builtins + gopherlib + hotshot + hotshot.log + hotshot.stats + hotshot.stones + htmlentitydefs + htmllib + httplib + idlelib.__main__ + idlelib.buildapp + idlelib.idle_test + idlelib.idle_test.htest + idlelib.idle_test.mock_idle + idlelib.idle_test.mock_tk + idlelib.idle_test.test_autocomplete + idlelib.idle_test.test_autoexpand + idlelib.idle_test.test_calltips + idlelib.idle_test.test_config_name + idlelib.idle_test.test_configdialog + idlelib.idle_test.test_delegator + idlelib.idle_test.test_formatparagraph + idlelib.idle_test.test_grep + idlelib.idle_test.test_hyperparser + idlelib.idle_test.test_idlehistory + idlelib.idle_test.test_parenmatch + idlelib.idle_test.test_pathbrowser + idlelib.idle_test.test_rstrip + idlelib.idle_test.test_searchdialogbase + idlelib.idle_test.test_searchengine + idlelib.idle_test.test_text + idlelib.idle_test.test_textview + idlelib.idle_test.test_warning + idlelib.idle_test.test_widgetredir + idlelib.tabpage + ihooks + importlib.test.__main__ + importlib.test.import_.test_api + importlib.test.regrtest + imputil + ipaddress + json.tests.test_check_circular + json.tests.test_tool + lib2to3.__main__ + lib2to3.fixes.fix_asserts + lib2to3.fixes.fix_reload + lib2to3.tests.__main__ + linuxaudiodev + lzma + markupbase + md5 + mhlib + mimetools + mimify + multifile + multiprocessing.context + multiprocessing.forkserver + multiprocessing.popen_fork + multiprocessing.popen_forkserver + multiprocessing.popen_spawn_posix + multiprocessing.popen_spawn_win32 + multiprocessing.resource_sharer + multiprocessing.semaphore_tracker + multiprocessing.spawn + mutex + new + nis_failed + ossaudiodev + pathlib + pcre + popen2 + posixfile + pre + pydoc_topics + readline + reconvert + regex + regex_syntax + regsub + repr + rexec + rfc822 + robotparser + rotor + selectors + sets + sgmllib + sha + sqlite3.test.py25tests + sre + statcache + statistics + statvfs + stringold + strop + sunaudio + sysconfig + thread + timing + tkColorChooser + tkCommonDialog + tkFileDialog + tkFont + tkMessageBox + tkSimpleDialog + tkinter.__main__ + tkinter.test.test_tkinter.test_font + tkinter.test.test_tkinter.test_geometry_managers + tkinter.test.test_tkinter.test_images + tkinter.test.test_tkinter.test_misc + tkinter.test.test_tkinter.test_variables + tkinter.test.test_tkinter.test_widgets + tkinter.test.widget_tests + toaiff + tracemalloc + ttk + turtledemo + turtledemo.__main__ + turtledemo.bytedesign + turtledemo.chaos + turtledemo.clock + turtledemo.colormixer + turtledemo.forest + turtledemo.fractalcurves + turtledemo.lindenmayer + turtledemo.minimal_hanoi + turtledemo.nim + turtledemo.paint + turtledemo.peace + turtledemo.penrose + turtledemo.planet_and_moon + turtledemo.round_dance + turtledemo.sorting_animate + turtledemo.tree + turtledemo.two_canvases + turtledemo.wikipedia + turtledemo.yinyang + tzparse + unittest.__main__ + unittest.case + unittest.loader + unittest.main + unittest.mock + unittest.result + unittest.runner + unittest.signals + unittest.suite + unittest.test + unittest.test.__main__ + unittest.test._test_warnings + unittest.test.dummy + unittest.test.support + unittest.test.test_assertions + unittest.test.test_break + unittest.test.test_case + unittest.test.test_discovery + unittest.test.test_functiontestcase + unittest.test.test_loader + unittest.test.test_program + unittest.test.test_result + unittest.test.test_runner + unittest.test.test_setups + unittest.test.test_skipping + unittest.test.test_suite + unittest.test.testmock + unittest.test.testmock.__main__ + unittest.test.testmock.support + unittest.test.testmock.testcallable + unittest.test.testmock.testhelpers + unittest.test.testmock.testmagicmethods + unittest.test.testmock.testmock + unittest.test.testmock.testpatch + unittest.test.testmock.testsentinel + unittest.test.testmock.testwith + unittest.util + urllib2 + urlparse + user + venv + venv.__main__ + whichdb + whrandom + xmllib + xmlrpclib + xreadlines + xxlimited + BlockingIOError + BrokenPipeError + ChildProcessError + ConnectionAbortedError + ConnectionError + ConnectionRefusedError + ConnectionResetError + FileExistsError + FileNotFoundError + InterruptedError + IsADirectoryError + NotADirectoryError + OverflowWarning + PermissionError + ProcessLookupError + ResourceWarning + StandardError + TimeoutError + __loader__ + __spec__ + apply + basestring + buffer + callable + cmp + coerce + execfile + file + intern + long + raw_input + reduce + reload + unichr + unicode + xrange + + + BaseHTTPServer + Bastion + CGIHTTPServer + Canvas + ConfigParser + Cookie + Dialog + DocXMLRPCServer + FCNTL + FileDialog + FixTk + HTMLParser + MimeWriter + Queue + ScrolledText + SimpleDialog + SimpleHTTPServer + SimpleXMLRPCServer + SocketServer + StringIO + TERMIOS + Tix + Tkconstants + Tkdnd + Tkinter + UserDict + UserList + UserString + _LWPCookieJar + _MozillaCookieJar + __builtin__ + _bootlocale + _bytesio + _collections_abc + _crypt + _decimal + _fileio + _hotshot + _imp + _md5 + _opcode + _operator + _pydecimal + _sha + _sha1 + _sha256 + _sha512 + _signal + _sitebuiltins + _stat + _stringio + _sysconfigdata + _testbuffer + _testimportmultiple + _tracemalloc + _types + anydbm + asyncio + asyncio.base_events + asyncio.base_subprocess + asyncio.constants + asyncio.coroutines + asyncio.events + asyncio.futures + asyncio.locks + asyncio.log + asyncio.proactor_events + asyncio.protocols + asyncio.queues + asyncio.selector_events + asyncio.sslproto + asyncio.streams + asyncio.subprocess + asyncio.tasks + asyncio.test_utils + asyncio.transports + asyncio.unix_events + asyncio.windows_events + asyncio.windows_utils + audiodev + bsddb + bsddb.db + bsddb.dbobj + bsddb.dbrecio + bsddb.dbshelve + bsddb.dbtables + bsddb.dbutils + bsddb.test + bsddb.test.test_1413192 + bsddb.test.test_all + bsddb.test.test_associate + bsddb.test.test_basics + bsddb.test.test_compare + bsddb.test.test_compat + bsddb.test.test_cursor_pget_bug + bsddb.test.test_db + bsddb.test.test_dbenv + bsddb.test.test_dbobj + bsddb.test.test_dbshelve + bsddb.test.test_dbtables + bsddb.test.test_distributed_transactions + bsddb.test.test_early_close + bsddb.test.test_env_close + bsddb.test.test_fileid + bsddb.test.test_get_none + bsddb.test.test_join + bsddb.test.test_lock + bsddb.test.test_misc + bsddb.test.test_pickle + bsddb.test.test_queue + bsddb.test.test_recno + bsddb.test.test_replication + bsddb.test.test_sequence + bsddb.test.test_thread + build_class + bz2 + cPickle + cStringIO + collections.__main__ + collections.abc + commands + compiler + compiler.ast + compiler.consts + compiler.future + compiler.misc + compiler.pyassem + compiler.pycodegen + compiler.symbols + compiler.syntax + compiler.transformer + compiler.visitor + cookielib + copy_reg + crypt_failed + ctypes.test.__main__ + ctypes.test.test_wintypes + dbhash + dircache + distutils.mwerkscompiler + distutils.tests.setuptools_build_ext + distutils.tests.setuptools_extension + distutils.tests.test_ccompiler + dumbdbm + dummy_thread + email.Charset + email.Encoders + email.Errors + email.FeedParser + email.Generator + email.Header + email.Iterators + email.MIMEAudio + email.MIMEBase + email.MIMEImage + email.MIMEMessage + email.MIMEMultipart + email.MIMENonMultipart + email.MIMEText + email.Message + email.Parser + email.Utils + email._compat21 + email._compat22 + email._encoded_words + email._header_value_parser + email._policybase + email.base64MIME + email.contentmanager + email.headerregistry + email.policy + email.quopriMIME + email.test.test_email_codecs_renamed + email.test.test_email_renamed + encodings.cp1125 + encodings.cp273 + encodings.cp65001 + encodings.string_escape + ensurepip + ensurepip.__main__ + ensurepip._uninstall + enum + exceptions + faulthandler + fpformat + future_builtins + gopherlib + hotshot + hotshot.log + hotshot.stats + hotshot.stones + htmlentitydefs + htmllib + httplib + idlelib.__main__ + idlelib.buildapp + idlelib.idle_test + idlelib.idle_test.htest + idlelib.idle_test.mock_idle + idlelib.idle_test.mock_tk + idlelib.idle_test.test_autocomplete + idlelib.idle_test.test_autoexpand + idlelib.idle_test.test_calltips + idlelib.idle_test.test_config_name + idlelib.idle_test.test_configdialog + idlelib.idle_test.test_delegator + idlelib.idle_test.test_formatparagraph + idlelib.idle_test.test_grep + idlelib.idle_test.test_hyperparser + idlelib.idle_test.test_idlehistory + idlelib.idle_test.test_parenmatch + idlelib.idle_test.test_pathbrowser + idlelib.idle_test.test_rstrip + idlelib.idle_test.test_searchdialogbase + idlelib.idle_test.test_searchengine + idlelib.idle_test.test_text + idlelib.idle_test.test_textview + idlelib.idle_test.test_warning + idlelib.idle_test.test_widgetredir + idlelib.tabpage + ihooks + imputil + ipaddress + json.tests + json.tests.test_check_circular + json.tests.test_decode + json.tests.test_default + json.tests.test_dump + json.tests.test_encode_basestring_ascii + json.tests.test_fail + json.tests.test_float + json.tests.test_indent + json.tests.test_pass1 + json.tests.test_pass2 + json.tests.test_pass3 + json.tests.test_recursion + json.tests.test_scanstring + json.tests.test_separators + json.tests.test_speedups + json.tests.test_tool + json.tests.test_unicode + lib2to3.__main__ + lib2to3.fixes.fix_asserts + lib2to3.fixes.fix_reload + lib2to3.tests.__main__ + linuxaudiodev + lzma + markupbase + md5 + mhlib + mimetools + mimify + multifile + multiprocessing.context + multiprocessing.forkserver + multiprocessing.popen_fork + multiprocessing.popen_forkserver + multiprocessing.popen_spawn_posix + multiprocessing.popen_spawn_win32 + multiprocessing.resource_sharer + multiprocessing.semaphore_tracker + multiprocessing.spawn + mutex + new + nis_failed + pathlib + pcre + popen2 + posixfile + pre + pydoc_topics + readline + reconvert + regex + regex_syntax + regsub + repr + rexec + rfc822 + robotparser + rotor + selectors + sets + sgmllib + sha + sqlite3.test.py25tests + sre + statcache + statistics + statvfs + stringold + strop + sunaudio + thread + timing + tkColorChooser + tkCommonDialog + tkFileDialog + tkFont + tkMessageBox + tkSimpleDialog + tkinter.test.test_tkinter.test_geometry_managers + tkinter.test.test_tkinter.test_images + tkinter.test.test_tkinter.test_variables + tkinter.test.test_tkinter.test_widgets + tkinter.test.widget_tests + toaiff + tracemalloc + ttk + turtledemo.sorting_animate + tzparse + unittest.mock + unittest.test.__main__ + unittest.test.testmock + unittest.test.testmock.__main__ + unittest.test.testmock.support + unittest.test.testmock.testcallable + unittest.test.testmock.testhelpers + unittest.test.testmock.testmagicmethods + unittest.test.testmock.testmock + unittest.test.testmock.testpatch + unittest.test.testmock.testsentinel + unittest.test.testmock.testwith + urllib2 + urlparse + user + venv + venv.__main__ + whichdb + whrandom + xmllib + xmlrpclib + xreadlines + xxlimited + BlockingIOError + BrokenPipeError + ChildProcessError + ConnectionAbortedError + ConnectionError + ConnectionRefusedError + ConnectionResetError + FileExistsError + FileNotFoundError + InterruptedError + IsADirectoryError + NotADirectoryError + OverflowWarning + PermissionError + ProcessLookupError + StandardError + TimeoutError + __loader__ + __spec__ + apply + basestring + buffer + cmp + coerce + execfile + file + intern + long + raw_input + reduce + reload + unichr + unicode + xrange + + + BaseHTTPServer + Bastion + CGIHTTPServer + Canvas + ConfigParser + Cookie + Dialog + DocXMLRPCServer + FCNTL + FileDialog + FixTk + HTMLParser + MimeWriter + Queue + ScrolledText + SimpleDialog + SimpleHTTPServer + SimpleXMLRPCServer + SocketServer + StringIO + TERMIOS + Tix + Tkconstants + Tkdnd + Tkinter + UserDict + UserList + UserString + _LWPCookieJar + _MozillaCookieJar + __builtin__ + __main__ + _abcoll + _bootlocale + _bytesio + _collections_abc + _fileio + _hotshot + _opcode + _operator + _pydecimal + _sha + _signal + _sitebuiltins + _stat + _stringio + _testimportmultiple + _tracemalloc + _types + anydbm + asyncio + asyncio.base_events + asyncio.base_subprocess + asyncio.constants + asyncio.coroutines + asyncio.events + asyncio.futures + asyncio.locks + asyncio.log + asyncio.proactor_events + asyncio.protocols + asyncio.queues + asyncio.selector_events + asyncio.sslproto + asyncio.streams + asyncio.subprocess + asyncio.tasks + asyncio.test_utils + asyncio.transports + asyncio.unix_events + asyncio.windows_events + asyncio.windows_utils + audiodev + bsddb + bsddb.db + bsddb.dbobj + bsddb.dbrecio + bsddb.dbshelve + bsddb.dbtables + bsddb.dbutils + bsddb.test + bsddb.test.test_1413192 + bsddb.test.test_all + bsddb.test.test_associate + bsddb.test.test_basics + bsddb.test.test_compare + bsddb.test.test_compat + bsddb.test.test_cursor_pget_bug + bsddb.test.test_db + bsddb.test.test_dbenv + bsddb.test.test_dbobj + bsddb.test.test_dbshelve + bsddb.test.test_dbtables + bsddb.test.test_distributed_transactions + bsddb.test.test_early_close + bsddb.test.test_env_close + bsddb.test.test_fileid + bsddb.test.test_get_none + bsddb.test.test_join + bsddb.test.test_lock + bsddb.test.test_misc + bsddb.test.test_pickle + bsddb.test.test_queue + bsddb.test.test_recno + bsddb.test.test_replication + bsddb.test.test_sequence + bsddb.test.test_thread + build_class + cPickle + cStringIO + commands + compiler + compiler.ast + compiler.consts + compiler.future + compiler.misc + compiler.pyassem + compiler.pycodegen + compiler.symbols + compiler.syntax + compiler.transformer + compiler.visitor + cookielib + copy_reg + crypt_failed + ctypes.test.__main__ + curses.wrapper + dbhash + dircache + distutils.mwerkscompiler + distutils.tests.setuptools_build_ext + distutils.tests.setuptools_extension + distutils.tests.test_ccompiler + dumbdbm + dummy_thread + email.Charset + email.Encoders + email.Errors + email.FeedParser + email.Generator + email.Header + email.Iterators + email.MIMEAudio + email.MIMEBase + email.MIMEImage + email.MIMEMessage + email.MIMEMultipart + email.MIMENonMultipart + email.MIMEText + email.Message + email.Parser + email.Utils + email._compat21 + email._compat22 + email.base64MIME + email.contentmanager + email.quopriMIME + email.test + email.test.test_email + email.test.test_email_codecs + email.test.test_email_codecs_renamed + email.test.test_email_renamed + email.test.test_email_torture + encodings.cp1125 + encodings.cp273 + encodings.string_escape + ensurepip + ensurepip.__main__ + ensurepip._uninstall + enum + exceptions + fpformat + future_builtins + gopherlib + hotshot + hotshot.log + hotshot.stats + hotshot.stones + htmlentitydefs + htmllib + httplib + idlelib.buildapp + idlelib.idle_test.htest + idlelib.idle_test.test_autocomplete + idlelib.idle_test.test_autoexpand + idlelib.idle_test.test_configdialog + idlelib.idle_test.test_hyperparser + idlelib.idle_test.test_parenmatch + idlelib.idle_test.test_searchdialogbase + idlelib.idle_test.test_textview + idlelib.idle_test.test_widgetredir + idlelib.tabpage + ihooks + importlib.test + importlib.test.__main__ + importlib.test.abc + importlib.test.benchmark + importlib.test.builtin + importlib.test.builtin.test_finder + importlib.test.builtin.test_loader + importlib.test.builtin.util + importlib.test.extension + importlib.test.extension.test_case_sensitivity + importlib.test.extension.test_finder + importlib.test.extension.test_loader + importlib.test.extension.test_path_hook + importlib.test.extension.util + importlib.test.frozen + importlib.test.frozen.test_finder + importlib.test.frozen.test_loader + importlib.test.import_ + importlib.test.import_.test___package__ + importlib.test.import_.test_api + importlib.test.import_.test_caching + importlib.test.import_.test_fromlist + importlib.test.import_.test_meta_path + importlib.test.import_.test_packages + importlib.test.import_.test_path + importlib.test.import_.test_relative_imports + importlib.test.import_.util + importlib.test.regrtest + importlib.test.source + importlib.test.source.test_abc_loader + importlib.test.source.test_case_sensitivity + importlib.test.source.test_file_loader + importlib.test.source.test_finder + importlib.test.source.test_path_hook + importlib.test.source.test_source_encoding + importlib.test.source.util + importlib.test.test_abc + importlib.test.test_api + importlib.test.test_util + importlib.test.util + imputil + json.tests + json.tests.test_check_circular + json.tests.test_decode + json.tests.test_default + json.tests.test_dump + json.tests.test_encode_basestring_ascii + json.tests.test_fail + json.tests.test_float + json.tests.test_indent + json.tests.test_pass1 + json.tests.test_pass2 + json.tests.test_pass3 + json.tests.test_recursion + json.tests.test_scanstring + json.tests.test_separators + json.tests.test_speedups + json.tests.test_tool + json.tests.test_unicode + lib2to3.fixes.fix_asserts + lib2to3.fixes.fix_reload + lib2to3.tests.__main__ + linuxaudiodev + markupbase + md5 + mhlib + mimetools + mimify + multifile + multiprocessing.context + multiprocessing.forkserver + multiprocessing.popen_fork + multiprocessing.popen_forkserver + multiprocessing.popen_spawn_posix + multiprocessing.popen_spawn_win32 + multiprocessing.resource_sharer + multiprocessing.semaphore_tracker + multiprocessing.spawn + mutex + new + nis_failed + pathlib + pcre + popen2 + posixfile + pre + pydoc_topics + reconvert + regex + regex_syntax + regsub + repr + rexec + rfc822 + robotparser + rotor + selectors + sets + sgmllib + sha + sqlite3.test.py25tests + sre + statcache + statistics + statvfs + stringold + strop + sunaudio + thread + timing + tkColorChooser + tkCommonDialog + tkFileDialog + tkFont + tkMessageBox + tkSimpleDialog + tkinter.test.test_tkinter.test_geometry_managers + tkinter.test.test_tkinter.test_images + toaiff + tracemalloc + ttk + turtledemo.sorting_animate + tzparse + unittest.test.__main__ + unittest.test.testmock.__main__ + urllib2 + urlparse + user + whichdb + whrandom + xmllib + xmlrpclib + xreadlines + OverflowWarning + StandardError + __spec__ + apply + basestring + buffer + cmp + coerce + execfile + file + intern + long + raw_input + reduce + reload + unichr + unicode + xrange + + + BaseHTTPServer + Bastion + CGIHTTPServer + Canvas + ConfigParser + Cookie + Dialog + DocXMLRPCServer + FCNTL + FileDialog + FixTk + HTMLParser + MimeWriter + Queue + ScrolledText + SimpleDialog + SimpleHTTPServer + SimpleXMLRPCServer + SocketServer + StringIO + TERMIOS + Tix + Tkconstants + Tkdnd + Tkinter + UserDict + UserList + UserString + _LWPCookieJar + _MozillaCookieJar + __builtin__ + __main__ + _abcoll + _bytesio + _fileio + _hotshot + _pydecimal + _sha + _signal + _stringio + _types + anydbm + asyncio.coroutines + asyncio.sslproto + audiodev + bsddb + bsddb.db + bsddb.dbobj + bsddb.dbrecio + bsddb.dbshelve + bsddb.dbtables + bsddb.dbutils + bsddb.test + bsddb.test.test_1413192 + bsddb.test.test_all + bsddb.test.test_associate + bsddb.test.test_basics + bsddb.test.test_compare + bsddb.test.test_compat + bsddb.test.test_cursor_pget_bug + bsddb.test.test_db + bsddb.test.test_dbenv + bsddb.test.test_dbobj + bsddb.test.test_dbshelve + bsddb.test.test_dbtables + bsddb.test.test_distributed_transactions + bsddb.test.test_early_close + bsddb.test.test_env_close + bsddb.test.test_fileid + bsddb.test.test_get_none + bsddb.test.test_join + bsddb.test.test_lock + bsddb.test.test_misc + bsddb.test.test_pickle + bsddb.test.test_queue + bsddb.test.test_recno + bsddb.test.test_replication + bsddb.test.test_sequence + bsddb.test.test_thread + build_class + cPickle + cStringIO + commands + compiler + compiler.ast + compiler.consts + compiler.future + compiler.misc + compiler.pyassem + compiler.pycodegen + compiler.symbols + compiler.syntax + compiler.transformer + compiler.visitor + cookielib + copy_reg + crypt_failed + ctypes.test.__main__ + curses.wrapper + dbhash + dircache + distutils.emxccompiler + distutils.mwerkscompiler + distutils.tests.setuptools_build_ext + distutils.tests.setuptools_extension + distutils.tests.test_ccompiler + dumbdbm + dummy_thread + email.Charset + email.Encoders + email.Errors + email.FeedParser + email.Generator + email.Header + email.Iterators + email.MIMEAudio + email.MIMEBase + email.MIMEImage + email.MIMEMessage + email.MIMEMultipart + email.MIMENonMultipart + email.MIMEText + email.Message + email.Parser + email.Utils + email._compat21 + email._compat22 + email.base64MIME + email.quopriMIME + email.test + email.test.test_email + email.test.test_email_codecs + email.test.test_email_codecs_renamed + email.test.test_email_renamed + email.test.test_email_torture + encodings.string_escape + exceptions + fpformat + future_builtins + gopherlib + hotshot + hotshot.log + hotshot.stats + hotshot.stones + htmlentitydefs + htmllib + httplib + idlelib.buildapp + idlelib.idle_test.test_autocomplete + idlelib.idle_test.test_autoexpand + idlelib.idle_test.test_configdialog + idlelib.idle_test.test_hyperparser + idlelib.idle_test.test_parenmatch + idlelib.idle_test.test_searchdialogbase + idlelib.idle_test.test_textview + idlelib.idle_test.test_widgetredir + idlelib.tabpage + ihooks + importlib.test + importlib.test.__main__ + importlib.test.abc + importlib.test.benchmark + importlib.test.builtin + importlib.test.builtin.test_finder + importlib.test.builtin.test_loader + importlib.test.builtin.util + importlib.test.extension + importlib.test.extension.test_case_sensitivity + importlib.test.extension.test_finder + importlib.test.extension.test_loader + importlib.test.extension.test_path_hook + importlib.test.extension.util + importlib.test.frozen + importlib.test.frozen.test_finder + importlib.test.frozen.test_loader + importlib.test.import_ + importlib.test.import_.test___package__ + importlib.test.import_.test_api + importlib.test.import_.test_caching + importlib.test.import_.test_fromlist + importlib.test.import_.test_meta_path + importlib.test.import_.test_packages + importlib.test.import_.test_path + importlib.test.import_.test_relative_imports + importlib.test.import_.util + importlib.test.regrtest + importlib.test.source + importlib.test.source.test_abc_loader + importlib.test.source.test_case_sensitivity + importlib.test.source.test_file_loader + importlib.test.source.test_finder + importlib.test.source.test_path_hook + importlib.test.source.test_source_encoding + importlib.test.source.util + importlib.test.test_abc + importlib.test.test_api + importlib.test.test_util + importlib.test.util + imputil + json.tests + json.tests.test_check_circular + json.tests.test_decode + json.tests.test_default + json.tests.test_dump + json.tests.test_encode_basestring_ascii + json.tests.test_fail + json.tests.test_float + json.tests.test_indent + json.tests.test_pass1 + json.tests.test_pass2 + json.tests.test_pass3 + json.tests.test_recursion + json.tests.test_scanstring + json.tests.test_separators + json.tests.test_speedups + json.tests.test_tool + json.tests.test_unicode + lib2to3.tests.__main__ + linuxaudiodev + markupbase + md5 + mhlib + mimetools + mimify + multifile + multiprocessing.forking + mutex + new + nis_failed + os2emxpath + pcre + popen2 + posixfile + pre + pydoc_topics + reconvert + regex + regex_syntax + regsub + repr + rexec + rfc822 + robotparser + rotor + sets + sgmllib + sha + sqlite3.test.py25tests + sre + statcache + statvfs + stringold + strop + sunaudio + thread + timing + tkColorChooser + tkCommonDialog + tkFileDialog + tkFont + tkMessageBox + tkSimpleDialog + tkinter.test.test_tkinter.test_images + toaiff + ttk + turtledemo.sorting_animate + tzparse + urllib2 + urlparse + user + whichdb + whrandom + xmllib + xmlrpclib + xreadlines + OverflowWarning + StandardError + apply + basestring + buffer + cmp + coerce + execfile + file + intern + long + raw_input + reduce + reload + unichr + unicode + xrange + + + BaseHTTPServer + Bastion + CGIHTTPServer + Canvas + ConfigParser + Cookie + Dialog + DocXMLRPCServer + FCNTL + FileDialog + FixTk + HTMLParser + MimeWriter + Queue + ScrolledText + SimpleDialog + SimpleHTTPServer + SimpleXMLRPCServer + SocketServer + StringIO + TERMIOS + Tix + Tkconstants + Tkdnd + Tkinter + UserDict + UserList + UserString + _LWPCookieJar + _MozillaCookieJar + __builtin__ + __main__ + _abcoll + _bytesio + _fileio + _hotshot + _sha + _stringio + _types + anydbm + audiodev + bsddb + bsddb.db + bsddb.dbobj + bsddb.dbrecio + bsddb.dbshelve + bsddb.dbtables + bsddb.dbutils + bsddb.test + bsddb.test.test_1413192 + bsddb.test.test_all + bsddb.test.test_associate + bsddb.test.test_basics + bsddb.test.test_compare + bsddb.test.test_compat + bsddb.test.test_cursor_pget_bug + bsddb.test.test_db + bsddb.test.test_dbenv + bsddb.test.test_dbobj + bsddb.test.test_dbshelve + bsddb.test.test_dbtables + bsddb.test.test_distributed_transactions + bsddb.test.test_early_close + bsddb.test.test_env_close + bsddb.test.test_fileid + bsddb.test.test_get_none + bsddb.test.test_join + bsddb.test.test_lock + bsddb.test.test_misc + bsddb.test.test_pickle + bsddb.test.test_queue + bsddb.test.test_recno + bsddb.test.test_replication + bsddb.test.test_sequence + bsddb.test.test_thread + build_class + cPickle + cStringIO + commands + compiler + compiler.ast + compiler.consts + compiler.future + compiler.misc + compiler.pyassem + compiler.pycodegen + compiler.symbols + compiler.syntax + compiler.transformer + compiler.visitor + cookielib + copy_reg + crypt_failed + ctypes.test.runtests + ctypes.test.test_errcheck + ctypes.test.test_integers + curses.wrapper + dbhash + dircache + distutils.emxccompiler + distutils.mwerkscompiler + distutils.tests.setuptools_build_ext + distutils.tests.setuptools_extension + distutils.tests.test_ccompiler + dumbdbm + dummy_thread + email.Charset + email.Encoders + email.Errors + email.FeedParser + email.Generator + email.Header + email.Iterators + email.MIMEAudio + email.MIMEBase + email.MIMEImage + email.MIMEMessage + email.MIMEMultipart + email.MIMENonMultipart + email.MIMEText + email.Message + email.Parser + email.Utils + email._compat21 + email._compat22 + email.base64MIME + email.quopriMIME + email.test + email.test.test_email + email.test.test_email_codecs + email.test.test_email_codecs_renamed + email.test.test_email_renamed + email.test.test_email_torture + encodings.string_escape + exceptions + fpformat + future_builtins + gopherlib + hotshot + hotshot.log + hotshot.stats + hotshot.stones + htmlentitydefs + htmllib + httplib + idlelib.buildapp + idlelib.tabpage + idlelib.testcode + ihooks + importlib.test + importlib.test.__main__ + importlib.test.abc + importlib.test.benchmark + importlib.test.builtin + importlib.test.builtin.test_finder + importlib.test.builtin.test_loader + importlib.test.builtin.util + importlib.test.extension + importlib.test.extension.test_case_sensitivity + importlib.test.extension.test_finder + importlib.test.extension.test_loader + importlib.test.extension.test_path_hook + importlib.test.extension.util + importlib.test.frozen + importlib.test.frozen.test_finder + importlib.test.frozen.test_loader + importlib.test.import_ + importlib.test.import_.test___package__ + importlib.test.import_.test_api + importlib.test.import_.test_caching + importlib.test.import_.test_fromlist + importlib.test.import_.test_meta_path + importlib.test.import_.test_packages + importlib.test.import_.test_path + importlib.test.import_.test_relative_imports + importlib.test.import_.util + importlib.test.regrtest + importlib.test.source + importlib.test.source.test_abc_loader + importlib.test.source.test_case_sensitivity + importlib.test.source.test_file_loader + importlib.test.source.test_finder + importlib.test.source.test_path_hook + importlib.test.source.test_source_encoding + importlib.test.source.util + importlib.test.test_abc + importlib.test.test_api + importlib.test.test_util + importlib.test.util + imputil + json.tests + json.tests.test_check_circular + json.tests.test_decode + json.tests.test_default + json.tests.test_dump + json.tests.test_encode_basestring_ascii + json.tests.test_fail + json.tests.test_float + json.tests.test_indent + json.tests.test_pass1 + json.tests.test_pass2 + json.tests.test_pass3 + json.tests.test_recursion + json.tests.test_scanstring + json.tests.test_separators + json.tests.test_speedups + json.tests.test_tool + json.tests.test_unicode + linuxaudiodev + markupbase + md5 + mhlib + mimetools + mimify + multifile + multiprocessing.forking + mutex + new + nis_failed + os2emxpath + pcre + popen2 + posixfile + pre + pydoc_topics + reconvert + regex + regex_syntax + regsub + repr + rexec + rfc822 + robotparser + rotor + sets + sgmllib + sha + sqlite3.test.py25tests + sre + statcache + statvfs + stringold + strop + sunaudio + thread + timing + tkColorChooser + tkCommonDialog + tkFileDialog + tkFont + tkMessageBox + tkSimpleDialog + toaiff + ttk + tzparse + urllib2 + urlparse + user + whichdb + whrandom + xmllib + xmlrpclib + xreadlines + OverflowWarning + StandardError + apply + basestring + buffer + cmp + coerce + execfile + file + intern + long + raw_input + reduce + reload + unichr + unicode + xrange + + diff --git a/python/psi-api/src/com/jetbrains/python/psi/LanguageLevel.java b/python/psi-api/src/com/jetbrains/python/psi/LanguageLevel.java index 8229dfdd43df..1c56c2b60f3d 100644 --- a/python/psi-api/src/com/jetbrains/python/psi/LanguageLevel.java +++ b/python/psi-api/src/com/jetbrains/python/psi/LanguageLevel.java @@ -15,11 +15,14 @@ */ package com.jetbrains.python.psi; +import com.google.common.collect.ImmutableList; import com.intellij.openapi.util.Key; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import org.jetbrains.annotations.NotNull; +import java.util.List; + /** * @author yole */ @@ -35,6 +38,19 @@ public enum LanguageLevel { PYTHON34(34, true, false, true, true), PYTHON35(35, true, false, true, true); + public static List ALL_LEVELS = ImmutableList.builder() + .add(PYTHON24) + .add(PYTHON25) + .add(PYTHON26) + .add(PYTHON27) + .add(PYTHON30) + .add(PYTHON31) + .add(PYTHON32) + .add(PYTHON33) + .add(PYTHON34) + .add(PYTHON35) + .build(); + private static LanguageLevel DEFAULT2 = PYTHON27; private static LanguageLevel DEFAULT3 = PYTHON34; diff --git a/python/src/com/jetbrains/numpy/codeInsight/NumpyDocStringTypeProvider.java b/python/src/com/jetbrains/numpy/codeInsight/NumpyDocStringTypeProvider.java index 2d6dcb6a7379..bcd87f4fcb16 100644 --- a/python/src/com/jetbrains/numpy/codeInsight/NumpyDocStringTypeProvider.java +++ b/python/src/com/jetbrains/numpy/codeInsight/NumpyDocStringTypeProvider.java @@ -15,12 +15,15 @@ */ package com.jetbrains.numpy.codeInsight; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.jetbrains.numpy.documentation.NumPyDocString; import com.jetbrains.numpy.documentation.NumPyDocStringParameter; import com.jetbrains.python.psi.*; +import com.jetbrains.python.psi.impl.PyBuiltinCache; +import com.jetbrains.python.psi.impl.PyExpressionCodeFragmentImpl; import com.jetbrains.python.psi.types.PyType; import com.jetbrains.python.psi.types.PyTypeProviderBase; import com.jetbrains.python.psi.types.TypeEvalContext; @@ -47,6 +50,7 @@ public class NumpyDocStringTypeProvider extends PyTypeProviderBase { // an instance of 'numpy.core.multiarray.dtype', however the type checker isn't able to check it. // 30 occurrences NUMPY_ALIAS_TO_REAL_TYPE.put("data-type", "object"); + NUMPY_ALIAS_TO_REAL_TYPE.put("dtype", "object"); // 16 occurrences NUMPY_ALIAS_TO_REAL_TYPE.put("scalar", "int or long or float or complex"); // 10 occurrences @@ -62,6 +66,8 @@ public class NumpyDocStringTypeProvider extends PyTypeProviderBase { NUMPY_ALIAS_TO_REAL_TYPE.put("callable", "collections.Callable"); // 3 occurrences NUMPY_ALIAS_TO_REAL_TYPE.put("number", "int or long or float or complex"); + + NUMPY_ALIAS_TO_REAL_TYPE.put("sequence", "collections.Iterable"); } @Nullable @@ -111,6 +117,7 @@ public class NumpyDocStringTypeProvider extends PyTypeProviderBase { } private static boolean isInsideNumPy(@NotNull PsiElement element) { + if (ApplicationManager.getApplication().isUnitTestMode()) return true; final PsiFile file = element.getContainingFile(); if (file != null) { final PyPsiFacade facade = getPsiFacade(element); @@ -137,7 +144,31 @@ public class NumpyDocStringTypeProvider extends PyTypeProviderBase { return type; } } - return facade.parseTypeAnnotation(typeString, anchor); + final PyType type = facade.parseTypeAnnotation(typeString, anchor); + if (type != null) { + return type; + } + return getNominalType(anchor, typeString); + } + + /** + * Converts literal into type, e.g. -1 -> int, 'fro' -> str + */ + @Nullable + private static PyType getNominalType(@NotNull PsiElement anchor, @NotNull String typeString) { + final PyExpressionCodeFragmentImpl codeFragment = new PyExpressionCodeFragmentImpl(anchor.getProject(), "dummy.py", typeString, false); + final PsiElement element = codeFragment.getFirstChild(); + if (element instanceof PyExpressionStatement) { + final PyExpression expression = ((PyExpressionStatement)element).getExpression(); + final PyBuiltinCache builtinCache = PyBuiltinCache.getInstance(anchor); + if (expression instanceof PyStringLiteralExpression) { + return builtinCache.getStrType(); + } + if (expression instanceof PyNumericLiteralExpression) { + return builtinCache.getIntType(); + } + } + return null; } @Nullable @@ -154,7 +185,7 @@ public class NumpyDocStringTypeProvider extends PyTypeProviderBase { } @Nullable - private PyType getParameterType(@NotNull PyFunction function, @NotNull String parameterName) { + private static PyType getParameterType(@NotNull PyFunction function, @NotNull String parameterName) { final NumPyDocString docString = NumPyDocString.forFunction(function, function); if (docString != null) { NumPyDocStringParameter parameter = docString.getNamedParameter(parameterName); diff --git a/python/src/com/jetbrains/python/debugger/PyExceptionBreakpointProperties.java b/python/src/com/jetbrains/python/debugger/PyExceptionBreakpointProperties.java index 811f91f1f727..099d6d0811a2 100644 --- a/python/src/com/jetbrains/python/debugger/PyExceptionBreakpointProperties.java +++ b/python/src/com/jetbrains/python/debugger/PyExceptionBreakpointProperties.java @@ -42,7 +42,7 @@ public class PyExceptionBreakpointProperties extends ExceptionBreakpointProperti public PyExceptionBreakpointProperties(@NotNull final String exception) { myException = exception; myNotifyOnTerminate = true; - myIgnoreLibraries = true; + myIgnoreLibraries = false; } @Override diff --git a/python/src/com/jetbrains/python/inspections/PyPackageRequirementsInspection.java b/python/src/com/jetbrains/python/inspections/PyPackageRequirementsInspection.java index 0db1a087aa29..a92537dc50b3 100644 --- a/python/src/com/jetbrains/python/inspections/PyPackageRequirementsInspection.java +++ b/python/src/com/jetbrains/python/inspections/PyPackageRequirementsInspection.java @@ -34,11 +34,9 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.profile.codeInspection.InspectionProfileManager; import com.intellij.profile.codeInspection.InspectionProjectProfileManager; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiElementVisitor; -import com.intellij.psi.PsiFile; -import com.intellij.psi.PsiReference; +import com.intellij.psi.*; import com.intellij.util.Function; +import com.jetbrains.python.codeInsight.imports.AddImportHelper; import com.jetbrains.python.codeInsight.stdlib.PyStdlibUtil; import com.jetbrains.python.packaging.*; import com.jetbrains.python.packaging.ui.PyChooseRequirementsDialog; @@ -362,6 +360,63 @@ public class PyPackageRequirementsInspection extends PyInspection { } } + public static class InstallAndImportQuickFix implements LocalQuickFix { + + private final Sdk mySdk; + private final Module myModule; + private String myPackageName; + @Nullable private final String myAsName; + @NotNull private final SmartPsiElementPointer myNode; + + public InstallAndImportQuickFix(@NotNull final String packageName, + @Nullable final String asName, + @NotNull final PyElement node) { + myPackageName = packageName; + myAsName = asName; + myNode = SmartPointerManager.getInstance(node.getProject()).createSmartPsiElementPointer(node, node.getContainingFile()); + myModule = ModuleUtilCore.findModuleForPsiElement(node); + mySdk = PythonSdkType.findPythonSdk(myModule); + } + + @NotNull + public String getName() { + return "Install and import package " + myPackageName; + } + + @NotNull + public String getFamilyName() { + return "Install and import package " + myPackageName; + } + + public void applyFix(@NotNull final Project project, @NotNull final ProblemDescriptor descriptor) { + final PyPackageManagerUI ui = new PyPackageManagerUI(project, mySdk, new UIListener(myModule) { + @Override + public void finished(List exceptions) { + super.finished(exceptions); + if (exceptions.isEmpty()) { + + final PyElement element = myNode.getElement(); + if (element == null) return; + + CommandProcessor.getInstance().executeCommand(project, new Runnable() { + @Override + public void run() { + ApplicationManager.getApplication().runWriteAction(new Runnable() { + @Override + public void run() { + AddImportHelper.addImportStatement(element.getContainingFile(), myPackageName, myAsName, + AddImportHelper.ImportPriority.THIRD_PARTY, element); + } + }); + } + }, "Add import", "Add import"); + } + } + }); + ui.install(Collections.singletonList(new PyRequirement(myPackageName)), Collections.emptyList()); + } + } + private static class UIListener implements PyPackageManagerUI.Listener { private final Module myModule; diff --git a/python/src/com/jetbrains/python/inspections/PyPep8NamingInspection.java b/python/src/com/jetbrains/python/inspections/PyPep8NamingInspection.java index 1da2c46403e0..8dd34f25f31d 100644 --- a/python/src/com/jetbrains/python/inspections/PyPep8NamingInspection.java +++ b/python/src/com/jetbrains/python/inspections/PyPep8NamingInspection.java @@ -25,6 +25,7 @@ import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.popup.PopupChooserBuilder; import com.intellij.profile.codeInspection.InspectionProjectProfileManager; +import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElementVisitor; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.QualifiedName; @@ -91,7 +92,7 @@ public class PyPep8NamingInspection extends PyInspection { } } if (!LOWERCASE_REGEX.matcher(name).matches() && !name.startsWith("_")) { - registerProblem(expression, "Variable in function should be lowercase", new PyRenameElementQuickFix()); + registerAndAddRenameQuickFix(expression, "Variable in function should be lowercase"); } } } @@ -101,10 +102,17 @@ public class PyPep8NamingInspection extends PyInspection { final String name = node.getName(); if (name == null) return; if (!LOWERCASE_REGEX.matcher(name).matches()) { - registerProblem(node, "Argument name should be lowercase", new PyRenameElementQuickFix()); + registerAndAddRenameQuickFix(node, "Argument name should be lowercase"); } } + private void registerAndAddRenameQuickFix(@Nullable final PsiElement node, @NotNull final String name) { + if (getHolder() != null && getHolder().isOnTheFly()) + registerProblem(node, name, new PyRenameElementQuickFix()); + else + registerProblem(node, name); + } + @Override public void visitPyFunction(PyFunction function) { final PyClass containingClass = function.getContainingClass(); @@ -117,7 +125,10 @@ public class PyPep8NamingInspection extends PyInspection { if (!LOWERCASE_REGEX.matcher(name).matches()) { final ASTNode nameNode = function.getNameNode(); if (nameNode != null) { - final List quickFixes = Lists.newArrayList(new PyRenameElementQuickFix()); + final List quickFixes = Lists.newArrayList(); + if (getHolder() != null && getHolder().isOnTheFly()) + quickFixes.add(new PyRenameElementQuickFix()); + if (containingClass != null) { quickFixes.add(new IgnoreBaseClassQuickFix(containingClass, myTypeEvalContext)); } @@ -150,7 +161,7 @@ public class PyPep8NamingInspection extends PyInspection { if (!MIXEDCASE_REGEX.matcher(name).matches()) { final ASTNode nameNode = node.getNameNode(); if (nameNode != null) { - registerProblem(nameNode.getPsi(), "Class names should use CamelCase convention", new PyRenameElementQuickFix()); + registerAndAddRenameQuickFix(nameNode.getPsi(), "Class names should use CamelCase convention"); } } } @@ -165,19 +176,19 @@ public class PyPep8NamingInspection extends PyInspection { if (asName == null || name == null) return; if (UPPERCASE_REGEX.matcher(name).matches()) { if (!UPPERCASE_REGEX.matcher(asName).matches()) { - registerProblem(node.getAsNameElement(), "Constant variable imported as non constant", new PyRenameElementQuickFix()); + registerAndAddRenameQuickFix(node.getAsNameElement(), "Constant variable imported as non constant"); } } else if (LOWERCASE_REGEX.matcher(name).matches()) { if (!LOWERCASE_REGEX.matcher(asName).matches()) { - registerProblem(node.getAsNameElement(), "Lowercase variable imported as non lowercase", new PyRenameElementQuickFix()); + registerAndAddRenameQuickFix(node.getAsNameElement(), "Lowercase variable imported as non lowercase"); } } else if (LOWERCASE_REGEX.matcher(asName).matches()) { - registerProblem(node.getAsNameElement(), "CamelCase variable imported as lowercase", new PyRenameElementQuickFix()); + registerAndAddRenameQuickFix(node.getAsNameElement(), "CamelCase variable imported as lowercase"); } else if (UPPERCASE_REGEX.matcher(asName).matches()) { - registerProblem(node.getAsNameElement(), "CamelCase variable imported as constant", new PyRenameElementQuickFix()); + registerAndAddRenameQuickFix(node.getAsNameElement(), "CamelCase variable imported as constant"); } } } diff --git a/python/src/com/jetbrains/python/PyAddImportFix.java b/python/src/com/jetbrains/python/inspections/quickfix/PyAddImportFix.java similarity index 96% rename from python/src/com/jetbrains/python/PyAddImportFix.java rename to python/src/com/jetbrains/python/inspections/quickfix/PyAddImportFix.java index 78d53f2a2122..fe49874ea11a 100644 --- a/python/src/com/jetbrains/python/PyAddImportFix.java +++ b/python/src/com/jetbrains/python/inspections/quickfix/PyAddImportFix.java @@ -13,12 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.jetbrains.python; +package com.jetbrains.python.inspections.quickfix; import com.intellij.codeInspection.LocalQuickFix; import com.intellij.codeInspection.ProblemDescriptor; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; +import com.jetbrains.python.PyBundle; import com.jetbrains.python.codeInsight.imports.AddImportHelper; import com.jetbrains.python.psi.LanguageLevel; import com.jetbrains.python.psi.PyElementGenerator; diff --git a/python/src/com/jetbrains/python/quickFixes/RemoveTrailingBlankLinesFix.java b/python/src/com/jetbrains/python/inspections/quickfix/RemoveTrailingBlankLinesFix.java similarity index 98% rename from python/src/com/jetbrains/python/quickFixes/RemoveTrailingBlankLinesFix.java rename to python/src/com/jetbrains/python/inspections/quickfix/RemoveTrailingBlankLinesFix.java index 03c44fdced0b..b9d3eb27b57e 100644 --- a/python/src/com/jetbrains/python/quickFixes/RemoveTrailingBlankLinesFix.java +++ b/python/src/com/jetbrains/python/inspections/quickfix/RemoveTrailingBlankLinesFix.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.jetbrains.python.quickFixes; +package com.jetbrains.python.inspections.quickfix; import com.intellij.codeInsight.intention.HighPriorityAction; import com.intellij.codeInsight.intention.IntentionAction; diff --git a/python/src/com/jetbrains/python/inspections/unresolvedReference/PyPackageAliasesProvider.java b/python/src/com/jetbrains/python/inspections/unresolvedReference/PyPackageAliasesProvider.java new file mode 100644 index 000000000000..01ca2ba89b19 --- /dev/null +++ b/python/src/com/jetbrains/python/inspections/unresolvedReference/PyPackageAliasesProvider.java @@ -0,0 +1,27 @@ +package com.jetbrains.python.inspections.unresolvedReference; + +import java.util.HashMap; +import java.util.Map; + +public class PyPackageAliasesProvider { + private PyPackageAliasesProvider() { + } + + public static final Map commonAliases = new HashMap(); + + static { + commonAliases.put("np", "numpy"); + commonAliases.put("pl", "pylab"); + commonAliases.put("p", "pylab"); + commonAliases.put("sp", "scipy"); + commonAliases.put("pd", "pandas"); + commonAliases.put("sym", "sympy"); + commonAliases.put("sm", "statmodels"); + commonAliases.put("nx", "networkx"); + commonAliases.put("sk", "sklearn"); + + commonAliases.put("plt", "matplotlib.pyplot"); + commonAliases.put("mpimg", "matplotlib.image"); + commonAliases.put("mimg", "matplotlib.image"); + } +} diff --git a/python/src/com/jetbrains/python/inspections/unresolvedReference/PyUnresolvedReferencesInspection.java b/python/src/com/jetbrains/python/inspections/unresolvedReference/PyUnresolvedReferencesInspection.java index 4c8391ef689d..edb3cfec69ac 100644 --- a/python/src/com/jetbrains/python/inspections/unresolvedReference/PyUnresolvedReferencesInspection.java +++ b/python/src/com/jetbrains/python/inspections/unresolvedReference/PyUnresolvedReferencesInspection.java @@ -68,6 +68,7 @@ import com.jetbrains.python.psi.types.*; import com.jetbrains.python.sdk.PythonSdkType; import com.jetbrains.python.sdk.skeletons.PySkeletonRefresher; import org.jetbrains.annotations.Nls; +import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -302,12 +303,10 @@ public class PyUnresolvedReferencesInspection extends PyInspection { if (element instanceof PyReferenceOwner) { final PyResolveContext resolveContext = PyResolveContext.noImplicits().withTypeEvalContext(myTypeEvalContext); final PsiPolyVariantReference reference = ((PyReferenceOwner)element).getReference(resolveContext); - if (reference != null) { - final ResolveResult[] resolveResults = reference.multiResolve(false); - for (ResolveResult resolveResult : resolveResults) { - if (resolveResult instanceof ImportedResolveResult) { - myUsedImports.addAll(((ImportedResolveResult)resolveResult).getNameDefiners()); - } + final ResolveResult[] resolveResults = reference.multiResolve(false); + for (ResolveResult resolveResult : resolveResults) { + if (resolveResult instanceof ImportedResolveResult) { + myUsedImports.addAll(((ImportedResolveResult)resolveResult).getNameDefiners()); } } } @@ -571,11 +570,9 @@ public class PyUnresolvedReferencesInspection extends PyInspection { hl_type = ProblemHighlightType.LIKE_UNKNOWN_SYMBOL; } - if (element != null) { - PyImportStatementBase importStatementBase = PsiTreeUtil.getParentOfType(element, PyImportStatementBase.class); - if ((importStatementBase != null) && GenerateBinaryStubsFix.isApplicable(importStatementBase)) { - actions.addAll(GenerateBinaryStubsFix.generateFixes(importStatementBase)); - } + PyImportStatementBase importStatementBase = PsiTreeUtil.getParentOfType(element, PyImportStatementBase.class); + if ((importStatementBase != null) && GenerateBinaryStubsFix.isApplicable(importStatementBase)) { + actions.addAll(GenerateBinaryStubsFix.generateFixes(importStatementBase)); } if (qualifiedNames.size() == 1) { final QualifiedName qualifiedName = qualifiedNames.get(0); @@ -873,6 +870,24 @@ public class PyUnresolvedReferencesInspection extends PyInspection { actions.add(importFix.forLocalImport()); } } + else { + final String refName = (node instanceof PyQualifiedExpression) ? ((PyQualifiedExpression)node).getReferencedName() : node.getText(); + if (refName == null) return; + final QualifiedName qname = QualifiedName.fromDottedString(refName); + final List components = qname.getComponents(); + if (!components.isEmpty()) { + final String packageName = components.get(0); + if (PyPIPackageUtil.INSTANCE.isInPyPI(packageName)) { + actions.add(new PyPackageRequirementsInspection.InstallAndImportQuickFix(packageName, packageName, node)); + } + else { + final String packageAlias = PyPackageAliasesProvider.commonAliases.get(packageName); + if (packageAlias != null && PyPIPackageUtil.INSTANCE.isInPyPI(packageName)) { + actions.add(new PyPackageRequirementsInspection.InstallAndImportQuickFix(packageAlias, packageName, node)); + } + } + } + } } private static boolean suppressHintForAutoImport(PyElement node, AutoImportQuickFix importFix) { @@ -891,7 +906,7 @@ public class PyUnresolvedReferencesInspection extends PyInspection { return false; } - private void addCreateClassFix(String refText, PsiElement element, List actions) { + private void addCreateClassFix(@NonNls String refText, PsiElement element, List actions) { if (refText.length() > 2 && Character.isUpperCase(refText.charAt(0)) && !refText.toUpperCase().equals(refText) && PsiTreeUtil.getParentOfType(element, PyImportStatementBase.class) == null) { PsiElement anchor = element; diff --git a/python/src/com/jetbrains/python/validation/Pep8ExternalAnnotator.java b/python/src/com/jetbrains/python/validation/Pep8ExternalAnnotator.java index 7b2d3233b369..f8642b600202 100644 --- a/python/src/com/jetbrains/python/validation/Pep8ExternalAnnotator.java +++ b/python/src/com/jetbrains/python/validation/Pep8ExternalAnnotator.java @@ -56,7 +56,7 @@ import com.jetbrains.python.codeInsight.imports.OptimizeImportsQuickFix; import com.jetbrains.python.formatter.PyCodeStyleSettings; import com.jetbrains.python.inspections.PyPep8Inspection; import com.jetbrains.python.inspections.quickfix.ReformatFix; -import com.jetbrains.python.quickFixes.RemoveTrailingBlankLinesFix; +import com.jetbrains.python.inspections.quickfix.RemoveTrailingBlankLinesFix; import com.jetbrains.python.sdk.PreferredSdkComparator; import com.jetbrains.python.sdk.PySdkUtil; import com.jetbrains.python.sdk.PythonSdkType; diff --git a/python/src/com/jetbrains/python/validation/UnsupportedFeaturesUtil.java b/python/src/com/jetbrains/python/validation/UnsupportedFeaturesUtil.java index 4018b339fc5d..a84651c009ab 100644 --- a/python/src/com/jetbrains/python/validation/UnsupportedFeaturesUtil.java +++ b/python/src/com/jetbrains/python/validation/UnsupportedFeaturesUtil.java @@ -41,8 +41,8 @@ public class UnsupportedFeaturesUtil { public static Map> BUILTINS = new HashMap>(); public static Map> MODULES = new HashMap>(); public static Map>> CLASS_METHODS = new HashMap>>(); + public static final List ALL_LANGUAGE_LEVELS = new ArrayList(); - public static Vector ALL_LANGUAGE_LEVELS; static { try { fillMaps(); @@ -52,7 +52,9 @@ public class UnsupportedFeaturesUtil { Logger log = Logger.getInstance(UnsupportedFeaturesUtil.class.getName()); log.error("Cannot find \"versions.xml\". " + e.getMessage()); } - fillAllLanguageLeves(); + for (LanguageLevel level : LanguageLevel.ALL_LEVELS) { + ALL_LANGUAGE_LEVELS.add(level.toString()); + } } private static void fillTestCaseMethods() throws IOException { @@ -72,19 +74,6 @@ public class UnsupportedFeaturesUtil { } } - private static void fillAllLanguageLeves() { - ALL_LANGUAGE_LEVELS = new Vector(); - ALL_LANGUAGE_LEVELS.add(LanguageLevel.PYTHON24.toString()); - ALL_LANGUAGE_LEVELS.add(LanguageLevel.PYTHON25.toString()); - ALL_LANGUAGE_LEVELS.add(LanguageLevel.PYTHON26.toString()); - ALL_LANGUAGE_LEVELS.add(LanguageLevel.PYTHON27.toString()); - ALL_LANGUAGE_LEVELS.add(LanguageLevel.PYTHON30.toString()); - ALL_LANGUAGE_LEVELS.add(LanguageLevel.PYTHON31.toString()); - ALL_LANGUAGE_LEVELS.add(LanguageLevel.PYTHON32.toString()); - ALL_LANGUAGE_LEVELS.add(LanguageLevel.PYTHON33.toString()); - ALL_LANGUAGE_LEVELS.add(LanguageLevel.PYTHON34.toString()); - } - private static void fillMaps() throws IOException { Logger log = Logger.getInstance(UnsupportedFeaturesUtil.class.getName()); FileReader reader = new FileReader(PythonHelpersLocator.getHelperPath("/tools/versions.xml")); diff --git a/python/testData/inspections/PyNumpyType/Dtype.py b/python/testData/inspections/PyNumpyType/Dtype.py new file mode 100644 index 000000000000..3da74820d977 --- /dev/null +++ b/python/testData/inspections/PyNumpyType/Dtype.py @@ -0,0 +1,43 @@ +def maximum_fill_value(obj): + """ + Return the minimum value that can be represented by the dtype of an object. + + This function is useful for calculating a fill value suitable for + taking the maximum of an array with a given dtype. + + Parameters + ---------- + obj : dtype + An object that can be queried for it's numeric type. + + Returns + ------- + val : scalar + The minimum representable value. + + Raises + ------ + TypeError + If `obj` isn't a suitable numeric type. + + """ + errmsg = "Unsuitable type for calculating maximum." + if hasattr(obj, 'dtype'): + return _recursive_extremum_fill_value(obj.dtype, max_filler) + elif isinstance(obj, float): + return max_filler[ntypes.typeDict['float_']] + elif isinstance(obj, int): + return max_filler[ntypes.typeDict['int_']] + elif isinstance(obj, long): + return max_filler[ntypes.typeDict['uint']] + elif isinstance(obj, np.dtype): + return max_filler[obj] + else: + raise TypeError(errmsg) + +a = np.int8() +maximum_fill_value(a) + + +maximum_fill_value(('i4',[('r','u1'), ('g','u1'), ('b','u1'), ('a','u1')])) +maximum_fill_value("i8,f8,S5") diff --git a/python/testData/inspections/PyNumpyType/NominalType.py b/python/testData/inspections/PyNumpyType/NominalType.py new file mode 100644 index 000000000000..9ca4081f4a01 --- /dev/null +++ b/python/testData/inspections/PyNumpyType/NominalType.py @@ -0,0 +1,90 @@ + +def cond(x, p=None): + """ + Compute the condition number of a matrix. + + This function is capable of returning the condition number using + one of seven different norms, depending on the value of `p` (see + Parameters below). + + Parameters + ---------- + x : (M, N) array_like + The matrix whose condition number is sought. + p : {None, 1, -1, 2, -2, inf, -inf, 'fro'}, optional + Order of the norm: + + ===== ============================ + p norm for matrices + ===== ============================ + None 2-norm, computed directly using the ``SVD`` + 'fro' Frobenius norm + inf max(sum(abs(x), axis=1)) + -inf min(sum(abs(x), axis=1)) + 1 max(sum(abs(x), axis=0)) + -1 min(sum(abs(x), axis=0)) + 2 2-norm (largest sing. value) + -2 smallest singular value + ===== ============================ + + inf means the numpy.inf object, and the Frobenius norm is + the root-of-sum-of-squares norm. + + Returns + ------- + c : {float, inf} + The condition number of the matrix. May be infinite. + + See Also + -------- + numpy.linalg.norm + + Notes + ----- + The condition number of `x` is defined as the norm of `x` times the + norm of the inverse of `x` [1]_; the norm can be the usual L2-norm + (root-of-sum-of-squares) or one of a number of other matrix norms. + + References + ---------- + .. [1] G. Strang, *Linear Algebra and Its Applications*, Orlando, FL, + Academic Press, Inc., 1980, pg. 285. + + Examples + -------- + >>> from numpy import linalg as LA + >>> a = np.array([[1, 0, -1], [0, 1, 0], [1, 0, 1]]) + >>> a + array([[ 1, 0, -1], + [ 0, 1, 0], + [ 1, 0, 1]]) + >>> LA.cond(a) + 1.4142135623730951 + >>> LA.cond(a, 'fro') + 3.1622776601683795 + >>> LA.cond(a, np.inf) + 2.0 + >>> LA.cond(a, -np.inf) + 1.0 + >>> LA.cond(a, 1) + 2.0 + >>> LA.cond(a, -1) + 1.0 + >>> LA.cond(a, 2) + 1.4142135623730951 + >>> LA.cond(a, -2) + 0.70710678118654746 + >>> min(LA.svd(a, compute_uv=0))*min(LA.svd(LA.inv(a), compute_uv=0)) + 0.70710678118654746 + + """ + x = asarray(x) # in case we have a matrix + if p is None: + s = svd(x, compute_uv=False) + return s[0]/s[-1] + else: + return norm(x, p)*norm(inv(x), p) + +a = np.array([[1, 0, -1], [0, 1, 0], [1, 0, 1]]) + +cond(a, "fro") \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/env/python/PythonDebuggerTest.java b/python/testSrc/com/jetbrains/env/python/PythonDebuggerTest.java index c80d7216a55a..ab4e64f4bad3 100644 --- a/python/testSrc/com/jetbrains/env/python/PythonDebuggerTest.java +++ b/python/testSrc/com/jetbrains/env/python/PythonDebuggerTest.java @@ -428,7 +428,7 @@ public class PythonDebuggerTest extends PyEnvTestCase { addExceptionBreakpoint(fixture, properties); } - public void testExceptionBreakpointIgnoreLibraries() throws Exception { + public void testExceptionBreakpointIgnoreLibrariesOnRaise() throws Exception { runPythonTest(new PyDebuggerTask("/debug", "test_ignore_lib.py") { @Override public void before() throws Exception { @@ -450,6 +450,23 @@ public class PythonDebuggerTest extends PyEnvTestCase { }); } + public void testExceptionBreakpointIgnoreLibrariesOnTerminate() throws Exception { + runPythonTest(new PyDebuggerTask("/debug", "test_ignore_lib.py") { + @Override + public void before() throws Exception { + createExceptionBreak(myFixture, true, false, false, true); + } + + @Override + public void testing() throws Exception { + waitForPause(); + eval("stopped_in_user_file").hasValue("True"); + resume(); + waitForTerminate(); + } + }); + } + public void testMultithreading() throws Exception { runPythonTest(new PyDebuggerTask("/debug", "test_multithread.py") { @Override diff --git a/python/testSrc/com/jetbrains/python/inspections/PyNumpyTypeTest.java b/python/testSrc/com/jetbrains/python/inspections/PyNumpyTypeTest.java new file mode 100644 index 000000000000..26ad34baee3e --- /dev/null +++ b/python/testSrc/com/jetbrains/python/inspections/PyNumpyTypeTest.java @@ -0,0 +1,36 @@ +/* + * Copyright 2000-2015 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.inspections; + +import com.jetbrains.python.fixtures.PyTestCase; + +public class PyNumpyTypeTest extends PyTestCase { + public static final String TEST_DIRECTORY = "inspections/PyNumpyType/"; + + private void doTest() { + myFixture.configureByFile(TEST_DIRECTORY + getTestName(false) + ".py"); + myFixture.enableInspections(PyTypeCheckerInspection.class); + myFixture.checkHighlighting(true, false, true); + } + + public void testNominalType() { + doTest(); + } + + public void testDtype() { + doTest(); + } +} diff --git a/resources/src/idea/RichPlatformPlugin.xml b/resources/src/idea/RichPlatformPlugin.xml index cd8e214f3114..a9dcf376200a 100644 --- a/resources/src/idea/RichPlatformPlugin.xml +++ b/resources/src/idea/RichPlatformPlugin.xml @@ -256,7 +256,7 @@ -