03fed89449b5b9df388d027de1f5cd811f400202
[idea/community.git] / python / src / com / jetbrains / python / sdk / PythonEnvUtil.java
1 /*
2  * Copyright 2000-2014 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.jetbrains.python.sdk;
17
18 import com.google.common.collect.Sets;
19 import com.intellij.openapi.util.text.StringUtil;
20 import com.intellij.util.EnvironmentUtil;
21 import org.jetbrains.annotations.NotNull;
22 import org.jetbrains.annotations.Nullable;
23
24 import java.io.File;
25 import java.util.Collection;
26 import java.util.Map;
27 import java.util.Set;
28
29 /**
30  * @author traff
31  */
32 public class PythonEnvUtil {
33   @SuppressWarnings("SpellCheckingInspection") public static final String PYTHONPATH = "PYTHONPATH";
34   @SuppressWarnings("SpellCheckingInspection") public static final String PYTHONUNBUFFERED = "PYTHONUNBUFFERED";
35   @SuppressWarnings("SpellCheckingInspection") public static final String PYTHONIOENCODING = "PYTHONIOENCODING";
36   @SuppressWarnings("SpellCheckingInspection") public static final String IPYTHONENABLE = "IPYTHONENABLE";
37   @SuppressWarnings("SpellCheckingInspection") public static final String PYTHONDONTWRITEBYTECODE = "PYTHONDONTWRITEBYTECODE";
38   @SuppressWarnings("SpellCheckingInspection") public static final String PYVENV_LAUNCHER = "__PYVENV_LAUNCHER__";
39
40   private PythonEnvUtil() { }
41
42   public static Map<String, String> setPythonUnbuffered(@NotNull Map<String, String> env) {
43     env.put(PYTHONUNBUFFERED, "1");
44     return env;
45   }
46
47   public static Map<String, String> setPythonIOEncoding(@NotNull Map<String, String> env, @NotNull String encoding) {
48     env.put(PYTHONIOENCODING, encoding);
49     return env;
50   }
51
52   /**
53    * Resets the environment variables that affect the way the Python interpreter searches for its settings and libraries.
54    */
55   public static Map<String, String> resetHomePathChanges(@NotNull String homePath, @NotNull Map<String, String> env) {
56     if (System.getenv(PYVENV_LAUNCHER) != null || EnvironmentUtil.getEnvironmentMap().containsKey(PYVENV_LAUNCHER)) {
57       env.put(PYVENV_LAUNCHER, homePath);
58     }
59     return env;
60   }
61
62   /**
63    * Appends a value to the end os a path-like environment variable, using system-dependent path separator.
64    *
65    * @param source path-like string to append to
66    * @param value  what to append
67    * @return modified path-like string
68    */
69   @NotNull
70   public static String appendToPathEnvVar(@Nullable String source, @NotNull String value) {
71     if (StringUtil.isEmpty(source)) return value;
72     Set<String> paths = Sets.newHashSet(source.split(File.pathSeparator));
73     return !paths.contains(value) ? source + File.pathSeparator + value : source;
74   }
75
76   public static void addPathsToEnv(@NotNull Map<String, String> env, String key, @NotNull Collection<String> values) {
77     for (String val : values) {
78       addPathToEnv(env, key, val);
79     }
80   }
81
82   public static void addPathToEnv(@NotNull Map<String, String> env, String key, String value) {
83     if (!StringUtil.isEmpty(value)) {
84       if (env.containsKey(key)) {
85         env.put(key, appendToPathEnvVar(env.get(key), value));
86       }
87       else {
88         env.put(key, value);
89       }
90     }
91   }
92
93   public static void addToPythonPath(@NotNull Map<String, String> env, @NotNull Collection<String> values) {
94     addPathsToEnv(env, PYTHONPATH, values);
95   }
96
97   public static void addToPythonPath(@NotNull Map<String, String> env, String value) {
98     addPathToEnv(env, PYTHONPATH, value);
99   }
100
101   public static void mergePythonPath(@NotNull Map<String, String> from, @NotNull Map<String, String> to) {
102     String value = from.get(PYTHONPATH);
103     if (value != null) {
104       Set<String> paths = Sets.newHashSet(value.split(File.pathSeparator));
105       addToPythonPath(to, paths);
106     }
107   }
108
109   @NotNull
110   public static Map<String, String> setPythonDontWriteBytecode(@NotNull Map<String, String> env) {
111     env.put(PYTHONDONTWRITEBYTECODE, "1");
112     return env;
113   }
114 }