aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/pythonextensions/pythonextensionsplugin.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/pythonextensions/pythonextensionsplugin.cpp')
-rw-r--r--plugins/pythonextensions/pythonextensionsplugin.cpp96
1 files changed, 61 insertions, 35 deletions
diff --git a/plugins/pythonextensions/pythonextensionsplugin.cpp b/plugins/pythonextensions/pythonextensionsplugin.cpp
index 3547a59..59b32a1 100644
--- a/plugins/pythonextensions/pythonextensionsplugin.cpp
+++ b/plugins/pythonextensions/pythonextensionsplugin.cpp
@@ -39,6 +39,8 @@
#include <extensionsystem/pluginmanager.h>
#include <extensionsystem/pluginspec.h>
+#include <utils/algorithm.h>
+
#include <QDir>
#include <QIODevice>
#include <QFile>
@@ -131,23 +133,39 @@ QDir PythonExtensionsPlugin::extensionDir()
return extension_dir;
}
-QStringList PythonExtensionsPlugin::extensionList(const bool loadedOnly)
+static QVector<Extension> getExtensionList(const QDir &directory)
{
- if (loadedOnly)
- return m_loadedExtensions;
-
- QDir extension_dir = extensionDir();
- if (!extension_dir.exists())
- return QStringList();
+ if (!directory.exists())
+ return {};
+
+ QStringList entries = directory.entryList(QDir::AllDirs | QDir::NoDotAndDotDot);
+ entries.removeAll("site-packages");
+ entries.removeAll("__pycache__");
+ const QVector<Extension> packageExtensions
+ = Utils::transform<QVector>(entries, [](const QString &entry) {
+ return Extension({entry, false});
+ });
+ const QStringList fileEntries = directory.entryList({"*.py"}, QDir::Files);
+ const QVector<Extension> fileExtensions
+ = Utils::transform<QVector>(fileEntries, [](const QString &entry) {
+ return Extension({entry.left(entry.size() - 3), false});
+ });
+ return packageExtensions + fileExtensions;
+}
- QStringList extension_list = extension_dir.entryList(QDir::AllDirs | QDir::NoDotAndDotDot);
- extension_list.removeOne("site-packages");
- return extension_list;
+QVector<Extension> PythonExtensionsPlugin::extensionList()
+{
+ return extensionListRef();
}
-void PythonExtensionsPlugin::flagAsLoaded(const QString &extension)
+QVector<Extension> &PythonExtensionsPlugin::extensionListRef()
{
- m_loadedExtensions << extension;
+ static bool initialized = false;
+ if (!initialized) {
+ m_extensions = getExtensionList(extensionDir());
+ initialized = true;
+ }
+ return m_extensions;
}
QString PythonExtensionsPlugin::pythonPackagePath()
@@ -162,18 +180,21 @@ QString PythonExtensionsPlugin::pythonPackagePath()
void PythonExtensionsPlugin::initializePythonBindings()
{
// Add our custom module directory
- if (extensionDir().exists()) {
+ if (extensionDir().exists())
PyUtil::addToSysPath(extensionDir().path().toStdString());
- PyUtil::addToSysPath(pythonPackagePath().toStdString());
- }
+ // Add directory for local python packages that are installed as requirements of extensions
+ // Need to create it first if it doesn't exist, otherwise python will ignore the path
+ if (!QFile::exists(pythonPackagePath()))
+ QDir().mkpath(pythonPackagePath());
+ PyUtil::addToSysPath(pythonPackagePath().toStdString());
// Initialize the Python context and register global Qt Creator variable
- if (!PyUtil::bindShibokenModuleObject("PythonExtension", "QtCreator")) {
+ if (!PyUtil::bindCoreModules()) {
qWarning() << "Python bindings could not be initialized";
Core::MessageManager::write(Constants::MESSAGE_MANAGER_PREFIX + tr("Python bindings could not be initialized"));
return;
}
// Bind the plugin instance
- PyUtil::bindObject("PythonExtension", "PluginInstance", PyUtil::PythonExtensionsPluginType, this);
+ PyUtil::bindObject("QtCreator", "PythonExtensions", PyUtil::PythonExtensionsPluginType, this);
}
void PythonExtensionsPlugin::initializeOptionalBindings()
@@ -208,16 +229,18 @@ void PythonExtensionsPlugin::installRequirements()
if (!extension_dir.exists())
return;
- QStringList extension_list = extensionList();
- for (const QString &extension : extension_list) {
- QString extension_requirements(extension_dir.absolutePath() + "/" + extension + "/requirements.txt");
- if (QFileInfo::exists(extension_requirements) && !QFileInfo::exists(extension_requirements + ".installed")) {
- if (!PyUtil::pipInstallRequirements(
- extension_requirements.toStdString(),
- pythonPackagePath().toStdString()
- )) {
- qWarning() << "Failed to install requirements for extension" << extension;
- Core::MessageManager::write(Constants::MESSAGE_MANAGER_PREFIX + tr("Failed to install requirements for extension ") + extension);
+ QVector<Extension> extension_list = extensionListRef();
+ for (const Extension &extension : extension_list) {
+ QString extension_requirements(extension_dir.absolutePath() + "/" + extension.name
+ + "/requirements.txt");
+ if (QFileInfo::exists(extension_requirements)
+ && !QFileInfo::exists(extension_requirements + ".installed")) {
+ if (!PyUtil::pipInstallRequirements(extension_requirements.toStdString(),
+ pythonPackagePath().toStdString())) {
+ qWarning() << "Failed to install requirements for extension" << extension.name;
+ Core::MessageManager::write(Constants::MESSAGE_MANAGER_PREFIX
+ + tr("Failed to install requirements for extension ")
+ + extension.name);
}
}
}
@@ -235,22 +258,25 @@ void PythonExtensionsPlugin::initializePythonExtensions()
qDebug() << "Found Python extension directory at location" << extension_dir.absolutePath();
- QStringList extension_list = extensionList();
+ QVector<Extension> &extension_list = extensionListRef();
qDebug() << "Number of Python extensions found:" << extension_list.size();
+ int loadedCount = 0;
// Run the extension initialization code
- for (const QString &extension : extension_list) {
- qDebug() << "Trying to initialize extension" << extension;
- if (!PyUtil::runScript("import " + extension.toStdString())) {
- qWarning() << "Failed to initialize extension" << extension;
- Core::MessageManager::write(Constants::MESSAGE_MANAGER_PREFIX + tr("Failed to initialize extension ") + extension);
+ for (Extension &extension : extension_list) {
+ qDebug() << "Trying to initialize extension" << extension.name;
+ if (PyUtil::runScript("import " + extension.name.toStdString())) {
+ extension.loaded = true;
+ ++loadedCount;
} else {
- m_loadedExtensions << extension;
+ qWarning() << "Failed to initialize extension" << extension.name;
+ Core::MessageManager::write(Constants::MESSAGE_MANAGER_PREFIX
+ + tr("Failed to initialize extension ") + extension.name);
}
}
- qDebug() << "Number of Python extensions loaded:" << m_loadedExtensions.size();
+ qDebug() << "Number of Python extensions loaded:" << loadedCount;
}
} // namespace Internal