From 2c4d5533cd5c90059bac799fefa68d24b6aee1af Mon Sep 17 00:00:00 2001 From: noah978 Date: Thu, 8 Jun 2023 00:27:38 -0500 Subject: [PATCH] Fix absoluteVersion comparison, reorder properties --- src/altparse/core.py | 5 +- src/altparse/model.py | 173 +++++++++++++++++++++--------------------- 2 files changed, 90 insertions(+), 88 deletions(-) diff --git a/src/altparse/core.py b/src/altparse/core.py index 8b5f244..d45a17f 100644 --- a/src/altparse/core.py +++ b/src/altparse/core.py @@ -263,5 +263,8 @@ def save(self, alternate_dir: Path | str | None = None, prettify: bool = True, o """ full_src = dict(self.src) if only_standard_props else self.src.to_dict() with open(alternate_dir or self.src.path, "w", encoding="utf-8") as fp: - json.dump(full_src, fp, indent = 2 if prettify else None) + if prettify: + json.dump(full_src, fp, sort_keys=False, indent=2) + else: + json.dump(full_src, fp) fp.write("\n") # add missing newline to EOF diff --git a/src/altparse/model.py b/src/altparse/model.py index f4803ca..52e540f 100644 --- a/src/altparse/model.py +++ b/src/altparse/model.py @@ -268,8 +268,9 @@ def __init__(self, src: dict[str] | None = None): def __lt__(self, other): if isinstance(other, self.__class__): - if (self.absoluteVersion is not None and other.absoluteVersion is not None and - version.parse(self.absoluteVersion) < version.parse(other.absoluteVersion)): return True + if self.absoluteVersion is not None and other.absoluteVersion is not None: + if version.parse(self.absoluteVersion) < version.parse(other.absoluteVersion): return True + else: return False if (version.parse(self.version) < version.parse(other.version)): return True @@ -330,6 +331,14 @@ def calculate_sha256(self, ipa_path: Path | None): if ipa_path is not None: self.sha256 = extract_sha256(ipa_path) + ### Unofficial property ### + @property + def absoluteVersion(self) -> str: + return self._src.get("absoluteVersion") + @absoluteVersion.setter + def absoluteVersion(self, value: str): + self._src["absoluteVersion"] = value + @property def version(self) -> str: return self._src.get("version") @@ -337,6 +346,13 @@ def version(self) -> str: def version(self, value: str): self._src["version"] = value + @property + def buildVersion(self) -> str: + return self._src.get("buildVersion") + @buildVersion.setter + def buildVersion(self, value: str): + self._src["buildVersion"] = value + @property def date(self) -> str: return self._src.get("date") @@ -344,6 +360,13 @@ def date(self) -> str: def date(self, value: str): self._src["date"] = value + @property + def localizedDescription(self) -> str: + return self._src.get("localizedDescription") + @localizedDescription.setter + def localizedDescription(self, value: str): + self._src["localizedDescription"] = value + @property def downloadURL(self) -> str: return self._src.get("downloadURL") @@ -352,10 +375,10 @@ def downloadURL(self, value: str): self._src["downloadURL"] = value @property - def size(self) -> str: + def size(self) -> int: return self._src.get("size") @size.setter - def size(self, value: str): + def size(self, value: int): self._src["size"] = value @property @@ -366,27 +389,19 @@ def sha256(self, value: str): self._src["sha256"] = value @property - def localizedDescription(self) -> str: - return self._src.get("localizedDescription") - @localizedDescription.setter - def localizedDescription(self, value: str): - self._src["localizedDescription"] = value - - # Start unofficial AltSource properties - + def minOSVersion(self) -> str: + return self._src.get("minOSVersion") + @minOSVersion.setter + def minOSVersion(self, value: str): + self._src["minOSVersion"] = value + @property - def buildVersion(self) -> str: - return self._src.get("buildVersion") - @buildVersion.setter - def buildVersion(self, value: str): - self._src["buildVersion"] = value + def maxOSVersion(self) -> str: + return self._src.get("maxOSVersion") + @maxOSVersion.setter + def maxOSVersion(self, value: str): + self._src["maxOSVersion"] = value - @property - def absoluteVersion(self) -> str: - return self._src.get("absoluteVersion") - @absoluteVersion.setter - def absoluteVersion(self, value: str): - self._src["absoluteVersion"] = value # End class Version _required_keys = ["name", "bundleIdentifier", "developerName", "versions", "localizedDescription", "iconURL"] @@ -474,7 +489,7 @@ def latest_version(self, use_dates: bool = False) -> Version: def add_version(self, ver: Version): versions_list = [(ver.version,ver.buildVersion) for ver in self.versions] if (ver.version,ver.buildVersion) in versions_list: - logging.warning("Version already exists in AltSource. Automatically replaced with new one.") + logging.warning(f"Version already exists in {self.name}. Automatically replaced with new one.") self.versions[versions_list.index((ver.version,ver.buildVersion))] = ver else: self.versions.insert(0,ver) @@ -519,15 +534,6 @@ def subtitle(self) -> str: def subtitle(self, value: str): self._src["subtitle"] = value - @property - def versions(self) -> list[Version]: - return self._src.get("versions",[]) - @versions.setter - def versions(self, value: list[Version]): - if self.versions is not None: - logging.warning(f"Entire `versions` section has been replaced for {self.name}.") - self._src["versions"] = value - @property def localizedDescription(self) -> str: return self._src.get("localizedDescription") @@ -549,19 +555,21 @@ def tintColor(self) -> str: def tintColor(self, value: str): self._src["tintColor"] = value - @property - def beta(self) -> bool: - return self._src.get("beta") - @beta.setter - def beta(self, value: bool): - self._src["beta"] = value - @property def screenshotURLs(self) -> list[str]: return self._src.get("screenshotURLs") @screenshotURLs.setter def screenshotURLs(self, value: list[str]): self._src["screenshotURLs"] = value + + @property + def versions(self) -> list[Version]: + return self._src.get("versions",[]) + @versions.setter + def versions(self, value: list[Version]): + if self.versions is not None: + logging.warning(f"Entire `versions` section has been replaced for {self.name}.") + self._src["versions"] = value @property def appPermissions(self) -> Permissions: @@ -570,6 +578,13 @@ def appPermissions(self) -> Permissions: def appPermissions(self, value: Permissions): self._src["appPermissions"] = value + @property + def beta(self) -> bool: + return self._src.get("beta") + @beta.setter + def beta(self, value: bool): + self._src["beta"] = value + ### Deprecated properties ### @property @@ -688,13 +703,6 @@ def title(self) -> str: def title(self, value: str): self._src["title"] = value - @property - def name(self) -> str: - return self._src.get("name") - @name.setter - def name(self, value: str): - self._src["name"] = value - @property def identifier(self) -> str: return self._src.get("identifier") @@ -710,6 +718,13 @@ def caption(self) -> str: def caption(self, value: str): self._src["caption"] = value + @property + def date(self) -> str: + return self._src.get("date") + @date.setter + def date(self, value: str): + self._src["date"] = value + @property def tintColor(self) -> str: return self._src.get("tintColor") @@ -724,20 +739,6 @@ def imageURL(self) -> str: def imageURL(self, value: str): self._src["imageURL"] = value - @property - def appID(self) -> str: - return self._src.get("appID") - @appID.setter - def appID(self, value: str): - self._src["appID"] = value - - @property - def date(self) -> str: - return self._src.get("date") - @date.setter - def date(self, value: str): - self._src["date"] = value - @property def notify(self) -> bool: return self._src.get("notify") @@ -751,6 +752,13 @@ def url(self) -> str: @url.setter def url(self, value: str): self._src["url"] = value + + @property + def appID(self) -> str: + return self._src.get("appID") + @appID.setter + def appID(self, value: str): + self._src["appID"] = value # End class Article _required_keys = ["name", "identifier", "apps"] @@ -768,7 +776,7 @@ def __init__(self, src: dict | None = None, path: str | Path | None = None): self._src["apps"] = [self.App(app) for app in src.get("apps", [])] if "news" in self._src.keys(): self._src["news"] = [self.Article(art) for art in src["news"]] - self.version = 2 # set current API version + self.apiVersion = "v2" # set current API version missing_keys = self.missing_keys() if missing_keys: @@ -830,6 +838,15 @@ def identifier(self) -> str: def identifier(self, value: str): logging.warning(f"Source `identifier` changed from {self._src['identifier']} to {value}.") self._src["identifier"] = value + + ### Unofficial AltSource property ### + @property + def apiVersion(self) -> str: + """Used to declare the AltSource API version.""" + return self._src.get("apiVersion") + @apiVersion.setter + def apiVersion(self, value: str): + self._src["apiVersion"] = value @property def subtitle(self) -> str: @@ -844,13 +861,6 @@ def description(self) -> str: @description.setter def description(self, value: str): self._src["description"] = value - - @property - def headerURL(self) -> str: - return self._src.get("headerURL") - @headerURL.setter - def headerURL(self, value: str): - self._src["headerURL"] = value @property def iconURL(self) -> str: @@ -858,6 +868,13 @@ def iconURL(self) -> str: @iconURL.setter def iconURL(self, value: str): self._src["iconURL"] = value + + @property + def headerURL(self) -> str: + return self._src.get("headerURL") + @headerURL.setter + def headerURL(self, value: str): + self._src["headerURL"] = value @property def website(self) -> str: @@ -903,24 +920,6 @@ def userinfo(self) -> dict: @userinfo.setter def userinfo(self, value: dict): self._src["userinfo"] = value - - # Start unofficial AltSource attributes. - - @property - def sourceURL(self) -> str: - return self._src.get("sourceURL") - @sourceURL.setter - def sourceURL(self, value: str): - self._src["sourceURL"] = value - - @property - def version(self) -> str: - """Used to declare the AltSource API version. - """ - return self._src.get("version") - @version.setter - def version(self, value: str): - self._src["version"] = value # End class AltSource def altsource_from_file(filepath: Path | str) -> AltSource: