Add bundled skeletons builder

Pre-built skeletons are bundled with PyCharm and save a lot of time on the first indexing.
Though they were built manually and currently not up-to date. Now we build them automatically.
This commit is contained in:
Dmitry Trofimov
2017-08-16 15:42:03 +02:00
parent 5c872143bc
commit 7f1460ecb4
27 changed files with 71 additions and 222 deletions
@@ -108,8 +108,8 @@ public class PySkeletonRefresher {
}
public static void refreshSkeletonsOfSdk(@Nullable Project project,
Component ownerComponent,
String skeletonsPath,
@Nullable Component ownerComponent,
@Nullable String skeletonsPath,
@NotNull Sdk sdk)
throws InvalidSdkException {
final Map<String, List<String>> errors = new TreeMap<>();
@@ -815,32 +815,12 @@ public class PySkeletonRefresher {
return null;
}
LOG.info("Pregenerated skeletons root is " + root);
@NonNls final String versionString = mySdk.getVersionString();
if (versionString == null) {
return null;
}
if (PySdkUtil.isRemote(mySdk)) {
return null;
}
String prebuiltSkeletonsName = getPregeneratedSkeletonsName();
if (prebuiltSkeletonsName == null) return null;
File f = new File(root, prebuiltSkeletonsName);
String version = versionString.toLowerCase().replace(" ", "-");
File f;
if (SystemInfo.isMac) {
String osVersion = SystemInfo.OS_VERSION;
int dot = osVersion.indexOf('.');
if (dot >= 0) {
int secondDot = osVersion.indexOf('.', dot + 1);
if (secondDot >= 0) {
osVersion = osVersion.substring(0, secondDot);
}
}
f = new File(root, "skeletons-mac-" + myGeneratorVersion + "-" + osVersion + "-" + version + ".zip");
}
else {
String os = SystemInfo.isWindows ? "win" : "nix";
f = new File(root, "skeletons-" + os + "-" + myGeneratorVersion + "-" + version + ".zip");
}
if (f.exists()) {
LOG.info("Found pregenerated skeletons at " + f.getPath());
final VirtualFile virtualFile = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(f);
@@ -856,6 +836,41 @@ public class PySkeletonRefresher {
}
}
public String getPregeneratedSkeletonsName() {
return getPregeneratedSkeletonsName(mySdk, myGeneratorVersion);
}
@Nullable
public static String getPregeneratedSkeletonsName(@NotNull Sdk sdk, int generatorVersion) {
String prebuiltSkeletonsName;
@NonNls final String versionString = sdk.getVersionString();
if (versionString == null) {
return null;
}
if (PySdkUtil.isRemote(sdk)) {
return null;
}
String version = versionString.toLowerCase().replace(" ", "-");
if (SystemInfo.isMac) {
String osVersion = SystemInfo.OS_VERSION;
int dot = osVersion.indexOf('.');
if (dot >= 0) {
int secondDot = osVersion.indexOf('.', dot + 1);
if (secondDot >= 0) {
osVersion = osVersion.substring(0, secondDot);
}
}
prebuiltSkeletonsName = "skeletons-mac-" + generatorVersion + "-" + osVersion + "-" + version + ".zip";
}
else {
String os = SystemInfo.isWindows ? "win" : "nix";
prebuiltSkeletonsName = "skeletons-" + os + "-" + generatorVersion + "-" + version + ".zip";
} return prebuiltSkeletonsName;
}
@Nullable
private static File findPregeneratedSkeletonsRoot() {
final String path = PathManager.getHomePath();
@@ -16,7 +16,7 @@
package com.jetbrains.env;
import com.intellij.openapi.application.ApplicationManager;
import com.jetbrains.python.sdkTools.SdkCreationType;
import com.jetbrains.python.tools.sdkTools.SdkCreationType;
import org.jetbrains.annotations.NotNull;
import org.junit.Assert;
import org.junit.Test;
+3 -3
View File
@@ -9,8 +9,8 @@ import com.intellij.openapi.vfs.VirtualFile;
import com.jetbrains.python.psi.LanguageLevel;
import com.jetbrains.python.sdk.InvalidSdkException;
import com.jetbrains.python.sdk.PythonSdkType;
import com.jetbrains.python.sdkTools.PyTestSdkTools;
import com.jetbrains.python.sdkTools.SdkCreationType;
import com.jetbrains.python.tools.sdkTools.PySdkTools;
import com.jetbrains.python.tools.sdkTools.SdkCreationType;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -146,7 +146,7 @@ public class PyEnvTaskRunner {
if (url == null) {
return null;
}
return PyTestSdkTools.createTempSdk(url, SdkCreationType.EMPTY_SDK, null);
return PySdkTools.createTempSdk(url, SdkCreationType.EMPTY_SDK, null);
}
protected boolean shouldRun(String root, PyTestTask task) {
@@ -25,8 +25,8 @@ import com.jetbrains.python.packaging.PyPackageManager;
import com.jetbrains.python.psi.LanguageLevel;
import com.jetbrains.python.sdk.InvalidSdkException;
import com.jetbrains.python.sdk.PythonSdkType;
import com.jetbrains.python.sdkTools.PyTestSdkTools;
import com.jetbrains.python.sdkTools.SdkCreationType;
import com.jetbrains.python.tools.sdkTools.PySdkTools;
import com.jetbrains.python.tools.sdkTools.SdkCreationType;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.junit.Assert;
@@ -234,7 +234,7 @@ public abstract class PyExecutionFixtureTestTask extends PyTestTask {
* Creates SDK by its path
*
* @param sdkHome path to sdk (probably obtained by {@link #runTestOn(String)})
* @param sdkCreationType SDK creation strategy (see {@link com.jetbrains.python.sdkTools.SdkCreationType} doc)
* @param sdkCreationType SDK creation strategy (see {@link sdkTools.SdkCreationType} doc)
* @return sdk
*/
@NotNull
@@ -242,7 +242,7 @@ public abstract class PyExecutionFixtureTestTask extends PyTestTask {
throws InvalidSdkException {
final VirtualFile sdkHomeFile = LocalFileSystem.getInstance().findFileByPath(sdkHome);
Assert.assertNotNull("Interpreter file not found: " + sdkHome, sdkHomeFile);
final Sdk sdk = PyTestSdkTools.createTempSdk(sdkHomeFile, sdkCreationType, myFixture.getModule());
final Sdk sdk = PySdkTools.createTempSdk(sdkHomeFile, sdkCreationType, myFixture.getModule());
// We use gradle script to create environment. This script utilizes Conda.
// Conda supports 2 types of package installation: conda native and pip. We use pip.
// PyCharm Conda support ignores packages installed via pip ("conda list -e" does it, see PyCondaPackageManagerImpl)
@@ -24,7 +24,7 @@ import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.Ref;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.xdebugger.XDebuggerTestUtil;
import com.jetbrains.python.sdkTools.SdkCreationType;
import com.jetbrains.python.tools.sdkTools.SdkCreationType;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.junit.Assert;
+1 -1
View File
@@ -32,7 +32,7 @@ public abstract class PyTestTask {
/**
* Run test on certain SDK path.
* To create SDK from path, use {@link PyExecutionFixtureTestTask#createTempSdk(String, com.jetbrains.python.sdkTools.SdkCreationType)}
* To create SDK from path, use {@link PyExecutionFixtureTestTask#createTempSdk(String, sdkTools.SdkCreationType)}
*
* @param sdkHome sdk path
*/
+1 -1
View File
@@ -21,10 +21,10 @@ import com.intellij.execution.testframework.sm.runner.ui.MockPrinter;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.text.StringUtil;
import com.jetbrains.python.sdkTools.SdkCreationType;
import com.jetbrains.python.testing.tox.PyToxConfiguration;
import com.jetbrains.python.testing.tox.PyToxConfigurationFactory;
import com.jetbrains.python.testing.tox.PyToxTestTools;
import com.jetbrains.python.tools.sdkTools.SdkCreationType;
import org.hamcrest.Matchers;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -16,7 +16,7 @@ import com.jetbrains.python.packaging.PyRequirement;
import com.jetbrains.python.sdk.PythonSdkType;
import com.jetbrains.python.sdk.flavors.PythonSdkFlavor;
import com.jetbrains.python.sdk.flavors.VirtualEnvSdkFlavor;
import com.jetbrains.python.sdkTools.SdkCreationType;
import com.jetbrains.python.tools.sdkTools.SdkCreationType;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.junit.Test;
@@ -26,7 +26,7 @@ import com.jetbrains.python.debugger.pydev.PyDebugCallback;
import com.jetbrains.python.debugger.settings.PyDebuggerSettings;
import com.jetbrains.python.debugger.settings.PySteppingFilter;
import com.jetbrains.python.sdk.flavors.PythonSdkFlavor;
import com.jetbrains.python.sdkTools.SdkCreationType;
import com.jetbrains.python.tools.sdkTools.SdkCreationType;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.junit.Test;
@@ -4,7 +4,7 @@ import com.jetbrains.env.PyEnvTestCase;
import com.jetbrains.env.PyProcessWithConsoleTestTask;
import com.jetbrains.env.ut.PyUnitTestProcessRunner;
import com.jetbrains.python.PythonHelpersLocator;
import com.jetbrains.python.sdkTools.SdkCreationType;
import com.jetbrains.python.tools.sdkTools.SdkCreationType;
import org.jetbrains.annotations.NotNull;
import org.junit.Test;
@@ -29,18 +29,16 @@ import com.jetbrains.env.PyEnvTestCase;
import com.jetbrains.env.PyExecutionFixtureTestTask;
import com.jetbrains.env.PyTestTask;
import com.jetbrains.python.PythonFileType;
import com.jetbrains.python.documentation.PythonDocumentationProvider;
import com.jetbrains.python.inspections.unresolvedReference.PyUnresolvedReferencesInspection;
import com.jetbrains.python.psi.*;
import com.jetbrains.python.psi.impl.PyBuiltinCache;
import com.jetbrains.python.psi.resolve.PythonSdkPathCache;
import com.jetbrains.python.psi.types.PyType;
import com.jetbrains.python.psi.types.TypeEvalContext;
import com.jetbrains.python.sdk.PythonSdkType;
import com.jetbrains.python.sdk.skeletons.PySkeletonRefresher;
import com.jetbrains.python.sdk.skeletons.SkeletonVersionChecker;
import com.jetbrains.python.sdkTools.SdkCreationType;
import com.jetbrains.python.toolbox.Maybe;
import com.jetbrains.python.tools.sdkTools.SdkCreationType;
import org.jetbrains.annotations.NotNull;
import org.junit.Test;
@@ -37,7 +37,7 @@ import com.jetbrains.python.console.*;
import com.jetbrains.python.console.pydev.ConsoleCommunicationListener;
import com.jetbrains.python.debugger.PyDebugValue;
import com.jetbrains.python.debugger.PyDebuggerException;
import com.jetbrains.python.sdkTools.SdkCreationType;
import com.jetbrains.python.tools.sdkTools.SdkCreationType;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.junit.Assert;
@@ -24,7 +24,7 @@ import com.jetbrains.python.inspections.quickfix.GenerateBinaryStubsFix;
import com.jetbrains.python.inspections.unresolvedReference.PyUnresolvedReferencesInspection;
import com.jetbrains.python.sdk.InvalidSdkException;
import com.jetbrains.python.sdk.PythonSdkType;
import com.jetbrains.python.sdkTools.SdkCreationType;
import com.jetbrains.python.tools.sdkTools.SdkCreationType;
import org.hamcrest.Matchers;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -29,8 +29,8 @@ import com.jetbrains.env.PyExecutionFixtureTestTask;
import com.jetbrains.python.run.PythonConfigurationFactoryBase;
import com.jetbrains.python.run.PythonRunConfiguration;
import com.jetbrains.python.sdk.InvalidSdkException;
import com.jetbrains.python.sdkTools.SdkCreationType;
import com.jetbrains.python.testing.*;
import com.jetbrains.python.tools.sdkTools.SdkCreationType;
import org.hamcrest.Matchers;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -20,7 +20,7 @@ import com.intellij.openapi.application.ReadAction;
import com.intellij.util.ThrowableRunnable;
import com.jetbrains.env.PyProcessWithConsoleTestTask;
import com.jetbrains.env.ut.PyScriptTestProcessRunner;
import com.jetbrains.python.sdkTools.SdkCreationType;
import com.jetbrains.python.tools.sdkTools.SdkCreationType;
import org.jetbrains.annotations.NotNull;
/**
@@ -19,7 +19,7 @@ import com.google.common.collect.Sets
import com.jetbrains.env.PyProcessWithConsoleTestTask
import com.jetbrains.env.ut.PyScriptTestProcessRunner
import com.jetbrains.env.ut.PyUnitTestProcessRunner
import com.jetbrains.python.sdkTools.SdkCreationType
import com.jetbrains.python.tools.sdkTools.SdkCreationType
import java.util.function.Function
/**
@@ -3,9 +3,9 @@ package com.jetbrains.env.python.testing;
import com.jetbrains.env.PyEnvTestCase;
import com.jetbrains.env.PyProcessWithConsoleTestTask;
import com.jetbrains.env.ut.PyDocTestProcessRunner;
import com.jetbrains.python.sdkTools.SdkCreationType;
import com.jetbrains.python.testing.AbstractPythonLegacyTestRunConfiguration;
import com.jetbrains.python.testing.doctest.PythonDocTestRunConfiguration;
import com.jetbrains.python.tools.sdkTools.SdkCreationType;
import org.hamcrest.Matchers;
import org.jetbrains.annotations.NotNull;
import org.junit.Assert;
@@ -7,10 +7,10 @@ import com.jetbrains.env.PyProcessWithConsoleTestTask;
import com.jetbrains.env.python.testing.CreateConfigurationTestTask.PyConfigurationCreationTask;
import com.jetbrains.env.ut.PyNoseTestProcessRunner;
import com.jetbrains.python.PyNames;
import com.jetbrains.python.sdkTools.SdkCreationType;
import com.jetbrains.python.testing.PyNoseTestConfiguration;
import com.jetbrains.python.testing.PyNoseTestFactory;
import com.jetbrains.python.testing.PyTestFrameworkService;
import com.jetbrains.python.tools.sdkTools.SdkCreationType;
import org.jetbrains.annotations.NotNull;
import org.junit.Assert;
import org.junit.Test;
@@ -15,11 +15,11 @@ import com.jetbrains.env.PyProcessWithConsoleTestTask;
import com.jetbrains.env.ut.PyTestTestProcessRunner;
import com.jetbrains.python.PyNames;
import com.jetbrains.python.psi.PyFunction;
import com.jetbrains.python.sdkTools.SdkCreationType;
import com.jetbrains.python.testing.PyTestConfiguration;
import com.jetbrains.python.testing.PyTestFactory;
import com.jetbrains.python.testing.PyTestFrameworkService;
import com.jetbrains.python.testing.TestTargetType;
import com.jetbrains.python.tools.sdkTools.SdkCreationType;
import org.hamcrest.Matchers;
import org.jetbrains.annotations.NotNull;
import org.junit.Assert;
@@ -17,7 +17,7 @@ package com.jetbrains.env.python.testing;
import com.jetbrains.env.PyProcessWithConsoleTestTask;
import com.jetbrains.env.ut.PyScriptTestProcessRunner;
import com.jetbrains.python.sdkTools.SdkCreationType;
import com.jetbrains.python.tools.sdkTools.SdkCreationType;
import org.jetbrains.annotations.NotNull;
import static org.junit.Assert.assertEquals;
@@ -18,9 +18,7 @@ package com.jetbrains.env.python.testing;
import com.jetbrains.env.PyAbstractTestProcessRunner;
import com.jetbrains.env.PyProcessWithConsoleTestTask;
import com.jetbrains.env.ut.PyScriptTestProcessRunner;
import com.jetbrains.env.ut.PyUnitTestProcessRunner;
import com.jetbrains.python.run.PythonProcessRunner;
import com.jetbrains.python.sdkTools.SdkCreationType;
import com.jetbrains.python.tools.sdkTools.SdkCreationType;
import org.jetbrains.annotations.NotNull;
import org.junit.Assert;
@@ -17,7 +17,7 @@ package com.jetbrains.env.python.testing;
import com.jetbrains.env.PyProcessWithConsoleTestTask;
import com.jetbrains.env.ut.PyScriptTestProcessRunner;
import com.jetbrains.python.sdkTools.SdkCreationType;
import com.jetbrains.python.tools.sdkTools.SdkCreationType;
import org.jetbrains.annotations.NotNull;
import org.junit.Assert;
@@ -37,7 +37,7 @@ import com.jetbrains.python.sdk.PySdkUtil
import com.jetbrains.python.sdk.PythonSdkType
import com.jetbrains.python.sdk.PythonSdkUpdater
import com.jetbrains.python.sdk.flavors.PythonSdkFlavor
import com.jetbrains.python.sdkTools.PyTestSdkTools
import com.jetbrains.python.tools.sdkTools.PySdkTools
import org.junit.After
import org.junit.Before
@@ -66,7 +66,7 @@ abstract class PyTypeShedTestCase(protected val path: String, protected val sdkP
sdkCache[sdkPath] = sdk
val skeletonsDir = PySdkUtil.findSkeletonsDir(sdk)
if (skeletonsDir == null || skeletonsDir.children?.isEmpty() ?: true) {
PyTestSdkTools.generateTempSkeletonsOrPackages(sdk, true, module)
PySdkTools.generateTempSkeletonsOrPackages(sdk, true, module)
}
EdtTestUtil.runInEdtAndWait(ThrowableRunnable {
SdkConfigurationUtil.addSdk(sdk)
@@ -1,138 +0,0 @@
/*
* Copyright 2000-2016 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.jetbrains.python.sdkTools;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.PathManager;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.projectRoots.SdkModificator;
import com.intellij.openapi.projectRoots.impl.SdkConfigurationUtil;
import com.intellij.openapi.roots.ModuleRootModificationUtil;
import com.intellij.openapi.roots.OrderRootType;
import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.openapi.util.Ref;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.testFramework.EdtTestUtil;
import com.jetbrains.python.sdk.InvalidSdkException;
import com.jetbrains.python.sdk.PythonSdkAdditionalData;
import com.jetbrains.python.sdk.PythonSdkType;
import com.jetbrains.python.sdk.flavors.PythonSdkFlavor;
import com.jetbrains.python.sdk.skeletons.PySkeletonRefresher;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.junit.Assert;
import java.io.IOException;
/**
* Engine to create SDK for tests.
* See {@link #createTempSdk(com.intellij.openapi.vfs.VirtualFile, SdkCreationType, com.intellij.openapi.module.Module)}
*
* @author Ilya.Kazakevich
*/
public final class PyTestSdkTools {
private static final Sdk[] NO_SDK = new Sdk[0];
private PyTestSdkTools() {
}
/**
* Creates SDK by its path and associates it with module (if module provided)
*
* @param sdkHome path to sdk
* @param sdkCreationType SDK creation strategy (see {@link SdkCreationType} doc)
* @return sdk
*/
@NotNull
public static Sdk createTempSdk(@NotNull final VirtualFile sdkHome,
@NotNull final SdkCreationType sdkCreationType,
@Nullable final Module module
)
throws InvalidSdkException {
final Ref<Sdk> ref = Ref.create();
EdtTestUtil.runInEdtAndWait(() -> {
final Sdk sdk = SdkConfigurationUtil.setupSdk(NO_SDK, sdkHome, PythonSdkType.getInstance(), true, null, null);
Assert.assertNotNull("Failed to create SDK on " + sdkHome, sdk);
ref.set(sdk);
});
final Sdk sdk = ref.get();
if (sdkCreationType != SdkCreationType.EMPTY_SDK) {
generateTempSkeletonsOrPackages(sdk, sdkCreationType == SdkCreationType.SDK_PACKAGES_AND_SKELETONS, module);
}
EdtTestUtil.runInEdtAndWait(() -> SdkConfigurationUtil.addSdk(sdk));
return sdk;
}
/**
* Adds installed eggs to SDK, generates skeletons (optionally) and associates it with module.
*
* @param sdk sdk to process
* @param addSkeletons add skeletons or only packages
* @param module module to associate with (if provided)
* @throws InvalidSdkException bas sdk
* @throws IOException failed to read eggs
*/
public static void generateTempSkeletonsOrPackages(@NotNull final Sdk sdk,
final boolean addSkeletons,
@Nullable final Module module)
throws InvalidSdkException {
Project project = null;
if (module != null) {
project = module.getProject();
final Project finalProject = project;
// Associate with module
ModuleRootModificationUtil.setModuleSdk(module, sdk);
EdtTestUtil.runInEdtAndWait(() -> ApplicationManager.getApplication()
.runWriteAction(() -> ProjectRootManager.getInstance(finalProject).setProjectSdk(sdk)));
}
final SdkModificator modificator = sdk.getSdkModificator();
modificator.setSdkAdditionalData(new PythonSdkAdditionalData(PythonSdkFlavor.getFlavor(sdk)));
for (final String path : PythonSdkType.getSysPathsFromScript(sdk.getHomePath())) {
addTestSdkRoot(modificator, path);
}
if (!addSkeletons) {
EdtTestUtil.runInEdtAndWait(modificator::commitChanges);
return;
}
final String skeletonsPath = PythonSdkType.getSkeletonsPath(PathManager.getSystemPath(), sdk.getHomePath());
addTestSdkRoot(modificator, skeletonsPath);
EdtTestUtil.runInEdtAndWait(modificator::commitChanges);
PySkeletonRefresher
.refreshSkeletonsOfSdk(project, null, skeletonsPath, sdk);
}
public static void addTestSdkRoot(@NotNull SdkModificator sdkModificator, @NotNull String path) {
final VirtualFile file = LocalFileSystem.getInstance().refreshAndFindFileByPath(path);
if (file != null) {
sdkModificator.addRoot(PythonSdkType.getSdkRootVirtualFile(file), OrderRootType.CLASSES);
}
}
}
@@ -1,20 +0,0 @@
package com.jetbrains.python.sdkTools;
/**
* SDK creation type
* @author Ilya.Kazakevich
*/
public enum SdkCreationType {
/**
* SDK only (no packages nor skeletons)
*/
EMPTY_SDK,
/**
* SDK + installed packages from syspath
*/
SDK_PACKAGES_ONLY,
/**
* SDK + installed packages from syspath + skeletons
*/
SDK_PACKAGES_AND_SKELETONS
}
@@ -1,6 +0,0 @@
/**
* Engine to create SDK in tests.
* See {@link com.jetbrains.python.sdkTools.PyTestSdkTools}
* @author Ilya.Kazakevich
*/
package com.jetbrains.python.sdkTools;
@@ -23,5 +23,7 @@
<orderEntry type="library" scope="TEST" name="Mocks" level="project" />
<orderEntry type="library" exported="" scope="TEST" name="hamcrest" level="project" />
<orderEntry type="module" module-name="xml-openapi" />
<orderEntry type="module" module-name="lang-tests" scope="TEST" />
<orderEntry type="module" module-name="tools" scope="TEST" />
</component>
</module>