Python İle Pygithub Kütüphanesi Kullanarak Github Repo Analizi Nasıl Yapılır?

Python İle Pygithub Kütüphanesi Kullanarak Github Repo Analizi Nasıl Yapılır?
Python İle Pygithub Kütüphanesi Kullanarak Github Repo Analizi Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Projeye başlamadan önce sisteminizde Python 3.10 veya daha güncel bir sürümün kurulu olduğundan emin olmalısınız. Pygithub kütüphanesini yüklemek için paket yöneticisi olan pip aracını kullanacağız. Ayrıca, GitHub API'sine erişim sağlamak için bir "Personal Access Token" (Kişisel Erişim Anahtarı) oluşturmanız gerekmektedir.

Kurulum için terminal veya komut satırınıza şu komutu girin:

pip install PyGithub

Bu komut, Pygithub kütüphanesini ve gerekli bağımlılıklarını ortamınıza kuracaktır. Kurulumu doğrulamak için Python etkileşimli kabuğunda import github komutunu çalıştırabilirsiniz. Hata almadığınız sürece bir sonraki aşamaya geçmeye hazırsınız demektir.

GitHub API Erişim Anahtarı Oluşturma

GitHub API'si, anonim kullanıcılara çok kısıtlı bir hız sınırı (rate limit) uygular. Analizlerinizi kesintisiz sürdürebilmek için bir erişim anahtarı şarttır. GitHub Ayarlar (Settings) > Developer Settings > Personal Access Tokens yolunu izleyerek "Fine-grained tokens" oluşturun. Token'ınıza sadece "repo" okuma yetkisi vermeniz güvenlik açısından yeterlidir.

Güvenlik Uyarısı: Erişim anahtarınızı asla kodunuzun içine doğrudan yazmayın. API anahtarınızı bir .env dosyasında saklayın ve python-dotenv kütüphanesi ile güvenli bir şekilde projenize dahil edin.

Pygithub ile İlk Bağlantı ve Repo Bilgisi Alma

Bağlantıyı kurduktan sonra, hedeflediğiniz bir repoyu analiz etmek oldukça basittir. Aşağıdaki kod örneğinde, bir GitHub nesnesi oluşturup belirli bir repoya nasıl erişeceğimizi göreceğiz.

from github import Github
import os

# Güvenli bir şekilde token yükleme
token = os.getenv("GITHUB_TOKEN")
g = Github(token)

# Belirli bir repoyu çekme
repo = g.get_repo("python/cpython")

print(f"Repo Adı: {repo.full_name}")
print(f"Yıldız Sayısı: {repo.stargazers_count}")
print(f"Açık Sorunlar: {repo.open_issues_count}")

Bu kod bloğu, GitHub üzerindeki en popüler repolardan biri olan CPython projesine bağlanır ve temel istatistikleri ekrana yazdırır. get_repo metodu, repo sahibi ve repo adını parametre olarak alır.

Repo İstatistiklerini Analiz Etme ve Veri Çekme

Bir repoyu analiz ederken genellikle yıldızların zaman içindeki gelişimi veya en çok katkı sağlayan geliştiriciler gibi detaylar önem kazanır. Pygithub, bu verilere ulaşmak için iteratörler sağlar.

# En son 10 katkı sağlayıcıyı listeleme
contributors = repo.get_contributors()
for contributor in contributors[:10]:
    print(f"Kullanıcı: {contributor.login}, Katkı: {contributor.contributions}")

Bu örnekte, get_contributors() metodu ile projeye en çok katkı sağlayan geliştiricileri çekiyoruz. Bu veri, bir projenin topluluk sağlığını ölçmek için kritik bir metriktir.

Hata Yönetimi ve API Hız Sınırları

GitHub API'si, belirli bir zaman diliminde yapabileceğiniz istek sayısını sınırlar. Kodunuzun beklenmedik şekilde durmaması için hız sınırını kontrol etmeniz gerekir. Pygithub, bu bilgiyi rate_limiting nesnesi üzerinden sunar.

# Mevcut hız sınırını kontrol etme
rate_limit = g.get_rate_limit()
print(f"Kalan İstek Hakkı: {rate_limit.core.remaining}")
print(f"Sıfırlanma Zamanı: {rate_limit.core.reset}")

Bu kod, API kotanızın ne kadarının kaldığını gösterir. Yoğun analiz işlemlerinde bu kontrolü döngülerinize eklemek, "403 Forbidden" hatası almanızı engeller.

Veri Görselleştirme İçin Hazırlık: Pandas ile Entegrasyon

Analiz sonuçlarını daha anlamlı kılmak için verileri Pandas DataFrame yapısına aktarmak en iyi yöntemdir. Bu sayede verileri filtreleyebilir veya grafiklerini çizebilirsiniz.

import pandas as pd

# Sorunları (Issues) bir listeye çekme
issues = repo.get_issues(state='open')
issue_data = []

for issue in issues[:50]:
    issue_data.append({
        'title': issue.title,
        'user': issue.user.login,
        'created_at': issue.created_at
    })

df = pd.DataFrame(issue_data)
print(df.head())

Bu örnek, açık sorunları bir Pandas DataFrame yapısına dönüştürür. Bu yapı, 2026 yılı veri analizi standartlarına uygun olarak, verilerinizi CSV formatında dışa aktarmanıza veya görselleştirmenize olanak tanır.

Karşılaştırmalı Analiz Yöntemleri

Yöntem Avantajı Dezavantajı
REST API (Pygithub) Kullanımı kolay, nesne yönelimli Hız sınırı kısıtlamaları
GraphQL API Tek sorguda çok veri çekme Öğrenme eğrisi daha dik

Sıkça Sorulan Sorular

Pygithub kullanırken neden 403 hatası alıyorum?

Bu hata genellikle API hız sınırını aştığınızda veya yetkisiz bir işlem yapmaya çalıştığınızda oluşur. Hız sınırını kontrol etmek için g.get_rate_limit() metodunu kullanın.

Özel bir organizasyonun tüm repolarını nasıl çekerim?

g.get_organization("org_adı").get_repos() metodunu kullanarak bir organizasyona ait tüm repoları listeleyebilirsiniz.

Analiz verilerini veritabanına kaydedebilir miyim?

Evet, çektiğiniz verileri SQLite veya PostgreSQL gibi veritabanlarına Python'un SQLAlchemy kütüphanesi ile güvenli bir şekilde kaydedebilirsiniz.

Pygithub ile çekilen veriler güncel mi?

Evet, Pygithub doğrudan GitHub'ın canlı API'sine bağlandığı için veriler anlık olarak günceldir.

Çok büyük repolarda analiz yaparken nelere dikkat etmeliyim?

Çok fazla veri çekerken paginated_list mantığını kullanmalı ve API istekleri arasına time.sleep() ile küçük gecikmeler ekleyerek sistemin yorulmasını engellemelisiniz.

Kod Güvenliği Sorumluluk Reddi: Bu makalede paylaşılan kod örnekleri eğitim amaçlıdır. API anahtarlarınızı asla herkese açık repolara yüklemeyin. Üretim ortamında (production) çalışırken çevre değişkenlerini (environment variables) kullanmanız ve hata yönetimini (try-except blokları) ihmal etmemeniz kritik önem taşır.

İleri Seviye Analiz Senaryosu: Geliştirici Katkı Yoğunluğu ve "Bus Factor" Hesaplama

GitHub verilerini analiz ederken sadece repo yıldız sayısı veya fork sayısı ile yetinmek yerine, projenin sürdürülebilirliğini ölçmek için Bus Factor (Otobüs Faktörü) analizi yapabilirsiniz. Bu metrik, projenin kritik geliştiricilerinin bir anda projeden ayrılması durumunda projenin ne kadar süre ayakta kalabileceğini tahmin eder.

Aşağıdaki kod örneği, bir repodaki katkı sağlayanların (contributors) commit sayılarını çekerek, projenin bilgi birikiminin kaç kişi üzerinde yoğunlaştığını hesaplamanıza yardımcı olur:

from github import Github

def calculate_bus_factor(repo_name, token):
    g = Github(token)
    repo = g.get_repo(repo_name)
    
    # Katkı sağlayanların commit sayılarını çek
    stats = repo.get_stats_contributors()
    if stats is None:
        return "İstatistikler henüz hazır değil."
    
    contributors = sorted(stats, key=lambda x: x.total, reverse=True)
    total_commits = sum(c.total for c in contributors)
    
    running_total = 0
    bus_factor = 0
    
    for c in contributors:
        running_total += c.total
        bus_factor += 1
        # Toplam commitlerin %50'sine ulaşan kişi sayısını bul
        if running_total >= (total_commits * 0.5):
            break
            
    return f"Bus Factor: {bus_factor} (Projenin %50'si bu {bus_factor} kişi tarafından yönetiliyor)"

# Kullanım
# print(calculate_bus_factor("owner/repo-adi", "GITHUB_TOKEN"))

Performans Optimizasyonu: Büyük Veri Setlerinde API Verimliliği

Binlerce repoya sahip bir organizasyonu veya çok fazla commit geçmişi olan büyük projeleri analiz ederken, PyGithub nesnelerini doğrudan döngü içinde çağırmak ciddi performans kayıplarına ve API hız sınırına (rate limit) takılmanıza neden olur. Bu durumu yönetmek için "Lazy Loading" (Tembel Yükleme) mantığını anlamak ve verileri önbelleğe almak gerekir.

API Çağrılarını Optimize Etme Yöntemleri

  • PaginatedList Kullanımı: Verileri tek seferde çekmek yerine, page_size parametrelerini kullanarak küçük parçalar halinde işleyin.
  • Sadece İhtiyacınız Olanı Çekin: get_commits() yerine, eğer sadece commit sayısına ihtiyacınız varsa get_contributors_stats() gibi daha spesifik uç noktaları tercih edin.
  • Yerel Önbellekleme (Caching): Analiz ettiğiniz verileri SQLite veya JSON dosyalarına kaydederek, aynı API çağrısını 24 saat içinde tekrar yapmaktan kaçının.

Aşağıdaki örnek, API çağrılarını nasıl daha verimli hale getirebileceğinizi gösteren bir try-except yapısı ile birleştirilmiş bir döngü örneğidir:

import time
from github import RateLimitExceededException

def get_repos_efficiently(org_name, g):
    org = g.get_organization(org_name)
    repos = org.get_repos()
    
    repo_data = []
    for repo in repos:
        try:
            # Hız sınırını kontrol et
            if g.get_rate_limit().core.remaining < 50:
                print("Hız sınırı düşük, bekleniyor...")
                time.sleep(300)
            
            repo_data.append({"name": repo.name, "stars": repo.stargazers_count})
        except RateLimitExceededException:
            time.sleep(60)
            
    return repo_data

Bu yöntemle, uzun süren analiz süreçlerinde uygulamanızın çökmesini engelleyebilir ve GitHub sunucularıyla olan iletişiminizi daha profesyonel bir şekilde yönetebilirsiniz. Özellikle CI/CD süreçlerinde bu tür bir hata yönetimi, otomasyonlarınızın kesintisiz çalışmasını sağlar.

Sonuç

Python ile Pygithub kütüphanesi kullanarak GitHub repo analizi yapmak, projelerin teknik borçlarını ölçmekten geliştirici verimliliğini analiz etmeye kadar geniş bir yelpazede size güç katar. Bu rehberde, temel bağlantı kurma, veri çekme, hız sınırı yönetimi ve Pandas entegrasyonu gibi kritik adımları öğrendiniz. Bir sonraki adım olarak, çektiğiniz verileri Matplotlib veya Plotly kütüphaneleri ile görselleştirerek kendi analiz panellerinizi oluşturmayı deneyebilirsiniz.

Bu yazıya tepkinizi paylaşın:
Selin Yılmaz

Zaman yönetimi ve üretkenlik ipuçları üzerine uzmanlaşmış bir içerik yazarıyım. Günlük yaşamı kolaylaştıran etkili yöntemleri okuyucularla paylaşarak hayat kalitesini artırmayı hedefliyorum.

Yorumlar (0)

Yorum Yaz