Analizador de paquetes de la Sala de juegos

En esta página, se explica cómo usar el analizador de paquetes de la Sala de juegos.

Instrucciones

El analizador de paquetes de la Sala de juegos se puede ejecutar en un paquete de juegos varias validaciones en el paquete del juego antes de subir los recursos a Google Drive

Requisitos previos

Crea la secuencia de comandos

  1. Identifica un directorio en tu máquina para crear la secuencia de comandos (ejemplo: ~/scripts).
  2. Con el código de muestra proporcionado, crea un archivo en tu máquina. llamada playables_bundle_analyzer.py.

Ejecuta la secuencia de comandos para analizar el paquete de juego

  1. Abre una ventana de terminal en tu máquina y navega al directorio que contiene la secuencia de comandos playables_bundle_analyzer.py.
  2. Para ejecutar la secuencia de comandos, ejecuta este comando y reemplaza [GAME_DIRECTORY_PATH]. por la ruta de acceso real del directorio de tu paquete de juego:

    python3 playables_bundle_analyzer.py [GAME_DIRECTORY_PATH]
    
  3. Se generará un informe de análisis de paquete en el directorio de secuencias de comandos. Si Se llamará playable_bundle_analysis_report.txt.

  4. Consulta los requisitos de estabilidad y rendimiento para obtener más información. sobre el tamaño del paquete y el requisito de nombres de archivos.

Código

# Copyright 2024 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#    https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Contains functions to analyze the Playable game bundles."""

import argparse
import os
import re
from typing import Dict, List, Union

SIZE_LIMITS = {
    "file": 31457280,  # 30 MiB
    "bundle": 262144000,  # 250 MiB
}

class BundleAnalyzer:
  """Class for analyzing Playable game bundles."""

  def __init__(self, directory_path):
    """Initializes the BundleAnalyzer object with the specified directory path.

    Args:
        directory_path: The path to the directory to analyze.
    """
    self.directory_path = directory_path
    self.total_size = 0
    self.filenames_with_issues = []
    self.files_too_large = []

  def analyze(self):
    """Analyzes the Playable game bundle and stores the results.

    This function iterates through the directory and its subdirectories,
    calculating the total size, and identifying files with
    issues like unsupported characters, duplicates, and exceeding size limits.
    """

    for root, _, files in os.walk(self.directory_path):
      for filename in files:
        file_path = os.path.join(root, filename)
        file_size = os.path.getsize(file_path)
        self.total_size += file_size

        if file_size > SIZE_LIMITS["file"]:
          self.files_too_large.append(file_path)

        if not is_valid_filename(filename):
          self.filenames_with_issues.append(file_path)

  def get_results(self) -> Dict[str, Union[List[str], List[str], int]]:
    """Returns a dictionary containing the analysis results.

    The dictionary includes information about the total number of files,
    files with issues, files exceeding size limits,
    and the total size of the bundle.
    """

    return {
        "filenames_with_issues": self.filenames_with_issues,
        "files_too_large": self.files_too_large,
        "total_size": self.total_size,
    }

def is_valid_filename(filename: str) -> bool:
  """Checks if the filename contains valid characters.

  Create a regular expression that matches allowed bundle file characters

  Args:
      filename: The filename to be validated.

  Returns:
      True if the filename is valid, False otherwise.
  """

  pattern = r"^[a-zA-Z0-9\-\._]+$"

  return bool(re.fullmatch(pattern, filename))

def main():
  """Main function that runs the BundleAnalyzer.

  Parses command line arguments, creates a BundleAnalyzer instance,
  runs the analysis, and output the results.
  """

  parser = argparse.ArgumentParser(description="Analyze file size")
  parser.add_argument("path", help="Path to file or directory")
  args = parser.parse_args()

  analyzer = BundleAnalyzer(args.path)
  analyzer.analyze()

  analysis_result = analyzer.get_results()

  with open("playable_bundle_analysis_report.txt", "w") as f:
    if analysis_result["filenames_with_issues"]:
      print(
          "Files with unsupported characters:"
          f" {analysis_result['filenames_with_issues']}",
          file=f,
      )

    if analysis_result["files_too_large"]:
      print(
          f"Files too large: {analysis_result['files_too_large']}",
          file=f,
      )

    if analysis_result["total_size"] > SIZE_LIMITS["bundle"]:
      print(
          f"Total bundle is too large:: {analysis_result['total_size']} bytes",
          file=f,
      )

if __name__ == "__main__":
  main()