Skip to content
Browse files

Add missing lib

  • Loading branch information
elpaso committed Mar 25, 2019
1 parent c6c3d09 commit 2a10c3fcef82f2a26cca6548de7ddc0f6e871c48
Showing with 121 additions and 0 deletions.
  1. +121 −0 python/pyplugin_installer/
@@ -0,0 +1,121 @@
# coding=utf-8
"""Parse plugin metadata for plugin_dependencies
.. note:: This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

__author__ = ''
__date__ = '2018-05-29'
__copyright__ = 'Copyright 2018, GISCE-TI S.L.'

from configparser import NoOptionError, NoSectionError
from .version_compare import compareVersions
from . import installer as plugin_installer
from qgis.utils import updateAvailablePlugins

def __plugin_name_map(plugin_data_values):
return {
plugin['name']: plugin['id']
for plugin in plugin_data_values

def __get_plugin_deps(plugin_id):

result = {}
parser = updateAvailablePlugins()[plugin_id]
plugin_deps = parser.get('general', 'plugin_dependencies')
except (NoOptionError, NoSectionError):
return result

for dep in plugin_deps.split(','):
if dep.find('==') > 0:
name, version_required = dep.split('==')
name = dep
version_required = None
result[name] = version_required
return result

def find_dependencies(plugin_id, plugin_data=None, plugin_deps=None, installed_plugins=None):
"""Finds the plugin dependencies and checks if they can be installed or upgraded
:param plugin_id: plugin id
:type plugin_id: str
:param plugin_data: for testing only: dictionary of plugin data from the repo, defaults to None
:param plugin_data: dict, optional
:param plugin_deps: for testing only: dict of plugin id -> version_required, parsed from metadata value for "plugin_dependencies", defaults to None
:param plugin_deps: dict, optional
:param installed_plugins: for testing only: dict of plugin id -> version_installed
:param installed_plugins: dict, optional
:return: result dictionaries keyed by plugin name with: to_install, to_upgrade, not_found
:rtype: tuple of dicts

to_install = {}
to_upgrade = {}
not_found = {}

if plugin_deps is None:
plugin_deps = __get_plugin_deps(plugin_id)

if installed_plugins is None:
metadata_parser = updateAvailablePlugins()
installed_plugins = {metadata_parser[k].get('general', 'name'): metadata_parser[k].get('general', 'version') for k, v in metadata_parser.items()}

if plugin_data is None:
plugin_data = plugin_installer.plugins.all()

plugins_map = __plugin_name_map(plugin_data.values())

# Review all dependencies
for name, version_required in plugin_deps.items():
p_id = plugins_map[name]
except KeyError:
not_found.update({name: {
'id': None,
'version_installed': None,
'version_required': None,
'version_available': None,
'action': None,
'error': 'missing_id'

affected_plugin = dict({
"id": p_id,
# "version_installed": installed_plugins.get(p_id, {}).get('installed_plugins', None),
"version_installed": installed_plugins.get(name, None),
"version_required": version_required,
"version_available": plugin_data[p_id].get('version_available', None),
"action": None,

# Install is needed
if name not in installed_plugins:
affected_plugin['action'] = 'install'
destination_list = to_install
# Upgrade is needed
elif version_required is not None and compareVersions(installed_plugins[name], version_required) == 2:
affected_plugin['action'] = 'upgrade'
destination_list = to_upgrade
# TODO @elpaso: review installed but not activated
# No action is needed

if affected_plugin['version_required'] == affected_plugin['version_available'] or affected_plugin['version_required'] is None:
destination_list.update({name: affected_plugin})
affected_plugin['error'] = 'unavailable {}'.format(affected_plugin['action'])
not_found.update({name: affected_plugin})

return to_install, to_upgrade, not_found

0 comments on commit 2a10c3f

Please sign in to comment.
You can’t perform that action at this time.