Add possibility for flavor to patch command line before execution (https://github...
[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
70   @NotNull
71   public static String appendToPathEnvVar(@Nullable String source, @NotNull String value) {
72     if (StringUtil.isEmpty(source)) return value;
73     Set<String> paths = Sets.newHashSet(source.split(File.pathSeparator));
74     return !paths.contains(value) ? source + File.pathSeparator + value : source;
75   }
76
77   public static void addPathsToEnv(@NotNull Map<String, String> env, String key, @NotNull Collection<String> values) {
78     for (String val : values) {
79       addPathToEnv(env, key, val);
80     }
81   }
82
83   public static void addPathToEnv(@NotNull Map<String, String> env, String key, String value) {
84     if (!StringUtil.isEmpty(value)) {
85       if (env.containsKey(key)) {
86         env.put(key, appendToPathEnvVar(env.get(key), value));
87       }
88       else {
89         env.put(key, value);
90       }
91     }
92   }
93
94   public static void addToPythonPath(@NotNull Map<String, String> env, @NotNull Collection<String> values) {
95     addPathsToEnv(env, PYTHONPATH, values);
96   }
97
98   public static void addToPythonPath(@NotNull Map<String, String> env, String value) {
99     addPathToEnv(env, PYTHONPATH, value);
100   }
101
102   public static void mergePythonPath(@NotNull Map<String, String> from, @NotNull Map<String, String> to) {
103     String value = from.get(PYTHONPATH);
104     if (value != null) {
105       Set<String> paths = Sets.newHashSet(value.split(File.pathSeparator));
106       addToPythonPath(to, paths);
107     }
108   }
109
110   @NotNull
111   public static Map<String, String> setPythonDontWriteBytecode(@NotNull Map<String, String> env) {
112     env.put(PYTHONDONTWRITEBYTECODE, "1");
113     return env;
114   }
115 }