ReadmeandLicenseGithub / github_analyzer.py
PraneshJs's picture
added more import file and directory names
4194f1c verified
from github import Github
from urllib.parse import urlparse
import os
from dotenv import load_dotenv
load_dotenv()
def extract_repo_name(url):
path = urlparse(url).path.strip("/")
return path.split("/")[-2], path.split("/")[-1]
def is_important_file(path):
ignored_dirs = ["node_modules", "test", "__tests__", ".git", "build", ".next", ".vscode"]
important_dirs = ["src", "components", "pages", "hooks", "controller", "service", "frontend", "backend", "db", "database", "api", "ui", "models", "config", "scripts", "static", "templates","utils", "lib", "middleware", "tests", "styles", "public"]
important_exts = [".py", ".js", ".ts", ".jsx", ".tsx", ".java", ".go", ".html", ".php", "Dockerfile", ".env.example",".dart",".cpp",".c",".php", ".css", ".scss", ".json", ".yaml", ".yml", ".md",".sh", ".bat", ".ps1", ".cpp", ".c", ".h", ".hpp",".ipynb", ".onnx", ".pb", ".tflite", "Dockerfile", "Makefile",".gradle", ".jar", ".war"]
if any(ignored in path for ignored in ignored_dirs):
return False
if any(dir_ in path for dir_ in important_dirs) and any(path.endswith(ext) for ext in important_exts):
return True
if path.count("/") <= 1 and any(path.endswith(ext) for ext in important_exts):
return True
return False
def get_filtered_file_contents(repo, path=""):
contents = repo.get_contents(path)
all_files = {}
for content in contents:
if content.type == "dir":
all_files.update(get_filtered_file_contents(repo, content.path))
else:
if is_important_file(content.path):
try:
file_data = content.decoded_content.decode("utf-8")
all_files[content.path] = file_data
except Exception as e:
all_files[content.path] = f"Unable to read: {e}"
return all_files
def analyze_repo(repo_url):
g = Github(os.getenv("GITHUB_TOKEN").strip())
owner, name = extract_repo_name(repo_url)
repo = g.get_repo(f"{owner}/{name}")
info = {
"name": repo.name,
"description": repo.description,
"topics": repo.get_topics(),
"files": get_filtered_file_contents(repo),
"url": repo.html_url
}
return info