예제 #1
0
    def list_warnings(self, internet_available: bool) -> List[str]:
        if snap.is_installed():
            if not snap.is_snapd_running():
                snap_bold = bold('Snap')
                return [
                    self.i18n['snap.notification.snapd_unavailable'].format(
                        bold('snapd'), snap_bold),
                    self.i18n['snap.notification.snap.disable'].format(
                        snap_bold,
                        bold('{} > {}'.format(
                            self.i18n['settings'].capitalize(),
                            self.i18n['core.config.tab.types'])))
                ]

            elif internet_available:
                available, output = snap.is_api_available()

                if not available:
                    self.logger.warning(
                        'It seems Snap API is not available. Search output: {}'
                        .format(output))
                    return [
                        self.i18n['snap.notifications.api.unavailable'].format(
                            bold('Snaps'), bold('Snap'))
                    ]
예제 #2
0
파일: controller.py 프로젝트: dik-b/bauh
    def search(self,
               words: str,
               disk_loader: DiskCacheLoader,
               limit: int = -1) -> SearchResult:
        if snap.is_snapd_running():
            installed = self.read_installed(disk_loader).installed

            res = SearchResult([], [], 0)

            for app_json in snap.search(words):

                already_installed = None

                if installed:
                    already_installed = [
                        i for i in installed if i.id == app_json.get('name')
                    ]
                    already_installed = already_installed[
                        0] if already_installed else None

                if already_installed:
                    res.installed.append(already_installed)
                else:
                    res.new.append(
                        self.map_json(app_json,
                                      installed=False,
                                      disk_loader=disk_loader))

            res.total = len(res.installed) + len(res.new)
            return res
        else:
            return SearchResult([], [], 0)
예제 #3
0
파일: controller.py 프로젝트: dik-b/bauh
    def list_suggestions(self, limit: int) -> List[PackageSuggestion]:
        res = []

        if snap.is_snapd_running():
            sugs = [(i, p) for i, p in suggestions.ALL.items()]
            sugs.sort(key=lambda t: t[1].value, reverse=True)

            threads = []
            self.categories_downloader.join()

            for sug in sugs:

                if limit <= 0 or len(res) < limit:
                    t = Thread(target=self._fill_suggestion,
                               args=(sug[0], sug[1], res))
                    t.start()
                    threads.append(t)
                    time.sleep(0.001)  # to avoid being blocked
                else:
                    break

            for t in threads:
                t.join()

            res.sort(key=lambda s: s.priority.value, reverse=True)
        return res
예제 #4
0
    def list_suggestions(self, limit: int,
                         filter_installed: bool) -> List[PackageSuggestion]:
        res = []

        if snap.is_snapd_running():
            self.logger.info(
                'Downloading suggestions file {}'.format(SUGGESTIONS_FILE))
            file = self.http_client.get(SUGGESTIONS_FILE)

            if not file or not file.text:
                self.logger.warning(
                    "No suggestion found in {}".format(SUGGESTIONS_FILE))
                return res
            else:
                self.logger.info('Mapping suggestions')
                self.categories_downloader.join()

                suggestions, threads = [], []
                installed = {
                    i.name.lower()
                    for i in self.read_installed(disk_loader=None).installed
                } if filter_installed else None

                for l in file.text.split('\n'):
                    if l:
                        if limit <= 0 or len(suggestions) < limit:
                            sug = l.strip().split('=')
                            name = sug[1]

                            if not installed or name not in installed:
                                cached_sug = self.suggestions_cache.get(name)

                                if cached_sug:
                                    res.append(cached_sug)
                                else:
                                    t = Thread(target=self._fill_suggestion,
                                               args=(name,
                                                     SuggestionPriority(
                                                         int(sug[0])), res))
                                    t.start()
                                    threads.append(t)
                                    time.sleep(0.001)  # to avoid being blocked
                        else:
                            break

                for t in threads:
                    t.join()

                res.sort(key=lambda s: s.priority.value, reverse=True)
        return res
예제 #5
0
 def read_installed(self,
                    disk_loader: DiskCacheLoader,
                    limit: int = -1,
                    only_apps: bool = False,
                    pkg_types: Set[Type[SoftwarePackage]] = None,
                    internet_available: bool = None) -> SearchResult:
     if snap.is_snapd_running():
         self.categories_downloader.join()
         installed = [
             self.map_json(app_json,
                           installed=True,
                           disk_loader=disk_loader,
                           internet=internet_available)
             for app_json in snap.read_installed(self.ubuntu_distro)
         ]
         return SearchResult(installed, None, len(installed))
     else:
         return SearchResult([], None, 0)
예제 #6
0
    def read_installed(self,
                       disk_loader: DiskCacheLoader,
                       limit: int = -1,
                       only_apps: bool = False,
                       pkg_types: Set[Type[SoftwarePackage]] = None,
                       internet_available: bool = None) -> SearchResult:
        info_path = self.get_info_path()

        if snap.is_snapd_running() and info_path:
            installed = [
                self.map_json(app_json,
                              installed=True,
                              disk_loader=disk_loader,
                              internet=internet_available)
                for app_json in snap.read_installed(info_path)
            ]
            return SearchResult(installed, None, len(installed))
        else:
            return SearchResult([], None, 0)
예제 #7
0
파일: controller.py 프로젝트: jayvdb/bauh
 def list_warnings(self) -> List[str]:
     if snap.is_installed() and not snap.is_snapd_running():
         snap_bold = bold('Snap')
         return [self.i18n['snap.notification.snapd_unavailable'].format(bold('snapd'), snap_bold),
                 self.i18n['snap.notification.snap.disable'].format(snap_bold, bold(self.i18n['manage_window.settings.gems']))]