def recurse(ext): # ext comes as unicode from the database sext = str(ext) info = coreaux_api.import_extension_info(sext) try: deps = list(info.dependencies) except AttributeError: deps = [] try: opts = list(info.optional_dependencies) except AttributeError: opts = [] for dep in deps + opts: dsplit = dep[0].split('.') if dsplit[0] == 'extensions': if dsplit[1] in inexts: recurse(dsplit[1]) inexts.remove(ext) outexts.append(sext)
def create(filename): if filename in dbs: raise exceptions.DatabaseAlreadyOpenError() else: try: db = open(filename, 'w') except IOError as e: if e.errno in (errno.EACCES, errno.ENOENT): # errno.ENOENT happens when trying to to do a save as in # a non-authorized folder raise exceptions.AccessDeniedError() raise else: db.close() conn = FileDB(filename) cursor = conn.cursor() cursor.execute(queries.properties_create) limit = coreaux_api.get_configuration()('History').get_int( 'default_soft_limit') cursor.execute(queries.properties_insert_init, (limit, )) cursor.execute(queries.compatibility_create) # Only store major versions, as they are supposed to keep # backward compatibility # None must be used for core, because it must be safe in case # an extension is called 'core' for some reason cursor.execute(queries.compatibility_insert, ( None, int(float(outspline.info.core.version)), )) cursor.execute(queries.items_create) cursor.execute(queries.history_create) conn.save_and_disconnect() extensions = coreaux_api.get_enabled_installed_addons( )['Extensions'] dbdeps.Database(filename).add([ ext for ext in extensions if coreaux_api.import_extension_info(ext).affects_database ]) return filename
def _init_dependencies(self): self.propgrid.Append(wxpg.PropertyCategory("Extensions support", "dependencies")) extensions = coreaux_api.get_enabled_installed_addons()['Extensions'] self.dependencies = core_api.get_database_dependencies(self.filename, ignored=True) del self.dependencies[None] for ext in extensions: if coreaux_api.import_extension_info(ext).affects_database: propname = "dependencies.{}".format(ext) prop = wxpg.EnumProperty(ext, propname, ('Enabled', 'Disabled (remind)', 'Disabled (ignore)')) prop.SetClientData(ext) self.onchange_actions[propname] = self._change_dependencies self.propgrid.Append(prop) self.refresh_dependency(ext)
def create(filename): if filename in dbs: raise exceptions.DatabaseAlreadyOpenError() else: try: db = open(filename, 'w') except IOError as e: if e.errno in (errno.EACCES, errno.ENOENT): # errno.ENOENT happens when trying to to do a save as in # a non-authorized folder raise exceptions.AccessDeniedError() raise else: db.close() conn = FileDB(filename) cursor = conn.cursor() cursor.execute(queries.properties_create) limit = coreaux_api.get_configuration()('History').get_int( 'default_soft_limit') cursor.execute(queries.properties_insert_init, (limit, )) cursor.execute(queries.compatibility_create) # Only store major versions, as they are supposed to keep # backward compatibility # None must be used for core, because it must be safe in case # an extension is called 'core' for some reason cursor.execute(queries.compatibility_insert, (None, int(float(outspline.info.core.version)), )) cursor.execute(queries.items_create) cursor.execute(queries.history_create) conn.save_and_disconnect() extensions = coreaux_api.get_enabled_installed_addons()[ 'Extensions'] dbdeps.Database(filename).add([ext for ext in extensions if coreaux_api.import_extension_info(ext ).affects_database]) return filename
def __init__(self, filename): # I have to import here, or a circular import will happen from outspline.core.databases import FileDB self.FileDB = FileDB self.filename = filename connection = FileDB(filename) cursor = connection.cursor() cursor.execute(queries.compatibility_select) # ABORT - If a dependency is not installed # ABORT - If a dependency is installed with a lesser version number # OK - If a dependency is installed with the correct version number # IGNORE - If a dependency is disabled and set to be ignored in the # CoMpatibility table # UPDATE - If a dependency is installed with a greater version number # ADD - If an extension is not present in the dependencies extensions = coreaux_api.get_enabled_installed_addons()['Extensions'] self.dependencies = { 'ignore': {}, 'add': {}, 'update': {}, 'abort': {}, } self.fdeps = [] # Only compare major versions, as they are supposed to keep backward # compatibility # Core must be stored as None in the database to avoid clashes with a # possible extension called 'core' self.dependencies['add'][None] = [ int(float(outspline.info.core.version)), None ] for ext in extensions: info = coreaux_api.import_extension_info(ext) if info.affects_database: # Core will never end up staying in the 'add' key, however # initialize it here so that it can be moved like the # extensions # Only compare major versions, as they are supposed to keep # backward compatibility self.dependencies['add'][ext] = [ int(info.version.split(".", 1)[0]), None ] for row in cursor: # 'row[2] == None' means that the addon is not a dependency, but if # installed it shouldn't trigger a reminder to enable it # Don't just test `if row[2]:` because '0' should not pass try: dep = self.dependencies['add'][row[1]] except KeyError: if row[2] is None: pass else: self.dependencies['abort'][row[1]] = [None, row[2]] else: if row[2] is None: self.dependencies['ignore'][row[1]] = dep[:] else: dep[1] = row[2] if row[2] > dep[0]: self.dependencies['abort'][row[1]] = dep[:] elif row[2] < dep[0]: self.dependencies['update'][row[1]] = dep[:] else: version = row[2] if row[1] is None: self.fdeps.append(('core', version)) else: self.fdeps.append(('.'.join( ('extensions', row[1])), version)) del self.dependencies['add'][row[1]] connection.disconnect()
def _change_dependencies(self, data, value): if core_api.block_databases(): ext = data newchoice = value try: ver = self.dependencies[ext] except KeyError: currchoice = 1 else: if ver is None: currchoice = 2 else: currchoice = 0 # This method shouldn't be triggered if the value is not changed, # so there's no need to check that newchoice != currchoice if currchoice == 0: reverse_deps = [] for udep in self.dependencies: dep = str(udep) # Core (None) has been removed from self.dependencies if self.dependencies[dep] is not None: try: ddeps = list( coreaux_api.import_extension_info( dep).dependencies) except AttributeError: ddeps = [] for ddep in ddeps: if ddep[0] == 'extensions.{}'.format(ext): reverse_deps.append(dep) if reverse_deps: self.refresh_dependency(ext) msgboxes.warn_disable_dependency(reverse_deps).ShowModal() else: # The dialog should be completely independent from this # object, because if the operation is confirmed, it needs # to close the database, including the properties tab (so # use CallAfter) wx.CallAfter(DependencyDialogDisable, self.filename, ext, newchoice, self.manager) else: if newchoice == 0: try: deps = list( coreaux_api.import_extension_info( ext).dependencies) except AttributeError: deps = [] missing_deps = [] for dep in deps: sdep = dep[0].split(".") if sdep[0] == 'extensions': try: ver = self.dependencies[sdep[1]] except KeyError: if coreaux_api.import_extension_info( sdep[1]).affects_database: missing_deps.append(sdep[1]) else: if ver is None: missing_deps.append(sdep[1]) if missing_deps: self.refresh_dependency(ext) msgboxes.warn_enable_dependency( missing_deps).ShowModal() else: # The dialog should be completely independent from this # object, because if the operation is confirmed, it # needs to close the database, including the properties # tab (so use CallAfter) wx.CallAfter(DependencyDialogEnable, self.filename, ext, newchoice, self.manager) else: if newchoice == 1: core_api.remove_database_ignored_dependency( self.filename, ext) del self.dependencies[ext] else: core_api.add_database_ignored_dependency( self.filename, ext) self.dependencies[ext] = None self.refresh_dependency(ext) core_api.release_databases()
def __init__(self, filename): # I have to import here, or a circular import will happen from outspline.core.databases import FileDB self.FileDB = FileDB self.filename = filename connection = FileDB(filename) cursor = connection.cursor() cursor.execute(queries.compatibility_select) # ABORT - If a dependency is not installed # ABORT - If a dependency is installed with a lesser version number # OK - If a dependency is installed with the correct version number # IGNORE - If a dependency is disabled and set to be ignored in the # CoMpatibility table # UPDATE - If a dependency is installed with a greater version number # ADD - If an extension is not present in the dependencies extensions = coreaux_api.get_enabled_installed_addons()['Extensions'] self.dependencies = { 'ignore': {}, 'add': {}, 'update': {}, 'abort': {}, } self.fdeps = [] # Only compare major versions, as they are supposed to keep backward # compatibility # Core must be stored as None in the database to avoid clashes with a # possible extension called 'core' self.dependencies['add'][None] = [int(float( outspline.info.core.version)), None] for ext in extensions: info = coreaux_api.import_extension_info(ext) if info.affects_database: # Core will never end up staying in the 'add' key, however # initialize it here so that it can be moved like the # extensions # Only compare major versions, as they are supposed to keep # backward compatibility self.dependencies['add'][ext] = [int(info.version.split( ".", 1)[0]), None] for row in cursor: # 'row[2] == None' means that the addon is not a dependency, but if # installed it shouldn't trigger a reminder to enable it # Don't just test `if row[2]:` because '0' should not pass try: dep = self.dependencies['add'][row[1]] except KeyError: if row[2] is None: pass else: self.dependencies['abort'][row[1]] = [None, row[2]] else: if row[2] is None: self.dependencies['ignore'][row[1]] = dep[:] else: dep[1] = row[2] if row[2] > dep[0]: self.dependencies['abort'][row[1]] = dep[:] elif row[2] < dep[0]: self.dependencies['update'][row[1]] = dep[:] else: version = row[2] if row[1] is None: self.fdeps.append(('core', version)) else: self.fdeps.append(('.'.join(('extensions', row[1])), version)) del self.dependencies['add'][row[1]] connection.disconnect()
def _change_dependencies(self, data, value): if core_api.block_databases(): ext = data newchoice = value try: ver = self.dependencies[ext] except KeyError: currchoice = 1 else: if ver is None: currchoice = 2 else: currchoice = 0 # This method shouldn't be triggered if the value is not changed, # so there's no need to check that newchoice != currchoice if currchoice == 0: reverse_deps = [] for udep in self.dependencies: dep = str(udep) # Core (None) has been removed from self.dependencies if self.dependencies[dep] is not None: try: ddeps = list(coreaux_api.import_extension_info( dep).dependencies) except AttributeError: ddeps = [] for ddep in ddeps: if ddep[0] == 'extensions.{}'.format(ext): reverse_deps.append(dep) if reverse_deps: self.refresh_dependency(ext) msgboxes.warn_disable_dependency(reverse_deps).ShowModal() else: # The dialog should be completely independent from this # object, because if the operation is confirmed, it needs # to close the database, including the properties tab (so # use CallAfter) wx.CallAfter(DependencyDialogDisable, self.filename, ext, newchoice, self.manager) else: if newchoice == 0 : try: deps = list(coreaux_api.import_extension_info( ext).dependencies) except AttributeError: deps = [] missing_deps = [] for dep in deps: sdep = dep[0].split(".") if sdep[0] == 'extensions': try: ver = self.dependencies[sdep[1]] except KeyError: if coreaux_api.import_extension_info(sdep[1] ).affects_database: missing_deps.append(sdep[1]) else: if ver is None: missing_deps.append(sdep[1]) if missing_deps: self.refresh_dependency(ext) msgboxes.warn_enable_dependency(missing_deps ).ShowModal() else: # The dialog should be completely independent from this # object, because if the operation is confirmed, it # needs to close the database, including the properties # tab (so use CallAfter) wx.CallAfter(DependencyDialogEnable, self.filename, ext, newchoice, self.manager) else: if newchoice == 1: core_api.remove_database_ignored_dependency( self.filename, ext) del self.dependencies[ext] else: core_api.add_database_ignored_dependency(self.filename, ext) self.dependencies[ext] = None self.refresh_dependency(ext) core_api.release_databases()