ai-code-maintainability-engine / dataset_generator.py
usman-ai-dev's picture
Deploy AI Code Maintainability Scoring Engine to Hugging Face Spaces
38bc0dc verified
Raw
History Blame Contribute Delete
3.77 kB
import csv
import os
import random
from ast_analyzer import extract_features
random.seed(42)
OUTPUT_PATH = os.path.join(os.path.dirname(__file__), "data", "dataset.csv")
FEATURE_COLUMNS = [
"num_functions",
"num_loops",
"num_if",
"num_try_except",
"num_return",
"line_count",
"max_nesting_depth",
"cyclomatic_complexity",
"avg_function_length",
"recursion_flag",
"global_variable_count",
"label",
]
def _make_clean_snippet(index):
variant = index % 10
if variant == 0:
return f
elif variant == 1:
return f
elif variant == 2:
return f
elif variant == 3:
return f
elif variant == 4:
return f
elif variant == 5:
return f
elif variant == 6:
return f
elif variant == 7:
return f
elif variant == 8:
return f
else:
return f
def _make_risky_snippet(index):
variant = index % 10
if variant == 0:
return f
elif variant == 1:
return f
elif variant == 2:
return f
elif variant == 3:
return f
elif variant == 4:
return f
elif variant == 5:
return f
elif variant == 6:
return f
elif variant == 7:
return f
elif variant == 8:
return f
else:
return f
def generate_dataset(n_clean=110, n_risky=110):
dataset = []
skipped = 0
print(f"Generating {n_clean} clean snippets...")
for i in range(n_clean):
code = _make_clean_snippet(i)
features = extract_features(code)
if features.get("error"):
skipped += 1
continue
features["label"] = 0
dataset.append(features)
print(f"Generating {n_risky} risky snippets...")
for i in range(n_risky):
code = _make_risky_snippet(i)
features = extract_features(code)
if features.get("error"):
skipped += 1
continue
features["label"] = 1
dataset.append(features)
random.shuffle(dataset)
print(f"\nDataset ready: {len(dataset)} samples ({skipped} skipped due to errors)")
return dataset
def save_dataset(dataset, output_path=OUTPUT_PATH):
os.makedirs(os.path.dirname(output_path), exist_ok=True)
with open(output_path, 'w', newline='', encoding='utf-8') as f:
writer = csv.DictWriter(f, fieldnames=FEATURE_COLUMNS)
writer.writeheader()
for row in dataset:
filtered_row = {col: row.get(col, 0) for col in FEATURE_COLUMNS}
writer.writerow(filtered_row)
print(f"Dataset saved to: {output_path}")
def print_summary(dataset):
clean_rows = [r for r in dataset if r["label"] == 0]
risky_rows = [r for r in dataset if r["label"] == 1]
print("\n" + "=" * 55)
print(" DATASET SUMMARY")
print("=" * 55)
print(f" Total samples : {len(dataset)}")
print(f" Clean (label=0) : {len(clean_rows)}")
print(f" Risky (label=1) : {len(risky_rows)}")
print("-" * 55)
print(f" {'Feature':<28} {'Clean Avg':>10} {'Risky Avg':>10}")
print("-" * 55)
for col in FEATURE_COLUMNS[:-1]:
clean_avg = sum(r[col] for r in clean_rows) / len(clean_rows) if clean_rows else 0
risky_avg = sum(r[col] for r in risky_rows) / len(risky_rows) if risky_rows else 0
print(f" {col:<28} {clean_avg:>10.2f} {risky_avg:>10.2f}")
print("=" * 55)
if __name__ == "__main__":
dataset = generate_dataset(n_clean=110, n_risky=110)
print_summary(dataset)
save_dataset(dataset)