Merge pull request #77 from rohanpm/sort-listings

Ensure directories appear first in listings [RHELDST-21890]
This commit is contained in:
Rohan McGovern 2024-01-15 08:05:54 +10:00 committed by GitHub
commit 5dacb650ae
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 439 additions and 376 deletions

769
poetry.lock generated

File diff suppressed because it is too large Load diff

View file

@ -56,6 +56,23 @@ class IndexEntry:
padding: str = ""
icon: str = ICON_OTHER
@property
def sort_key(self):
# Returns a suggested sort key for displaying entries in
# a UI.
priority = 0
# Folders should come first
if self.href.endswith("/"):
priority -= 1
# And special folders like ".." even earlier
if self.href.startswith("."):
priority -= 1
# Entries sort by the priority we calculated, and then by name
return (priority, self.href)
class Repo(ABC):
def __init__(

View file

@ -70,4 +70,6 @@ def treeify(
]
)
out.entries.sort(key=lambda entry: entry.sort_key)
return out

View file

@ -101,7 +101,7 @@ class PackagesParser(ContentHandler):
return self.packages
def startElement(self, name: str, attrs: Mapping[str, Any]):
def startElement(self, name: str, attrs: Mapping[str, Any]): # type: ignore
self.current_path.append(name)
LOG.debug("entering element %s", self.current_path)

View file

@ -1,4 +1,5 @@
import io
import re
from typing import BinaryIO, Optional
import textwrap
@ -619,6 +620,30 @@ async def test_typical_index():
assert '<a href="vmlinuz">' in by_relative_dir["images/pxeboot"].content
# Sample the order of entries in some of the listings.
# Directories are expected to come first.
links = re.findall(r'<a href="([^"]+)"', by_relative_dir[""].content)
assert links == [
"images/",
"packages/",
"repodata/",
"EULA",
"GPL",
"RPM-GPG-KEY-redhat-beta",
"RPM-GPG-KEY-redhat-release",
"extra_files.json",
"treeinfo",
]
links = re.findall(r'<a href="([^"]+)"', by_relative_dir["images"].content)
assert links == [
"../",
"pxeboot/",
"boot.iso",
"efiboot.img",
"install.img",
]
async def test_typical_appstream_index():
fetcher = StaticFetcher()