@vibe-dev-kit/cli
Version:
Advanced Command-line toolkit that analyzes your codebase and deploys project-aware rules, memories, commands and agents to any AI coding assistant - VDK is the world's first Vibe Development Kit
222 lines (190 loc) • 6.32 kB
JavaScript
/**
* python.js
*
* Analyzer for Python code to detect naming conventions,
* patterns, and commonly used libraries or frameworks.
*/
/**
* Analyzes Python code to detect naming conventions and patterns
* @param {string} content - Python code content
* @param {string} filePath - Path to the file
* @returns {Object} Analysis results
*/
export async function analyzePython(content, filePath) {
const analysis = {
variables: [],
functions: [],
classes: [],
patterns: [],
}
try {
// Parse function definitions
const functionPattern = /def\s+([a-zA-Z_][a-zA-Z0-9_]*)/g
let match
while ((match = functionPattern.exec(content)) !== null) {
if (match[1]) {
analysis.functions.push(match[1])
}
}
// Parse class definitions
const classPattern = /class\s+([a-zA-Z_][a-zA-Z0-9_]*)/g
while ((match = classPattern.exec(content)) !== null) {
if (match[1]) {
analysis.classes.push(match[1])
}
}
// Variable assignments (simplified approach)
const variablePattern = /^\s*([a-zA-Z_][a-zA-Z0-9_]*)\s*=/gm
while ((match = variablePattern.exec(content)) !== null) {
if (match[1] && !['if', 'for', 'while', 'def', 'class'].includes(match[1])) {
analysis.variables.push(match[1])
}
}
// Detect imports and patterns
detectPythonFrameworks(content, analysis)
detectPythonLibraries(content, analysis)
detectPythonPatterns(content, analysis)
// Deduplicate
analysis.variables = [...new Set(analysis.variables)]
analysis.functions = [...new Set(analysis.functions)]
analysis.classes = [...new Set(analysis.classes)]
analysis.patterns = [...new Set(analysis.patterns)]
return analysis
} catch (error) {
console.error(`Error analyzing Python file: ${filePath}`)
console.error(error.message)
return analysis
}
}
/**
* Detects Python frameworks from imports
* @param {string} content - Python code content
* @param {Object} analysis - Analysis results to update
*/
function detectPythonFrameworks(content, analysis) {
// Check for Django patterns
if (
content.includes('import django') ||
content.includes('from django') ||
content.includes('urls.py') ||
content.includes('models.py') ||
content.includes('views.py')
) {
analysis.patterns.push('Django')
}
// Check for Flask patterns
if (content.includes('from flask import') || content.includes('Flask(__name__)')) {
analysis.patterns.push('Flask')
}
// Check for FastAPI patterns
if (content.includes('from fastapi import') || content.includes('FastAPI(')) {
analysis.patterns.push('FastAPI')
}
// Check for Pyramid patterns
if (content.includes('from pyramid.') || content.includes('config.add_route')) {
analysis.patterns.push('Pyramid')
}
// Check for SQLAlchemy patterns
if (content.includes('import sqlalchemy') || content.includes('from sqlalchemy')) {
analysis.patterns.push('SQLAlchemy')
}
}
/**
* Detects Python libraries from imports
* @param {string} content - Python code content
* @param {Object} analysis - Analysis results to update
*/
function detectPythonLibraries(content, analysis) {
// Common data science libraries
if (content.includes('import pandas') || content.includes('from pandas')) {
analysis.patterns.push('Pandas')
}
if (content.includes('import numpy') || content.includes('from numpy')) {
analysis.patterns.push('NumPy')
}
if (content.includes('import matplotlib') || content.includes('from matplotlib')) {
analysis.patterns.push('Matplotlib')
}
if (content.includes('import tensorflow') || content.includes('from tensorflow')) {
analysis.patterns.push('TensorFlow')
}
if (content.includes('import torch') || content.includes('from torch')) {
analysis.patterns.push('PyTorch')
}
if (content.includes('import sklearn') || content.includes('from sklearn')) {
analysis.patterns.push('Scikit-learn')
}
// Web libraries
if (content.includes('import requests') || content.includes('from requests')) {
analysis.patterns.push('Requests')
}
if (content.includes('import aiohttp') || content.includes('from aiohttp')) {
analysis.patterns.push('AIOHTTP')
}
// Testing libraries
if (content.includes('import pytest') || content.includes('from pytest')) {
analysis.patterns.push('Pytest')
}
if (content.includes('import unittest') || content.includes('from unittest')) {
analysis.patterns.push('Unittest')
}
}
/**
* Detects Python coding patterns
* @param {string} content - Python code content
* @param {Object} analysis - Analysis results to update
*/
function detectPythonPatterns(content, analysis) {
// Detect Python version via features
if (content.includes('async def') || content.includes('await ')) {
analysis.patterns.push('Async/Await (Python 3.5+)')
}
if (content.includes('f"') || content.includes("f'")) {
analysis.patterns.push('F-strings (Python 3.6+)')
}
if (content.includes(': ') && content.includes(' -> ')) {
analysis.patterns.push('Type Hints (Python 3.5+)')
}
// OOP patterns
if (content.includes('class') && content.includes('__init__')) {
analysis.patterns.push('Object-Oriented Programming')
}
// Functional patterns
let functionalCount = 0
if (content.includes('lambda ')) {
functionalCount++
}
if (content.includes('map(')) {
functionalCount++
}
if (content.includes('filter(')) {
functionalCount++
}
if (content.includes('reduce(')) {
functionalCount++
}
if (
content.includes('list comprehension') ||
(content.includes('[') &&
content.includes('for') &&
content.includes('in') &&
content.includes(']'))
) {
functionalCount++
}
if (functionalCount >= 2) {
analysis.patterns.push('Functional Programming')
}
// Decorator usage
if (content.includes('@')) {
analysis.patterns.push('Decorators')
}
// Context managers
if (content.includes('with ') && content.includes('as ')) {
analysis.patterns.push('Context Managers')
}
// Data classes (Python 3.7+)
if (content.includes('@dataclass') || content.includes('from dataclasses import dataclass')) {
analysis.patterns.push('Data Classes (Python 3.7+)')
}
}