diff --git a/python/testFramework/src/com/jetbrains/python/tools/envTags.kt b/python/setup-test-environment/src/com/intellij/python/community/testFramework/testEnv/envTags.kt
similarity index 87%
rename from python/testFramework/src/com/jetbrains/python/tools/envTags.kt
rename to python/setup-test-environment/src/com/intellij/python/community/testFramework/testEnv/envTags.kt
index b2054495d665..3de5c9e78158 100644
--- a/python/testFramework/src/com/jetbrains/python/tools/envTags.kt
+++ b/python/setup-test-environment/src/com/intellij/python/community/testFramework/testEnv/envTags.kt
@@ -1,5 +1,5 @@
-// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
-package com.jetbrains.python.tools
+// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
+package com.intellij.python.community.testFramework.testEnv
import com.intellij.openapi.diagnostic.fileLogger
import com.jetbrains.python.venvReader.Directory
diff --git a/python/setup-test-environment/src/com/intellij/python/community/testFramework/testEnv/package-info.java b/python/setup-test-environment/src/com/intellij/python/community/testFramework/testEnv/package-info.java
new file mode 100644
index 000000000000..2705b2e28225
--- /dev/null
+++ b/python/setup-test-environment/src/com/intellij/python/community/testFramework/testEnv/package-info.java
@@ -0,0 +1,8 @@
+// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
+/**
+ * Package to access pythons created by community/python/setup-test-environment/build.gradle.kts
+ */
+@ApiStatus.Internal
+package com.intellij.python.community.testFramework.testEnv;
+
+import org.jetbrains.annotations.ApiStatus;
\ No newline at end of file
diff --git a/python/testFramework/intellij.python.community.testFramework.iml b/python/testFramework/intellij.python.community.testFramework.iml
index 9f140677de93..59bde13dd5d8 100644
--- a/python/testFramework/intellij.python.community.testFramework.iml
+++ b/python/testFramework/intellij.python.community.testFramework.iml
@@ -12,5 +12,6 @@
+
\ No newline at end of file
diff --git a/python/testFramework/src/com/jetbrains/python/tools/sdk.kt b/python/testFramework/src/com/jetbrains/python/tools/sdk.kt
index 37d9946a7f33..792bad30926a 100644
--- a/python/testFramework/src/com/jetbrains/python/tools/sdk.kt
+++ b/python/testFramework/src/com/jetbrains/python/tools/sdk.kt
@@ -1,4 +1,4 @@
-// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
+// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.jetbrains.python.tools
import com.intellij.execution.target.FullPathOnTarget
@@ -7,6 +7,7 @@ import com.intellij.openapi.application.writeAction
import com.intellij.openapi.projectRoots.ProjectJdkTable
import com.intellij.openapi.projectRoots.Sdk
import com.intellij.openapi.projectRoots.impl.SdkConfigurationUtil
+import com.intellij.python.community.testFramework.testEnv.PythonType
import com.intellij.remote.RemoteSdkException
import com.intellij.testFramework.utils.vfs.refreshAndGetVirtualFile
import com.jetbrains.python.sdk.PythonSdkType
diff --git a/python/testSrc/com/jetbrains/env/PyEnvTaskRunner.java b/python/testSrc/com/jetbrains/env/PyEnvTaskRunner.java
index 42a5ea6fc20c..93a69b8e4b39 100644
--- a/python/testSrc/com/jetbrains/env/PyEnvTaskRunner.java
+++ b/python/testSrc/com/jetbrains/env/PyEnvTaskRunner.java
@@ -1,4 +1,4 @@
-// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
+// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.jetbrains.env;
import com.google.common.collect.Sets;
@@ -8,15 +8,16 @@ import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.python.community.testFramework.testEnv.EnvTagsKt;
import com.intellij.util.ObjectUtils;
import com.intellij.util.containers.ContainerUtil;
import com.jetbrains.LoggingRule;
import com.jetbrains.python.psi.LanguageLevel;
import com.jetbrains.python.sdk.PySdkUtil;
-import com.jetbrains.python.venvReader.VirtualEnvReader;
import com.jetbrains.python.sdk.flavors.PythonSdkFlavor;
import com.jetbrains.python.tools.sdkTools.PySdkTools;
import com.jetbrains.python.tools.sdkTools.SdkCreationType;
+import com.jetbrains.python.venvReader.VirtualEnvReader;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -24,7 +25,6 @@ import java.io.File;
import java.nio.file.Path;
import java.util.*;
-import static com.jetbrains.python.tools.EnvTagsKt.loadEnvTags;
public class PyEnvTaskRunner {
private static final Logger LOG = Logger.getInstance(PyEnvTaskRunner.class);
@@ -178,7 +178,7 @@ public class PyEnvTaskRunner {
EnvInfo(@NotNull String root) {
this.root = root;
- tags = loadEnvTags(Path.of(root)).stream().toList();
+ tags = EnvTagsKt.loadEnvTags(Path.of(root)).stream().toList();
pythonVersion = ContainerUtil.find(tags, tag -> tag.matches("^python\\d\\.\\d+$"));
}
diff --git a/python/testSrc/com/jetbrains/env/PyEnvTestCase.java b/python/testSrc/com/jetbrains/env/PyEnvTestCase.java
index eee220de92ec..e2995a4a52cc 100644
--- a/python/testSrc/com/jetbrains/env/PyEnvTestCase.java
+++ b/python/testSrc/com/jetbrains/env/PyEnvTestCase.java
@@ -1,4 +1,4 @@
-// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
+// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.jetbrains.env;
import com.intellij.openapi.Disposable;
@@ -6,13 +6,14 @@ import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.newvfs.impl.VfsRootAccess;
+import com.intellij.python.community.testFramework.testEnv.EnvTagsKt;
+import com.intellij.python.community.testFramework.testEnv.PyEnvTestSettings;
import com.intellij.testFramework.UsefulTestCase;
import com.intellij.util.ArrayUtil;
import com.intellij.util.ArrayUtilRt;
import com.intellij.util.containers.ContainerUtil;
import com.jetbrains.LoggingRule;
import com.jetbrains.python.sdk.flavors.PythonSdkFlavor;
-import com.jetbrains.python.tools.PyEnvTestSettings;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.junit.*;
@@ -25,7 +26,6 @@ import java.nio.file.Path;
import java.util.*;
import static com.intellij.testFramework.assertions.Assertions.assertThat;
-import static com.jetbrains.python.tools.EnvTagsKt.loadEnvTags;
/**
*
@@ -123,14 +123,10 @@ public abstract class PyEnvTestCase {
@BeforeClass
public static void collectTagsForEnvs() {
for (final String pythonRoot : getDefaultPythonRoots()) {
- envTags.put(pythonRoot, loadEnvTags(Path.of(pythonRoot)).stream().toList());
+ envTags.put(pythonRoot, EnvTagsKt.loadEnvTags(Path.of(pythonRoot)).stream().toList());
}
}
- protected boolean runInDispatchThread() {
- return false;
- }
-
/**
* Runs task on several envs. If you care about exception thrown from task use {@link #runPythonTestWithException(PyTestTask)}
*/
diff --git a/python/testSrc/com/jetbrains/env/python/PyEnvSufficiencyTest.java b/python/testSrc/com/jetbrains/env/python/PyEnvSufficiencyTest.java
index f7229b6774c0..962cdaaf69e6 100644
--- a/python/testSrc/com/jetbrains/env/python/PyEnvSufficiencyTest.java
+++ b/python/testSrc/com/jetbrains/env/python/PyEnvSufficiencyTest.java
@@ -1,9 +1,10 @@
-// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
+// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.jetbrains.env.python;
import com.google.common.collect.ImmutableList;
import com.intellij.openapi.util.SystemInfo;
import com.intellij.openapi.util.text.StringUtil;
+import com.intellij.python.community.testFramework.testEnv.EnvTagsKt;
import com.intellij.testFramework.UsefulTestCase;
import com.jetbrains.env.PyEnvTestCase;
import org.junit.Test;
@@ -12,7 +13,6 @@ import java.nio.file.Path;
import java.util.*;
import static com.intellij.testFramework.UsefulTestCase.assertEmpty;
-import static com.jetbrains.python.tools.EnvTagsKt.loadEnvTags;
public class PyEnvSufficiencyTest extends PyEnvTestCase {
private static final List BASE_TAGS =
@@ -28,7 +28,7 @@ public class PyEnvSufficiencyTest extends PyEnvTestCase {
return; // not on env agent
}
for (String root : roots) {
- tags.addAll(loadEnvTags(Path.of(root)));
+ tags.addAll(EnvTagsKt.loadEnvTags(Path.of(root)));
}
List missing = new ArrayList<>();
diff --git a/python/testSrc/com/jetbrains/env/python/PySDKRule.kt b/python/testSrc/com/jetbrains/env/python/PySDKRule.kt
index 14eccfd98845..abb9589a357a 100644
--- a/python/testSrc/com/jetbrains/env/python/PySDKRule.kt
+++ b/python/testSrc/com/jetbrains/env/python/PySDKRule.kt
@@ -1,10 +1,10 @@
-// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
+// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.jetbrains.env.python
import com.intellij.execution.target.TargetEnvironmentConfiguration
import com.intellij.openapi.projectRoots.Sdk
-import com.jetbrains.python.tools.PyEnvTestSettings
-import com.jetbrains.python.tools.SdkCreationRequest.*
+import com.jetbrains.python.tools.SdkCreationRequest.LocalPython
+import com.jetbrains.python.tools.SdkCreationRequest.RemotePython
import com.jetbrains.python.tools.createSdk
import kotlinx.coroutines.runBlocking
import org.junit.rules.ExternalResource
@@ -13,7 +13,7 @@ import org.junit.rules.ExternalResource
/**
* Creates python SDK either local (if [targetConfigProducer] is null) or target.
* In case of target, it should have [com.jetbrains.python.tools.PYTHON_PATH_ON_TARGET]
- * Locals are search automatically like in [PyEnvTestSettings] or using [com.jetbrains.python.sdk.flavors.PythonSdkFlavor.suggestLocalHomePaths]
+ * Locals are search automatically like in [com.intellij.python.community.testFramework.testEnv.PyEnvTestSettings] or using [com.jetbrains.python.sdk.flavors.PythonSdkFlavor.suggestLocalHomePaths]
*/
class PySDKRule(private val targetConfigProducer: (() -> TargetEnvironmentConfiguration)?) : ExternalResource() {
diff --git a/python/testSrc/com/jetbrains/env/python/conda/LocalCondaRule.kt b/python/testSrc/com/jetbrains/env/python/conda/LocalCondaRule.kt
index efd1f4641b65..14137f58da9a 100644
--- a/python/testSrc/com/jetbrains/env/python/conda/LocalCondaRule.kt
+++ b/python/testSrc/com/jetbrains/env/python/conda/LocalCondaRule.kt
@@ -1,9 +1,9 @@
-// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
+// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.jetbrains.env.python.conda
import com.intellij.execution.target.FullPathOnTarget
import com.intellij.execution.target.local.LocalTargetEnvironmentRequest
-import com.jetbrains.python.tools.PythonType
+import com.intellij.python.community.testFramework.testEnv.PythonType
import com.jetbrains.python.sdk.conda.TargetCommandExecutor
import com.jetbrains.python.sdk.conda.TargetEnvironmentRequestCommandExecutor
import com.jetbrains.python.sdk.flavors.conda.PyCondaCommand