Merge branch 'master' into traff/zip_helpers
[idea/community.git] / python / src / com / jetbrains / python / console / PydevConsoleRunnerFactory.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.console;
17
18 import com.google.common.collect.Maps;
19 import com.intellij.openapi.module.Module;
20 import com.intellij.openapi.module.ModuleManager;
21 import com.intellij.openapi.project.Project;
22 import com.intellij.openapi.projectRoots.Sdk;
23 import com.intellij.openapi.roots.ModuleRootManager;
24 import com.intellij.openapi.util.Pair;
25 import com.intellij.openapi.util.text.StringUtil;
26 import com.intellij.openapi.vfs.VirtualFile;
27 import com.intellij.util.PathMapper;
28 import com.jetbrains.python.buildout.BuildoutFacet;
29 import com.jetbrains.python.run.PythonCommandLineState;
30 import com.jetbrains.python.sdk.PythonEnvUtil;
31 import org.jetbrains.annotations.NotNull;
32 import org.jetbrains.annotations.Nullable;
33
34 import java.util.Collection;
35 import java.util.List;
36 import java.util.Map;
37
38 /**
39 * @author traff
40 */
41 public class PydevConsoleRunnerFactory extends PythonConsoleRunnerFactory {
42   @Override
43   public PydevConsoleRunner createConsoleRunner(@NotNull Project project,
44                                                 @Nullable Module contextModule) {
45     Pair<Sdk, Module> sdkAndModule = PydevConsoleRunner.findPythonSdkAndModule(project, contextModule);
46
47     Module module = sdkAndModule.second;
48     Sdk sdk = sdkAndModule.first;
49
50     assert sdk != null;
51
52     PathMapper pathMapper = PydevConsoleRunner.getPathMapper(project, sdk);
53
54     String[] setupFragment;
55
56     PyConsoleOptions.PyConsoleSettings settingsProvider = PyConsoleOptions.getInstance(project).getPythonConsoleSettings();
57     Collection<String> pythonPath = PythonCommandLineState.collectPythonPath(module, settingsProvider.shouldAddContentRoots(),
58                                                                              settingsProvider.shouldAddSourceRoots());
59
60     if (pathMapper != null) {
61       pythonPath = pathMapper.convertToRemote(pythonPath);
62     }
63
64     String customStartScript = settingsProvider == null ? "" : settingsProvider.getCustomStartScript();
65
66     if (customStartScript.trim().length() > 0) {
67       customStartScript = "\n" + customStartScript;
68     }
69
70     String selfPathAppend = PydevConsoleRunner.constructPythonPathCommand(pythonPath, customStartScript);
71
72     String workingDir = settingsProvider.getWorkingDirectory();
73     if (StringUtil.isEmpty(workingDir)) {
74       if (module != null && ModuleRootManager.getInstance(module).getContentRoots().length > 0) {
75         workingDir = ModuleRootManager.getInstance(module).getContentRoots()[0].getPath();
76       }
77       else {
78         if (ModuleManager.getInstance(project).getModules().length > 0) {
79           VirtualFile[] roots = ModuleRootManager.getInstance(ModuleManager.getInstance(project).getModules()[0]).getContentRoots();
80           if (roots.length > 0) {
81             workingDir = roots[0].getPath();
82           }
83         }
84       }
85     }
86
87     if (pathMapper != null && workingDir != null) {
88       workingDir = pathMapper.convertToRemote(workingDir);
89     }
90
91     BuildoutFacet facet = null;
92     if (module != null) {
93       facet = BuildoutFacet.getInstance(module);
94     }
95
96     if (facet != null) {
97       List<String> path = facet.getAdditionalPythonPath();
98       if (pathMapper != null) {
99         path = pathMapper.convertToRemote(path);
100       }
101       String prependStatement = facet.getPathPrependStatement(path);
102       setupFragment = new String[]{prependStatement, selfPathAppend};
103     }
104     else {
105       setupFragment = new String[]{selfPathAppend};
106     }
107
108     Map<String, String> envs = Maps.newHashMap(settingsProvider.getEnvs());
109     String ipythonEnabled = PyConsoleOptions.getInstance(project).isIpythonEnabled() ? "True" : "False";
110     envs.put(PythonEnvUtil.IPYTHONENABLE, ipythonEnabled);
111
112
113     return createConsoleRunner(project, sdk, workingDir, envs, PyConsoleType.PYTHON, setupFragment);
114   }
115
116   protected PydevConsoleRunner createConsoleRunner(Project project,
117                                                    Sdk sdk,
118                                                    String workingDir,
119                                                    Map<String, String> envs, PyConsoleType consoleType, String ... setupFragment) {
120     return new PydevConsoleRunner(project, sdk, consoleType, workingDir, envs, setupFragment);
121   }
122 }