import json import os import uuid from datetime import datetime from pathlib import Path from src.display.utils import LibraryType from src.display.formatting import styled_error, styled_warning, styled_message from src.envs import API, EVAL_REQUESTS_PATH, QUEUE_REPO, LOCAL_MODE from src.submission.check_validity import is_repository_valid def add_new_eval( library_name, library_version, repository_url, language, framework, library_type_str, ) -> str: """ Adds a new library to the assessment queue. Args: library_name: Name of the library (org/repo format) library_version: Version of the library repository_url: URL to the repository language: Programming language framework: Related framework/ecosystem library_type_str: Type of AI library Returns: A message indicating the status of the submission """ # Check if valid repository is_valid, validity_message, library_info = is_repository_valid(library_name, repository_url) if not is_valid: return styled_error(f"Invalid submission: {validity_message}") # Parse library type library_type = LibraryType.from_str(library_type_str) if library_type == LibraryType.Unknown: return styled_error("Please select a valid library type.") # Create a unique identifier for the submission uid = uuid.uuid4().hex[:6] timestamp = datetime.now().isoformat() request_filename = f"{library_name.replace('/', '_')}_eval_request_{timestamp}_{uid}.json" # Stars count and license info from library_info if available stars = library_info.get("stars", 0) license_name = library_info.get("license", "unknown") # Create the assessment request JSON assessment_request = { "library": library_name, "version": library_version, "repository_url": repository_url, "language": "/".join(language) if isinstance(language, list) else language, "framework": framework, "library_type": library_type.value.name, "license": license_name, "stars": stars, "status": "PENDING", "submitted_time": timestamp, "last_updated": timestamp, "assessment_id": uid } # Ensure directory exists os.makedirs(EVAL_REQUESTS_PATH, exist_ok=True) # Save the request locally request_file_path = os.path.join(EVAL_REQUESTS_PATH, request_filename) with open(request_file_path, "w") as f: json.dump(assessment_request, f, indent=2) # If in local mode, don't try to upload to HF if LOCAL_MODE: return styled_message(f"Library '{library_name}' (version {library_version}) has been added to the local assessment queue! Assessment ID: {uid}") # Try to upload to HF if not in local mode try: # Push the file to the HF repo path = Path(request_file_path) API.upload_file( path_or_fileobj=path, path_in_repo=request_filename, repo_id=QUEUE_REPO, repo_type="dataset", ) return styled_message(f"Library '{library_name}' (version {library_version}) has been added to the assessment queue! Assessment ID: {uid}") except Exception as e: return styled_warning(f"Saved locally but failed to upload to Hugging Face: {str(e)}")