Skip to content

Commit 2c4d553

Browse files
committed
Fix absoluteVersion comparison, reorder properties
1 parent 639fa55 commit 2c4d553

File tree

2 files changed

+90
-88
lines changed

2 files changed

+90
-88
lines changed

src/altparse/core.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,5 +263,8 @@ def save(self, alternate_dir: Path | str | None = None, prettify: bool = True, o
263263
"""
264264
full_src = dict(self.src) if only_standard_props else self.src.to_dict()
265265
with open(alternate_dir or self.src.path, "w", encoding="utf-8") as fp:
266-
json.dump(full_src, fp, indent = 2 if prettify else None)
266+
if prettify:
267+
json.dump(full_src, fp, sort_keys=False, indent=2)
268+
else:
269+
json.dump(full_src, fp)
267270
fp.write("\n") # add missing newline to EOF

src/altparse/model.py

Lines changed: 86 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -268,8 +268,9 @@ def __init__(self, src: dict[str] | None = None):
268268

269269
def __lt__(self, other):
270270
if isinstance(other, self.__class__):
271-
if (self.absoluteVersion is not None and other.absoluteVersion is not None and
272-
version.parse(self.absoluteVersion) < version.parse(other.absoluteVersion)): return True
271+
if self.absoluteVersion is not None and other.absoluteVersion is not None:
272+
if version.parse(self.absoluteVersion) < version.parse(other.absoluteVersion): return True
273+
else: return False
273274

274275
if (version.parse(self.version) < version.parse(other.version)): return True
275276

@@ -330,20 +331,42 @@ def calculate_sha256(self, ipa_path: Path | None):
330331
if ipa_path is not None:
331332
self.sha256 = extract_sha256(ipa_path)
332333

334+
### Unofficial property ###
335+
@property
336+
def absoluteVersion(self) -> str:
337+
return self._src.get("absoluteVersion")
338+
@absoluteVersion.setter
339+
def absoluteVersion(self, value: str):
340+
self._src["absoluteVersion"] = value
341+
333342
@property
334343
def version(self) -> str:
335344
return self._src.get("version")
336345
@version.setter
337346
def version(self, value: str):
338347
self._src["version"] = value
339348

349+
@property
350+
def buildVersion(self) -> str:
351+
return self._src.get("buildVersion")
352+
@buildVersion.setter
353+
def buildVersion(self, value: str):
354+
self._src["buildVersion"] = value
355+
340356
@property
341357
def date(self) -> str:
342358
return self._src.get("date")
343359
@date.setter
344360
def date(self, value: str):
345361
self._src["date"] = value
346362

363+
@property
364+
def localizedDescription(self) -> str:
365+
return self._src.get("localizedDescription")
366+
@localizedDescription.setter
367+
def localizedDescription(self, value: str):
368+
self._src["localizedDescription"] = value
369+
347370
@property
348371
def downloadURL(self) -> str:
349372
return self._src.get("downloadURL")
@@ -352,10 +375,10 @@ def downloadURL(self, value: str):
352375
self._src["downloadURL"] = value
353376

354377
@property
355-
def size(self) -> str:
378+
def size(self) -> int:
356379
return self._src.get("size")
357380
@size.setter
358-
def size(self, value: str):
381+
def size(self, value: int):
359382
self._src["size"] = value
360383

361384
@property
@@ -366,27 +389,19 @@ def sha256(self, value: str):
366389
self._src["sha256"] = value
367390

368391
@property
369-
def localizedDescription(self) -> str:
370-
return self._src.get("localizedDescription")
371-
@localizedDescription.setter
372-
def localizedDescription(self, value: str):
373-
self._src["localizedDescription"] = value
374-
375-
# Start unofficial AltSource properties
376-
392+
def minOSVersion(self) -> str:
393+
return self._src.get("minOSVersion")
394+
@minOSVersion.setter
395+
def minOSVersion(self, value: str):
396+
self._src["minOSVersion"] = value
397+
377398
@property
378-
def buildVersion(self) -> str:
379-
return self._src.get("buildVersion")
380-
@buildVersion.setter
381-
def buildVersion(self, value: str):
382-
self._src["buildVersion"] = value
399+
def maxOSVersion(self) -> str:
400+
return self._src.get("maxOSVersion")
401+
@maxOSVersion.setter
402+
def maxOSVersion(self, value: str):
403+
self._src["maxOSVersion"] = value
383404

384-
@property
385-
def absoluteVersion(self) -> str:
386-
return self._src.get("absoluteVersion")
387-
@absoluteVersion.setter
388-
def absoluteVersion(self, value: str):
389-
self._src["absoluteVersion"] = value
390405
# End class Version
391406

392407
_required_keys = ["name", "bundleIdentifier", "developerName", "versions", "localizedDescription", "iconURL"]
@@ -474,7 +489,7 @@ def latest_version(self, use_dates: bool = False) -> Version:
474489
def add_version(self, ver: Version):
475490
versions_list = [(ver.version,ver.buildVersion) for ver in self.versions]
476491
if (ver.version,ver.buildVersion) in versions_list:
477-
logging.warning("Version already exists in AltSource. Automatically replaced with new one.")
492+
logging.warning(f"Version already exists in {self.name}. Automatically replaced with new one.")
478493
self.versions[versions_list.index((ver.version,ver.buildVersion))] = ver
479494
else:
480495
self.versions.insert(0,ver)
@@ -519,15 +534,6 @@ def subtitle(self) -> str:
519534
def subtitle(self, value: str):
520535
self._src["subtitle"] = value
521536

522-
@property
523-
def versions(self) -> list[Version]:
524-
return self._src.get("versions",[])
525-
@versions.setter
526-
def versions(self, value: list[Version]):
527-
if self.versions is not None:
528-
logging.warning(f"Entire `versions` section has been replaced for {self.name}.")
529-
self._src["versions"] = value
530-
531537
@property
532538
def localizedDescription(self) -> str:
533539
return self._src.get("localizedDescription")
@@ -549,19 +555,21 @@ def tintColor(self) -> str:
549555
def tintColor(self, value: str):
550556
self._src["tintColor"] = value
551557

552-
@property
553-
def beta(self) -> bool:
554-
return self._src.get("beta")
555-
@beta.setter
556-
def beta(self, value: bool):
557-
self._src["beta"] = value
558-
559558
@property
560559
def screenshotURLs(self) -> list[str]:
561560
return self._src.get("screenshotURLs")
562561
@screenshotURLs.setter
563562
def screenshotURLs(self, value: list[str]):
564563
self._src["screenshotURLs"] = value
564+
565+
@property
566+
def versions(self) -> list[Version]:
567+
return self._src.get("versions",[])
568+
@versions.setter
569+
def versions(self, value: list[Version]):
570+
if self.versions is not None:
571+
logging.warning(f"Entire `versions` section has been replaced for {self.name}.")
572+
self._src["versions"] = value
565573

566574
@property
567575
def appPermissions(self) -> Permissions:
@@ -570,6 +578,13 @@ def appPermissions(self) -> Permissions:
570578
def appPermissions(self, value: Permissions):
571579
self._src["appPermissions"] = value
572580

581+
@property
582+
def beta(self) -> bool:
583+
return self._src.get("beta")
584+
@beta.setter
585+
def beta(self, value: bool):
586+
self._src["beta"] = value
587+
573588
### Deprecated properties ###
574589

575590
@property
@@ -688,13 +703,6 @@ def title(self) -> str:
688703
def title(self, value: str):
689704
self._src["title"] = value
690705

691-
@property
692-
def name(self) -> str:
693-
return self._src.get("name")
694-
@name.setter
695-
def name(self, value: str):
696-
self._src["name"] = value
697-
698706
@property
699707
def identifier(self) -> str:
700708
return self._src.get("identifier")
@@ -710,6 +718,13 @@ def caption(self) -> str:
710718
def caption(self, value: str):
711719
self._src["caption"] = value
712720

721+
@property
722+
def date(self) -> str:
723+
return self._src.get("date")
724+
@date.setter
725+
def date(self, value: str):
726+
self._src["date"] = value
727+
713728
@property
714729
def tintColor(self) -> str:
715730
return self._src.get("tintColor")
@@ -724,20 +739,6 @@ def imageURL(self) -> str:
724739
def imageURL(self, value: str):
725740
self._src["imageURL"] = value
726741

727-
@property
728-
def appID(self) -> str:
729-
return self._src.get("appID")
730-
@appID.setter
731-
def appID(self, value: str):
732-
self._src["appID"] = value
733-
734-
@property
735-
def date(self) -> str:
736-
return self._src.get("date")
737-
@date.setter
738-
def date(self, value: str):
739-
self._src["date"] = value
740-
741742
@property
742743
def notify(self) -> bool:
743744
return self._src.get("notify")
@@ -751,6 +752,13 @@ def url(self) -> str:
751752
@url.setter
752753
def url(self, value: str):
753754
self._src["url"] = value
755+
756+
@property
757+
def appID(self) -> str:
758+
return self._src.get("appID")
759+
@appID.setter
760+
def appID(self, value: str):
761+
self._src["appID"] = value
754762
# End class Article
755763

756764
_required_keys = ["name", "identifier", "apps"]
@@ -768,7 +776,7 @@ def __init__(self, src: dict | None = None, path: str | Path | None = None):
768776
self._src["apps"] = [self.App(app) for app in src.get("apps", [])]
769777
if "news" in self._src.keys():
770778
self._src["news"] = [self.Article(art) for art in src["news"]]
771-
self.version = 2 # set current API version
779+
self.apiVersion = "v2" # set current API version
772780

773781
missing_keys = self.missing_keys()
774782
if missing_keys:
@@ -830,6 +838,15 @@ def identifier(self) -> str:
830838
def identifier(self, value: str):
831839
logging.warning(f"Source `identifier` changed from {self._src['identifier']} to {value}.")
832840
self._src["identifier"] = value
841+
842+
### Unofficial AltSource property ###
843+
@property
844+
def apiVersion(self) -> str:
845+
"""Used to declare the AltSource API version."""
846+
return self._src.get("apiVersion")
847+
@apiVersion.setter
848+
def apiVersion(self, value: str):
849+
self._src["apiVersion"] = value
833850

834851
@property
835852
def subtitle(self) -> str:
@@ -844,20 +861,20 @@ def description(self) -> str:
844861
@description.setter
845862
def description(self, value: str):
846863
self._src["description"] = value
847-
848-
@property
849-
def headerURL(self) -> str:
850-
return self._src.get("headerURL")
851-
@headerURL.setter
852-
def headerURL(self, value: str):
853-
self._src["headerURL"] = value
854864

855865
@property
856866
def iconURL(self) -> str:
857867
return self._src.get("iconURL")
858868
@iconURL.setter
859869
def iconURL(self, value: str):
860870
self._src["iconURL"] = value
871+
872+
@property
873+
def headerURL(self) -> str:
874+
return self._src.get("headerURL")
875+
@headerURL.setter
876+
def headerURL(self, value: str):
877+
self._src["headerURL"] = value
861878

862879
@property
863880
def website(self) -> str:
@@ -903,24 +920,6 @@ def userinfo(self) -> dict:
903920
@userinfo.setter
904921
def userinfo(self, value: dict):
905922
self._src["userinfo"] = value
906-
907-
# Start unofficial AltSource attributes.
908-
909-
@property
910-
def sourceURL(self) -> str:
911-
return self._src.get("sourceURL")
912-
@sourceURL.setter
913-
def sourceURL(self, value: str):
914-
self._src["sourceURL"] = value
915-
916-
@property
917-
def version(self) -> str:
918-
"""Used to declare the AltSource API version.
919-
"""
920-
return self._src.get("version")
921-
@version.setter
922-
def version(self, value: str):
923-
self._src["version"] = value
924923
# End class AltSource
925924

926925
def altsource_from_file(filepath: Path | str) -> AltSource:

0 commit comments

Comments
 (0)