AI_Assignment_checker / utils /code_utils.py
Za-heer
Complete AI & Data Science assignment Checker
ae6148e
raw
history blame
2.68 kB
from pylint.lint import Run
from pylint.reporters.text import TextReporter
from nbformat import read
import os
from io import StringIO
from scripts.logger import get_logger
from charset_normalizer import detect
logger = get_logger(__name__)
def pylint_check(file_path):
logger.debug(f"Checking file: {file_path}")
try:
# Preprocess file to ensure UTF-8
with open(file_path, 'rb') as f:
raw_content = f.read()
detected = detect(raw_content)
encoding = detected['encoding']
if encoding not in ['utf-8', 'ascii']:
# logger.warning(f"File {file_path} is not UTF-8 (detected {encoding}). Converting to UTF-8.")
content = raw_content.decode(encoding, errors='replace').encode('utf-8').decode('utf-8')
temp_file_path = file_path + '.utf8'
with open(temp_file_path, 'w', encoding='utf-8') as f:
f.write(content)
file_path = temp_file_path
output = StringIO()
reporter = TextReporter(output)
Run([file_path, '--disable=C0114,C0115,W0311,W0703,C0116,R0903,C0303,C0301', '--max-line-length=120'], reporter=reporter, exit=False)
pylint_output = output.getvalue()
# Clean up temporary file if created
if file_path.endswith('.utf8'):
try:
os.unlink(file_path)
except Exception as e:
logger.warning(f"Failed to delete temporary file {file_path}: {e}")
return pylint_output if pylint_output.strip() else "No critical issues found. Code looks good!"
except Exception as e:
logger.error(f"Pylint error: {e}")
return f"Pylint error: {str(e)}"
def extract_code_from_ipynb(file_path):
logger.debug(f"Extracting code from: {file_path}")
try:
with open(file_path, 'r', encoding='utf-8') as file:
notebook = read(file, as_version=4)
code = ""
for cell in notebook.cells:
if cell.cell_type == 'code':
source = ''.join(cell.source) if isinstance(cell.source, list) else cell.source
# Sanitize code to remove non-text characters
source = ''.join(c for c in source if ord(c) < 128 or c in '\n\t\r')
code += source + '\n'
if not code.strip():
logger.warning("No code cells found in .ipynb file.")
return None
return code
except UnicodeDecodeError as e:
logger.error(f"Error decoding .ipynb file: {e}")
return None
except Exception as e:
logger.error(f"Error extracting code from .ipynb: {e}")
return None