1
0
Fork 0

Refactor nested function out of generate_post for better readability.

This commit is contained in:
Casper V. Kristensen 2019-03-15 01:17:45 +01:00
parent abfbc34259
commit 3a06f9c56f
Signed by: caspervk
GPG key ID: 289CA03790535054

View file

@ -14,28 +14,54 @@ from .parsing import ParsedReleases, Release, ReleaseType
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
def generate_post(parsed_releases: ParsedReleases) -> str: def popularity(release: Release):
# The popularity of a game is defined by the number of reviews it has on Steam, however:
# - We rank RIPs lower than non-RIPs so the same game released as both will sort the non-RIP first.
# - Releases with highlights (e.g. PROPER/DENUVO) are always ranked highest.
is_rip = "RIP" in [tag.upper() for tag in release.tags]
return len(release.highlights), release.num_reviews, not is_rip
def row(release: Release):
# The rows in the table containing updates will use the full rls_name as the name, while tables
# containing game and DLC releases will show tags and highlights, as well as the stylized game_name.
if release.type == ReleaseType.UPDATE:
name = f"[{release.rls_name}]({release.nfo_link})"
else:
tags = " ({})".format(" ".join(release.tags)) if release.tags else ""
highlights = " **- {}**".format(", ".join(release.highlights)) if release.highlights else ""
name = "[{}{}]({}){}".format(util.markdown_escape(release.game_name),
tags,
release.nfo_link,
highlights)
stores = ", ".join(f"[{name}]({link})" for name, link in release.store_links.items())
if release.score == -1:
reviews = "-"
else:
num_reviews_humanized = util.humanize(release.num_reviews, precision=1, prefix="dec", suffix="")
reviews = f"{release.score:.0%} ({num_reviews_humanized})"
return name, release.group, stores, reviews
def generate_post(releases: ParsedReleases) -> str:
post = [] post = []
for platform, platform_releases in parsed_releases.items(): for platform, platform_releases in releases.items():
# Skip if platform doesn't contain any releases in any of the three release type categories
if sum(len(pr) for pr in platform_releases.values()) == 0: if sum(len(pr) for pr in platform_releases.values()) == 0:
continue continue
post.append(f"# {platform}") post.append(f"# {platform}")
for release_type, releases in platform_releases.items(): for type, type_releases in platform_releases.items():
if not releases: if not type_releases:
continue continue
# Releases in the tables are grouped by release group, and the groups are ordered according to the most # Releases in the tables are grouped by release group, and the groups are ordered according to the most
# popular game within the group. Games are sorted by popularity internally in the groups as well. # popular game within the group. Games are sorted by popularity internally in the groups as well.
def popularity(release: Release): group_order = defaultdict(lambda: (0, -1, False))
# The popularity of a game is defined by the number of reviews it has on Steam, however: for release in type_releases:
# - We rank RIPs lower than non-RIPs so the same game released as both will sort the non-RIP first.
# - Releases with highlights (e.g. PROPER/DENUVO) are always ranked highest.
is_rip = "RIP" in [tag.upper() for tag in release.tags]
return len(release.highlights), release.num_reviews, not is_rip
group_order = defaultdict(lambda: (-1, False))
for release in releases:
group_order[release.group] = max(group_order[release.group], popularity(release)) group_order[release.group] = max(group_order[release.group], popularity(release))
def order(release: Release): def order(release: Release):
@ -43,32 +69,11 @@ def generate_post(parsed_releases: ParsedReleases) -> str:
release.group, # ensure grouping if two groups share group_order release.group, # ensure grouping if two groups share group_order
popularity(release)) popularity(release))
def row(release: Release): type_releases.sort(key=order, reverse=True)
# The rows in the table containing updates will use the full rls_name as the name, while tables
# containing game and DLC releases will show tags and highlights, as well as the stylized game_name.
if release_type == ReleaseType.UPDATE:
name = f"[{release.rls_name}]({release.nfo_link})"
else:
tags = " ({})".format(" ".join(release.tags)) if release.tags else ""
highlights = " **- {}**".format(", ".join(release.highlights)) if release.highlights else ""
name = "[{}{}]({}){}".format(util.markdown_escape(release.game_name),
tags,
release.nfo_link,
highlights)
if release.score == -1: post.append(f"| {type} | Group | Store | Score (Reviews) |")
reviews = "-"
else:
num_reviews_humanized = util.humanize(release.num_reviews, precision=1, prefix="dec", suffix="")
reviews = f"{release.score:.0%} ({num_reviews_humanized})"
stores = ", ".join(f"[{name}]({link})" for name, link in release.store_links.items())
return name, release.group, stores, reviews
post.append(f"| {release_type} | Group | Store | Score (Reviews) |")
post.append("|:-|:-|:-|:-|") post.append("|:-|:-|:-|:-|")
post.extend("| {} | {} | {} | {} |".format(*row(rls)) for rls in sorted(releases, key=order, reverse=True)) post.extend("| {} | {} | {} | {} |".format(*row(rls)) for rls in type_releases)
post.append("") post.append("")
post.append(" ") post.append(" ")