From 5dfb10f7035862a882041b68f8341ac45705218d Mon Sep 17 00:00:00 2001 From: Mariotaku Date: Wed, 5 Apr 2023 15:01:14 +0900 Subject: [PATCH] prepare for locally hosted manifest --- repogen/apidata.py | 40 +++++++++++++++++++++++++++++----------- repogen/pkg_info.py | 4 +++- repogen/pkg_manifest.py | 1 - 3 files changed, 32 insertions(+), 13 deletions(-) diff --git a/repogen/apidata.py b/repogen/apidata.py index da7ec14..9fd1046 100755 --- a/repogen/apidata.py +++ b/repogen/apidata.py @@ -1,12 +1,13 @@ # -*- coding: utf-8 -*- import json import math +import urllib.parse from os import makedirs from os.path import exists, join +from pathlib import Path from typing import List import more_itertools - from markdown import Markdown from repogen import pkg_info @@ -16,6 +17,21 @@ MANIFEST_KEYS = ('id', 'title', 'iconUri', 'manifestUrl', 'manifest', 'manifestUrlBeta', 'manifestBeta', 'pool') +def fix_manifest_url(item: PackageInfo, app_dir: str): + manifest_url = urllib.parse.urlparse(item['manifestUrl']) + if manifest_url.scheme != 'file': + return + + manifests_dir = Path(app_dir).joinpath('manifests') + if not manifests_dir.exists(): + manifests_dir.mkdir() + manifest = item["manifest"] + manifest_path = manifests_dir.joinpath(f'{manifest["version"]}.json') + with manifest_path.open(mode='w') as mf: + json.dump(manifest, mf) + item['manifestUrl'] = manifest_path.as_posix().removeprefix('content') + + def generate(packages: List[PackageInfo], outdir: str): markdown = Markdown() @@ -37,24 +53,25 @@ def package_item(p_info: PackageInfo, in_apps_dir: bool): packages_length = len(packages) max_page = math.ceil(packages_length / ITEMS_PER_PAGE) - for index, chunk in enumerate( - more_itertools.chunked(packages, ITEMS_PER_PAGE) if packages else [[]] - ): - page = index + 1 - json_file = join(appsdir, '%d.json' % - page) if page > 1 else join(outdir, 'apps.json') - with open(json_file, 'w', encoding='utf-8') as f: + + def save_page(page: int, items: [PackageInfo]): + json_file = join(appsdir, '%d.json' % page) if page > 1 else join(outdir, 'apps.json') + with open(json_file, 'w', encoding='utf-8') as pf: json.dump({ 'paging': { 'page': page, - 'count': len(chunk), + 'count': len(items), 'maxPage': max_page, 'itemsTotal': packages_length, }, - 'packages': list(map(lambda x: package_item(x, page > 1), chunk)) - }, f, indent=2) + 'packages': list(map(lambda x: package_item(x, page > 1), items)) + }, pf, indent=2) + + chunks = more_itertools.chunked(packages, ITEMS_PER_PAGE) if packages else [[]] + for index, chunk in enumerate(chunks): for item in chunk: app_dir = join(appsdir, item['id']) + fix_manifest_url(item, app_dir) releases_dir = join(app_dir, 'releases') if not exists(releases_dir): makedirs(releases_dir) @@ -64,6 +81,7 @@ def package_item(p_info: PackageInfo, in_apps_dir: bool): desc_html = join(app_dir, 'full_description.html') with open(desc_html, 'w', encoding='utf-8') as f: f.write(markdown.convert(item['description'])) + save_page(index + 1, chunk) print('Generated json data for %d packages.' % len(packages)) diff --git a/repogen/pkg_info.py b/repogen/pkg_info.py index 470a372..edb52d4 100644 --- a/repogen/pkg_info.py +++ b/repogen/pkg_info.py @@ -1,6 +1,7 @@ import locale import os from datetime import datetime +from os import path from os.path import isfile, join from typing import TypedDict, Optional, List, NotRequired @@ -32,8 +33,9 @@ class PackageInfo(TypedDict): def from_package_info_file(info_path: str, offline=False) -> Optional[PackageInfo]: - extension = os.path.splitext(info_path)[1] + extension = path.splitext(info_path)[1] content: PackageRegistry + print(f'Parsing package info file {path.basename(info_path)}') if extension == '.yml': pkgid, content = parse_yml_package(info_path) elif extension == '.py': diff --git a/repogen/pkg_manifest.py b/repogen/pkg_manifest.py index ed4b2c7..1e52ae7 100644 --- a/repogen/pkg_manifest.py +++ b/repogen/pkg_manifest.py @@ -4,7 +4,6 @@ from datetime import datetime from email.utils import parsedate_to_datetime from json import JSONDecodeError -from os import path from typing import Tuple, TypedDict, Optional, NotRequired, Literal from urllib.parse import urljoin from urllib.request import url2pathname