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_RELEASE = "large-files"
|
|
||||||
LARGE_FILES_REPO = "Abdess/retrobios"
|
|
||||||
|
|
||||||
LARGE_FILES_REPO = "Abdess/retrobios"
|
LARGE_FILES_REPO = "Abdess/retrobios"
|
||||||
LARGE_FILES_CACHE = ".cache/large"
|
LARGE_FILES_CACHE = ".cache/large"
|
||||||
|
|
||||||
|
|
||||||
def fetch_large_file(
|
def fetch_large_file(
|
||||||
name: str,
|
name: str,
|
||||||
dest_dir: str = LARGE_FILES_CACHE,
|
dest_dir: str = LARGE_FILES_CACHE,
|
||||||
|
|||||||
@@ -9,8 +9,6 @@ from concurrent.futures import ThreadPoolExecutor
|
|||||||
import json
|
import json
|
||||||
import urllib.request
|
import urllib.request
|
||||||
WIKI_SRC_DIR = "wiki" # manually maintained wiki sources
|
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"
|
SYSTEM_ICON_BASE = "https://raw.githubusercontent.com/libretro/retroarch-assets/master/xmb/systematic/png"
|
||||||
ICON_CACHE_PATH = Path(".cache") / "system_icons.json"
|
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)
|
_zip_contents_cache = (fingerprint, index)
|
||||||
return index
|
return index
|
||||||
|
|
||||||
|
|
||||||
MAX_ZIP_MEMBERS = 100_000
|
MAX_ZIP_MEMBERS = 100_000
|
||||||
|
|
||||||
MAX_ZIP_MEMBER_SIZE = 8 * 1024 * 1024 * 1024
|
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
|
# The largest generated pack is already ~5 GB uncompressed and the collection
|
||||||
# only grows; this bounds a malicious archive without capping a real one.
|
# 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
|
||||||
|
|
||||||
MAX_ZIP_TOTAL_SIZE = 64 * 1024 * 1024 * 1024
|
|
||||||
# DEFLATE cannot exceed roughly 1,032:1, so this rejects a declared ratio no
|
# 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)
|
# 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.
|
# 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
|
MAX_ZIP_COMPRESSION_RATIO = 1_100
|
||||||
_BOUNDED_RATIO_METHODS = (zipfile.ZIP_STORED, zipfile.ZIP_DEFLATED)
|
_BOUNDED_RATIO_METHODS = (zipfile.ZIP_STORED, zipfile.ZIP_DEFLATED)
|
||||||
|
|
||||||
|
|
||||||
def safe_extract_zip(
|
def safe_extract_zip(
|
||||||
zip_path: str,
|
zip_path: str,
|
||||||
dest_dir: str,
|
dest_dir: str,
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import ast
|
||||||
import contextlib
|
import contextlib
|
||||||
import hashlib
|
import hashlib
|
||||||
import io
|
import io
|
||||||
@@ -1009,3 +1010,36 @@ class ContributorsSurviveAFailedRequest(unittest.TestCase):
|
|||||||
text.count('<a href="https://github.com/'), 0,
|
text.count('<a href="https://github.com/'), 0,
|
||||||
"the section is present but empty",
|
"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