diff --git a/devdocs/devdocs_service.py b/devdocs/devdocs_service.py index af36275..535d12d 100644 --- a/devdocs/devdocs_service.py +++ b/devdocs/devdocs_service.py @@ -3,6 +3,7 @@ import os import time import difflib +import re import requests @@ -54,6 +55,13 @@ def ensure_cache_dirs(self): def set_docs_to_fetch(self, docs): """ Sets the list of docs that we want to fetch """ + if isinstance(docs, str): + try: + docs = json.loads(docs) + except: + docs = [] + + docs = self.version_fallback(docs) self.docs_to_fetch = docs def index(self): @@ -140,3 +148,53 @@ def get_doc_by_slug(self, doc_slug): return doc return None + + def parse_version_to_tuple(self, version_str): + """ + Parses version string (3.10 or 4.1.2) in to a tuple of ints for easy sorting + If segment can't be converted to an int (such as 'beta'), fallback to 0 or handle specially + """ + parts = [] + for part in version_str.split('.'): + try: + parts.append(int(part)) + except ValueError: + parts.append(0) + return tuple(parts) + + def version_fallback(self, docs_to_fetch): + """ + For any doc name in docs_to_fetch that doesn't contain '~' (unversioned), + find if DevDocs has one or more versioned docs that start with that base name + '~'. + Default to highest version among them + """ + r = requests.get(DEVDOCS_INDEX_ALL_URL) + all_docs = r.json() + + base_map = {} + pattern = re.compile(r'^(.+?)~(.+)$') + for doc in all_docs: + slug = doc['slug'] + match = pattern.match(slug) + if match: + base_name = match.group(1) + base_map.setdefault(base_name, []).append(slug) + for base, slugs in base_map.items(): + slug_version_pairs = [] + for s in slugs: + version_part = s.split('~', 1)[1] + slug_version_pairs.append((s, self.parse_version_to_tuple(version_part))) + slug_version_pairs.sort(key=lambda x: x[1]) + base_map[base] = [p[0] for p in slug_version_pairs] + new_docs = [] + for doc in docs_to_fetch: + if '~' in doc: + new_docs.append(doc) + else: + if doc in base_map: + highest_versioned_slug = base_map[doc][-1] + new_docs.append(highest_versioned_slug) + else: + new_docs.append(doc) + + return new_docs diff --git a/main.py b/main.py index 21d5edd..ff7eff1 100644 --- a/main.py +++ b/main.py @@ -19,7 +19,7 @@ from ulauncher.api.shared.action.SetUserQueryAction import SetUserQueryAction from ulauncher.api.shared.action.RunScriptAction import RunScriptAction from ulauncher.api.shared.action.ExtensionCustomAction import ExtensionCustomAction -from ulauncher.config import CACHE_DIR +from ulauncher.utils.migrate import CACHE_PATH from devdocs.devdocs_service import DevDocsService gi.require_version('Notify', '0.7') @@ -47,7 +47,7 @@ def __init__(self): # initialize DevDocs service. self.devdocs_svc = DevDocsService(LOGGING, - os.path.join(CACHE_DIR, 'devdocs')) + os.path.join(CACHE_PATH, 'devdocs')) def index_docs(self): """ Creates a local index of all the DevDocs resources """