aboutsummaryrefslogtreecommitdiff
path: root/benchmark/reports/send_to_googledrive.py
diff options
context:
space:
mode:
Diffstat (limited to 'benchmark/reports/send_to_googledrive.py')
-rw-r--r--benchmark/reports/send_to_googledrive.py176
1 files changed, 176 insertions, 0 deletions
diff --git a/benchmark/reports/send_to_googledrive.py b/benchmark/reports/send_to_googledrive.py
new file mode 100644
index 000000000..1f9ebe8fe
--- /dev/null
+++ b/benchmark/reports/send_to_googledrive.py
@@ -0,0 +1,176 @@
+import base64
+import json
+import os
+import re
+from datetime import datetime, timedelta
+
+import gspread
+import pandas as pd
+from dotenv import load_dotenv
+from oauth2client.service_account import ServiceAccountCredentials
+
+# Load environment variables from .env file
+load_dotenv()
+
+# Get the base64 string from the environment variable
+base64_creds = os.getenv("GDRIVE_BASE64")
+
+if base64_creds is None:
+ raise ValueError("The GDRIVE_BASE64 environment variable is not set")
+
+# Decode the base64 string into bytes
+creds_bytes = base64.b64decode(base64_creds)
+
+# Convert the bytes into a string
+creds_string = creds_bytes.decode("utf-8")
+
+# Parse the string into a JSON object
+creds_info = json.loads(creds_string)
+
+# Define the base directory containing JSON files
+base_dir = "reports"
+
+# Get the current working directory
+current_dir = os.getcwd()
+
+# Check if the current directory ends with 'reports'
+if current_dir.endswith("reports"):
+ base_dir = "/"
+else:
+ base_dir = "reports"
+
+# Create a list to store each row of data
+rows = []
+
+
+def process_test(
+ test_name: str, test_info: dict, agent_name: str, common_data: dict
+) -> None:
+ """Recursive function to process test data."""
+ parts = test_name.split("_", 1) # Split by underscore only once
+ test_suite = parts[0] if len(parts) > 1 else None
+
+ # transform array into string with | as separator
+ separator = "|"
+ categories = separator.join(
+ test_info.get("category", []),
+ )
+
+ row = {
+ "Agent": agent_name,
+ "Command": common_data.get("command", ""),
+ "Completion Time": common_data.get("completion_time", ""),
+ "Benchmark Start Time": common_data.get("benchmark_start_time", ""),
+ "Total Run Time": common_data.get("metrics", {}).get("run_time", ""),
+ "Highest Difficulty": common_data.get("metrics", {}).get(
+ "highest_difficulty", ""
+ ),
+ "Workspace": common_data.get("config", {}).get("workspace", ""),
+ "Test Name": test_name,
+ "Data Path": test_info.get("data_path", ""),
+ "Is Regression": test_info.get("is_regression", ""),
+ "Difficulty": test_info.get("metrics", {}).get("difficulty", ""),
+ "Success": test_info.get("metrics", {}).get("success", ""),
+ "Success %": test_info.get("metrics", {}).get("success_%", ""),
+ "Non mock success %": test_info.get("metrics", {}).get(
+ "non_mock_success_%", ""
+ ),
+ "Run Time": test_info.get("metrics", {}).get("run_time", ""),
+ "Benchmark Git Commit Sha": common_data.get("benchmark_git_commit_sha", None),
+ "Agent Git Commit Sha": common_data.get("agent_git_commit_sha", None),
+ "Cost": test_info.get("metrics", {}).get("cost", ""),
+ "Attempted": test_info.get("metrics", {}).get("attempted", ""),
+ "Test Suite": test_suite,
+ "Category": categories,
+ "Task": test_info.get("task", ""),
+ "Answer": test_info.get("answer", ""),
+ "Description": test_info.get("description", ""),
+ "Fail Reason": test_info.get("metrics", {}).get("fail_reason", ""),
+ "Reached Cutoff": test_info.get("reached_cutoff", ""),
+ }
+
+ rows.append(row)
+
+ # Check for nested tests and process them if present
+ nested_tests = test_info.get("tests")
+ if nested_tests:
+ for nested_test_name, nested_test_info in nested_tests.items():
+ process_test(nested_test_name, nested_test_info, agent_name, common_data)
+
+
+# Usage:
+
+
+# Loop over each directory in the base directory
+for agent_dir in os.listdir(base_dir):
+ agent_dir_path = os.path.join(base_dir, agent_dir)
+
+ # Ensure the agent_dir_path is a directory
+ if os.path.isdir(agent_dir_path):
+ # Loop over each sub-directory in the agent directory (e.g., "folder49_07-28-03-53")
+ for report_folder in os.listdir(agent_dir_path):
+ report_folder_path = os.path.join(agent_dir_path, report_folder)
+
+ # Ensure the report_folder_path is a directory
+ if os.path.isdir(report_folder_path):
+ # Check for a file named "report.json" in the sub-directory
+ report_path = os.path.join(report_folder_path, "report.json")
+
+ if os.path.exists(report_path):
+ # Load the JSON data from the file
+ with open(report_path, "r") as f:
+ data = json.load(f)
+ benchmark_start_time = data.get("benchmark_start_time", "")
+
+ # Check if benchmark_start_time complies with the required format
+ pattern = re.compile(r"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\+00:00")
+ if not pattern.fullmatch(benchmark_start_time):
+ continue # Skip processing this report if the date is not in the correct format
+
+ # Parse the benchmark_start_time to a datetime object
+ benchmark_datetime = datetime.strptime(
+ benchmark_start_time, "%Y-%m-%dT%H:%M:%S+00:00"
+ )
+
+ # Check if benchmark_start_time is older than 3 days
+ current_datetime = datetime.utcnow()
+ if current_datetime - benchmark_datetime > timedelta(days=3):
+ continue # Skip processing this report if it's more than 3 days old
+
+ # Loop through each test
+ for test_name, test_info in data["tests"].items():
+ process_test(test_name, test_info, agent_dir, data)
+
+# Convert the list of rows into a DataFrame
+df = pd.DataFrame(rows)
+
+# Define the scope
+scope = [
+ "https://spreadsheets.google.com/feeds",
+ "https://www.googleapis.com/auth/drive",
+]
+
+# Add your service account credentials
+creds = ServiceAccountCredentials.from_json_keyfile_dict(creds_info, scope)
+
+# Authorize the clientsheet
+client = gspread.authorize(creds)
+
+# Get the instance of the Spreadsheet
+branch_name = os.getenv("GITHUB_REF_NAME")
+sheet = client.open(f"benchmark-{branch_name}")
+
+# Get the first sheet of the Spreadsheet
+sheet_instance = sheet.get_worksheet(0)
+
+# Convert dataframe to list of lists for uploading to Google Sheets
+values = df.values.tolist()
+
+# Prepend the header to the values list
+values.insert(0, df.columns.tolist())
+
+# Clear the existing values in the worksheet
+sheet_instance.clear()
+
+# Update the worksheet with the new values
+sheet_instance.append_rows(values)