import boto3 import csv from botocore.exceptions import NoCredentialsError, PartialCredentialsError class QuestionLoaderAWS: def __init__(self, bucket_name, aws_access_key, aws_secret_key): """ Initializes the QuestionLoader with AWS credentials and bucket name. :param bucket_name: The name of the S3 bucket. :param aws_access_key: AWS access key ID. :param aws_secret_key: AWS secret access key. """ self.bucket_name = bucket_name self.s3_client = boto3.client( 's3', aws_access_key_id=aws_access_key, aws_secret_access_key=aws_secret_key ) def fetch_questions(self, technology): """ Fetches the questions for the given technology from the S3 bucket. :param technology: The technology (e.g., Python, Django) to fetch questions for. :return: A list of dictionaries, where each dictionary represents a question. :raises: Exception if the file cannot be fetched or read. """ file_key = f"questions/{technology}/questions.csv" try: response = self.s3_client.get_object(Bucket=self.bucket_name, Key=file_key) questions = [] # Decode and parse the CSV content lines = response['Body'].read().decode('utf-8').splitlines() csv_reader = csv.DictReader(lines) for row in csv_reader: questions.append({ "question": row["question"], "option1": row["option1"], "option2": row["option2"], "option3": row["option3"], "option4": row["option4"], "answer": row["answer"], "difficulty": row["difficulty"].lower() }) return questions except self.s3_client.exceptions.NoSuchKey: raise FileNotFoundError(f"No questions found for technology: {technology}") except (NoCredentialsError, PartialCredentialsError): raise PermissionError("Invalid AWS credentials. Please check your .env file.") except Exception as e: raise RuntimeError(f"Failed to fetch questions: {str(e)}")