mirror of
https://github.com/Abdess/retroarch_system.git
synced 2026-10-10 13:33:24 -05:00
refactor: assign each module constant once
This commit is contained in:
1 parent
626c012a6b
commit
ee6e7558f9
4 files changed
+37
-10
No files matched your search
@@ -14,13 +14,10 @@ from hashing import compute_hashes
|
||||
|
||||
|
||||
LARGE_FILES_RELEASE = "large-files"
|
||||
|
||||
LARGE_FILES_RELEASE = "large-files"
|
||||
LARGE_FILES_REPO = "Abdess/retrobios"
|
||||
|
||||
LARGE_FILES_REPO = "Abdess/retrobios"
|
||||
LARGE_FILES_CACHE = ".cache/large"
|
||||
|
||||
|
||||
def fetch_large_file(
|
||||
name: str,
|
||||
dest_dir: str = LARGE_FILES_CACHE,
|
||||
|
||||
@@ -9,8 +9,6 @@ from concurrent.futures import ThreadPoolExecutor
|
||||
import json
|
||||
import urllib.request
|
||||
WIKI_SRC_DIR = "wiki" # manually maintained wiki sources
|
||||
SYSTEM_ICON_BASE = "https://raw.githubusercontent.com/libretro/retroarch-assets/master/xmb/systematic/png"
|
||||
|
||||
SYSTEM_ICON_BASE = "https://raw.githubusercontent.com/libretro/retroarch-assets/master/xmb/systematic/png"
|
||||
ICON_CACHE_PATH = Path(".cache") / "system_icons.json"
|
||||
|
||||
|
||||
+2
-4
@@ -75,24 +75,22 @@ def build_zip_contents_index(db: dict, max_entry_size: int = 512 * 1024 * 1024)
|
||||
_zip_contents_cache = (fingerprint, index)
|
||||
return index
|
||||
|
||||
|
||||
MAX_ZIP_MEMBERS = 100_000
|
||||
|
||||
MAX_ZIP_MEMBER_SIZE = 8 * 1024 * 1024 * 1024
|
||||
|
||||
MAX_ZIP_MEMBER_SIZE = 8 * 1024 * 1024 * 1024
|
||||
# The largest generated pack is already ~5 GB uncompressed and the collection
|
||||
# only grows; this bounds a malicious archive without capping a real one.
|
||||
MAX_ZIP_TOTAL_SIZE = 64 * 1024 * 1024 * 1024
|
||||
|
||||
MAX_ZIP_TOTAL_SIZE = 64 * 1024 * 1024 * 1024
|
||||
# DEFLATE cannot exceed roughly 1,032:1, so this rejects a declared ratio no
|
||||
# real DEFLATE member can reach. Methods with a higher ceiling (bzip2, LZMA)
|
||||
# are exempt and bounded by the per-member and per-archive size limits alone.
|
||||
MAX_ZIP_COMPRESSION_RATIO = 1_100
|
||||
|
||||
MAX_ZIP_COMPRESSION_RATIO = 1_100
|
||||
_BOUNDED_RATIO_METHODS = (zipfile.ZIP_STORED, zipfile.ZIP_DEFLATED)
|
||||
|
||||
|
||||
def safe_extract_zip(
|
||||
zip_path: str,
|
||||
dest_dir: str,
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import ast
|
||||
import contextlib
|
||||
import hashlib
|
||||
import io
|
||||
@@ -1009,3 +1010,36 @@ class ContributorsSurviveAFailedRequest(unittest.TestCase):
|
||||
text.count('<a href="https://github.com/'), 0,
|
||||
"the section is present but empty",
|
||||
)
|
||||
|
||||
|
||||
class ModuleConstantsDeclaredOnce(unittest.TestCase):
|
||||
"""Splitting common.py into modules emitted some constants twice.
|
||||
|
||||
The values matched, so nothing broke, but the second assignment orphans
|
||||
the comment written above the first and leaves two lines to keep in step
|
||||
the day a value changes.
|
||||
"""
|
||||
|
||||
@staticmethod
|
||||
def _redeclared(path: Path) -> list[str]:
|
||||
seen: dict[str, str] = {}
|
||||
again = []
|
||||
for node in ast.parse(path.read_text()).body:
|
||||
if not isinstance(node, ast.Assign) or len(node.targets) != 1:
|
||||
continue
|
||||
target = node.targets[0]
|
||||
if not isinstance(target, ast.Name):
|
||||
continue
|
||||
value = ast.unparse(node.value)
|
||||
if seen.get(target.id) == value:
|
||||
again.append(target.id)
|
||||
seen[target.id] = value
|
||||
return again
|
||||
|
||||
def test_no_module_assigns_the_same_constant_twice(self):
|
||||
offenders = {}
|
||||
for path in sorted(ROOT.glob("scripts/**/*.py")) + [ROOT / "install.py"]:
|
||||
again = self._redeclared(path)
|
||||
if again:
|
||||
offenders[path.name] = again
|
||||
self.assertEqual(offenders, {})
|
||||
Reference in new issue
Block a user