Exemple #1
0
        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)
Exemple #2
0
        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)
Exemple #3
0
    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
Exemple #4
0
    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)
Exemple #5
0
    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)
Exemple #6
0
    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
Exemple #7
0
    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()
Exemple #8
0
    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()
Exemple #9
0
    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()
Exemple #10
0
    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()