Skip to content

pacoogle/github-analizer

Repository files navigation

GitHub Analytics Tools

Raccolta di script Python per analizzare attività su GitHub, inclusi Pull Request e Issues.

Script Disponibili

1. pr_analytics.py - Analisi Pull Request

Script per analizzare le Pull Request mergiate di un autore specifico in un'organizzazione GitHub, distinguendo tra PR approvate senza bocciature e PR bocciate e poi approvate.

2. bug_analytics.py - Analisi Bug e Non-Bug

Script per ottenere il numero di "bug" e "non-bug" aperti e risolti su GitHub per un'organizzazione in un determinato periodo di tempo.

3. release_analytics.py - Analisi Completa Release

Script per analizzare le release di un repository GitHub e calcolare metriche complete su temporali, contenuto, collaborazione e aspetti tecnici.

4. lines_analytics.py - Analisi Linee di Codice

Script per ottenere il numero di linee di codice prodotte per specifiche repository in un'organizzazione GitHub, includendo statistiche su linee aggiunte, rimosse, commit e contributor.

5. changelog_email.py - Changelog mensile per stakeholder

Script per generare il contenuto dell'email di changelog mensile da inviare agli stakeholder non tecnici. Scarica le PR chiuse (mergiate) su main per i servizi (service-authentication, service-notification, service-embeddedApi, service-dashboard, service-cronjob, service-sso, service-ai-gateway, frontend-dashboard) e su release per template-mappa, estrae titolo/autore/descrizione e usa OpenAI per trasformare i conventional commit in descrizioni ad alto livello (Nuove funzionalità, Correzioni e bug, Miglioramenti).


pr_analytics.py - Descrizione

Questo script utilizza l'API di GitHub per:

  • Cercare tutte le PR mergiate di un autore specifico in un'organizzazione
  • Analizzare le review di ciascuna PR
  • Classificare le PR in due categorie:
    • PR approvate senza bocciature: PR che sono state approvate senza mai ricevere una review con stato CHANGES_REQUESTED
    • PR bocciate e poi approvate: PR che hanno ricevuto almeno una review con stato CHANGES_REQUESTED prima di essere approvate

Prerequisiti

  • Python 3.x
  • Un token di accesso personale GitHub con i permessi necessari per leggere le informazioni dell'organizzazione

Installazione

  1. Clona o scarica questo repository
  2. Installa le dipendenze richieste:
pip install -r requirements.txt

Oppure installa manualmente:

pip install requests click rich openai

Per changelog_email.py è richiesto anche openai (client OpenAI).

Configurazione

Prima di utilizzare lo script, devi configurare un token di accesso GitHub:

  1. Crea un Personal Access Token su GitHub con i permessi necessari per leggere le informazioni dell'organizzazione
  2. Imposta la variabile d'ambiente GITHUB_TOKEN:
export GITHUB_TOKEN=tuo_token_personale

Per rendere la variabile permanente, aggiungi la riga al tuo file ~/.zshrc o ~/.bashrc.

Alternativa: Puoi passare il token direttamente come parametro CLI con --token.


bug_analytics.py - Descrizione

Questo script utilizza l'API di GitHub per:

  • Cercare tutte le issues (non Pull Request) create in un'organizzazione nel periodo specificato
  • Classificare le issues come "bug" (se hanno la label bug) o "non-bug" (se non hanno la label bug)
  • Contare le issues aperte e risolte nel periodo specificato
  • Fornire statistiche aggregate per bug e non-bug

Classificazione Bug/Non-Bug

Le issues sono classificate come:

  • Bug: Issues che hanno la label bug su GitHub
  • Non-Bug: Issues che non hanno la label bug (tutte le altre issues)

Stati delle Issues

  • Aperte: Issues create nel periodo specificato che risultano ancora aperte
  • Risolte: Issues chiuse nel periodo specificato (indipendentemente da quando sono state create)

Utilizzo

pr_analytics.py

Esegui lo script con i seguenti parametri obbligatori:

python pr_analytics.py --org ORGANIZZAZIONE --author AUTORE --from-date YYYY-MM-DD --to-date YYYY-MM-DD

Parametri Obbligatori

  • --org: Nome dell'organizzazione GitHub (es. Gamindo)
  • --author: Username GitHub dell'autore delle PR (es. pacoogle)
  • --from-date: Data di inizio del periodo da analizzare (formato: YYYY-MM-DD)
  • --to-date: Data di fine del periodo da analizzare (formato: YYYY-MM-DD)

Opzioni Opzionali

  • --token: Token GitHub (alternativa a GITHUB_TOKEN env var)
  • --output: Formato di output (table, json, csv) - default: table
  • --export: File di esportazione per JSON/CSV (es. results.json, results.csv)
  • --verbose / -v: Mostra informazioni dettagliate durante l'esecuzione
  • --no-details: Non mostrare il dettaglio delle singole PR (solo statistiche)

Esempi

Esempio base con output tabella:

python pr_analytics.py --org Gamindo --author pacoogle --from-date 2024-01-01 --to-date 2024-12-31

Esempio con output JSON:

python pr_analytics.py --org Gamindo --author pacoogle --from-date 2024-01-01 --to-date 2024-12-31 --output json

Esempio con esportazione CSV:

python pr_analytics.py --org Gamindo --author pacoogle --from-date 2024-01-01 --to-date 2024-12-31 --output csv --export risultati.csv

Esempio con modalità verbose:

python pr_analytics.py --org Gamindo --author pacoogle --from-date 2024-01-01 --to-date 2024-12-31 --verbose

Esempio senza dettagli (solo statistiche):

python pr_analytics.py --org Gamindo --author pacoogle --from-date 2024-01-01 --to-date 2024-12-31 --no-details

Esempio con token passato come parametro:

python pr_analytics.py --org Gamindo --author pacoogle --from-date 2024-01-01 --to-date 2024-12-31 --token ghp_tuo_token_qui

changelog_email.py

Genera il contenuto dell'email di changelog mensile per stakeholder non tecnici. Scarica le PR mergiate su main (per i repo servizi e frontend-dashboard) e su release (template-mappa), poi invia titoli e descrizioni a OpenAI per ottenere un testo in linguaggio business (Nuove funzionalità, Correzioni e bug, Miglioramenti).

Configurazione: oltre a GITHUB_TOKEN, imposta OPENAI_API_KEY (o usa --openai-key).

Parametri obbligatori:

  • --org: Organizzazione GitHub (es. Gamindo)
  • --from-date: Inizio periodo (YYYY-MM-DD)
  • --to-date: Fine periodo (YYYY-MM-DD)

Opzioni: --token, --openai-key, --no-body (escludi descrizioni PR dal contesto AI), --no-openai (solo elenco PR, senza generazione email), --model (modello OpenAI, default gpt-4o-mini), -v/--verbose.

Esempio (changelog gennaio 2025):

python changelog_email.py --org Gamindo --from-date 2025-01-01 --to-date 2025-01-31

Solo download PR (senza OpenAI):

python changelog_email.py --org Gamindo --from-date 2025-01-01 --to-date 2025-01-31 --no-openai -v

Lo script stampa il corpo dell'email da copiare e inviare; l’oggetto (subject) va scelto da te (es. "Changelog mensile – Gennaio 2025").

Output

Lo script supporta tre formati di output:

Output Tabella (default)

Mostra una tabella formattata con:

  • Statistiche riassuntive (numero di PR per categoria)
  • Dettaglio delle PR divise per categoria (se --no-details non è specificato)
  • Formattazione colorata e leggibile grazie a Rich

Output JSON

Formato strutturato JSON con tutte le informazioni:

  • Lista completa delle PR con dettagli (numero, titolo, URL, repository, data merge)
  • Statistiche aggregate

Output CSV

File CSV esportabile con colonne:

  • Categoria
  • Numero PR
  • Titolo
  • Repository
  • URL
  • Data Merge

Funzionalità CLI

La CLI moderna include:

  • Validazione automatica delle date - Verifica che le date siano nel formato corretto
  • Progress bar - Indicatori di avanzamento durante l'elaborazione (con --verbose)
  • Gestione errori migliorata - Messaggi di errore chiari e informativi
  • Output formattato - Tabelle colorate e leggibili con Rich
  • Export multipli - Supporto per JSON e CSV
  • Verbosity configurabile - Controllo dettaglio output
  • Help integrato - python pr_analytics.py --help per vedere tutte le opzioni

bug_analytics.py

Esegui lo script con i seguenti parametri obbligatori:

python bug_analytics.py --org ORGANIZZAZIONE --from-date YYYY-MM-DD --to-date YYYY-MM-DD

Parametri Obbligatori

  • --org: Nome dell'organizzazione GitHub (es. Gamindo)
  • --from-date: Data di inizio del periodo da analizzare (formato: YYYY-MM-DD)
  • --to-date: Data di fine del periodo da analizzare (formato: YYYY-MM-DD)

Opzioni Opzionali

  • --repos: Lista di repository da analizzare (separati da virgola, es: repo1,repo2,repo3)
  • --repos-file: File con lista di repository da analizzare (un repository per riga, righe vuote e commenti con # vengono ignorati)
  • --all-types: Cerca sia bug che non-bug anche con repository specificati (default: solo bug con --repos per ridurre chiamate API)
  • --token: Token GitHub (alternativa a GITHUB_TOKEN env var)
  • --output: Formato di output (table, json, csv) - default: table
  • --export: File di esportazione per JSON/CSV (es. bug_results.json, bug_results.csv)
  • --verbose / -v: Mostra informazioni dettagliate durante l'esecuzione
  • --no-details: Non mostrare il dettaglio delle singole issues (solo statistiche)

Nota: Se non specifichi --repos o --repos-file, lo script analizza tutti i repository dell'organizzazione.

Ottimizzazione Rate Limit: Quando specifichi repository con --repos o --repos-file, per default lo script cerca solo i bug per ridurre le chiamate API e evitare rate limit. Usa --all-types se vuoi cercare anche i non-bug con repository specificati.

Esempi

Esempio base con output tabella:

python bug_analytics.py --org Gamindo --from-date 2024-01-01 --to-date 2024-12-31

Esempio con output JSON:

python bug_analytics.py --org Gamindo --from-date 2024-01-01 --to-date 2024-12-31 --output json

Esempio con esportazione CSV:

python bug_analytics.py --org Gamindo --from-date 2024-01-01 --to-date 2024-12-31 --output csv --export bug_risultati.csv

Esempio con modalità verbose:

python bug_analytics.py --org Gamindo --from-date 2024-01-01 --to-date 2024-12-31 --verbose

Esempio senza dettagli (solo statistiche):

python bug_analytics.py --org Gamindo --from-date 2024-01-01 --to-date 2024-12-31 --no-details

Esempio con repository specifici:

python bug_analytics.py --org Gamindo --from-date 2024-01-01 --to-date 2024-12-31 --repos my-repo,another-repo,third-repo

Esempio con file di repository:

# Crea un file repos.txt con:
# my-repo
# another-repo
# third-repo

python bug_analytics.py --org Gamindo --from-date 2024-01-01 --to-date 2024-12-31 --repos-file repos.txt

Esempio combinato (repository specifici + verbose):

python bug_analytics.py --org Gamindo --from-date 2024-01-01 --to-date 2024-12-31 --repos my-repo,another-repo --verbose

Esempio con --all-types (cerca anche non-bug con repository specificati):

python bug_analytics.py --org Gamindo --from-date 2024-01-01 --to-date 2024-12-31 --repos my-repo,another-repo --all-types

Nota: Con --repos o --repos-file, per default cerca solo i bug per evitare rate limit. Usa --all-types per cercare anche i non-bug.


Output

pr_analytics.py Output

Lo script supporta tre formati di output:

Output Tabella (default)

Mostra una tabella formattata con:

  • Statistiche riassuntive (numero di PR per categoria)
  • Dettaglio delle PR divise per categoria (se --no-details non è specificato)
  • Formattazione colorata e leggibile grazie a Rich

Output JSON

Formato strutturato JSON con tutte le informazioni:

  • Lista completa delle PR con dettagli (numero, titolo, URL, repository, data merge)
  • Statistiche aggregate

Output CSV

File CSV esportabile con colonne:

  • Categoria
  • Numero PR
  • Titolo
  • Repository
  • URL
  • Data Merge

bug_analytics.py Output

Lo script supporta tre formati di output:

Output Tabella (default)

Mostra una tabella formattata con:

  • Statistiche riassuntive per Bug e Non-Bug
  • Colonne separate per "Aperti" e "Risolti"
  • Dettaglio delle issues divise per categoria e stato (se --no-details non è specificato)
  • Formattazione colorata e leggibile grazie a Rich

Output JSON

Formato strutturato JSON con tutte le informazioni:

  • Lista completa delle issues con dettagli (numero, titolo, URL, repository, stato, date, labels)
  • Statistiche aggregate per bug e non-bug
  • Informazioni sul periodo analizzato

Output CSV

File CSV esportabile con colonne:

  • Tipo (Bug/Non-Bug)
  • Stato (Aperto/Risolto)
  • Numero Issue
  • Titolo
  • Repository
  • URL
  • Data Creazione
  • Data Chiusura
  • Labels

release_analytics.py - Descrizione

Script completo per analizzare le release di tutti i repository di un'organizzazione GitHub e calcolare metriche dettagliate su:

Metriche Temporali

  • Giorno della settimana più produttivo — quale giorno ha più release
  • Ora del giorno preferita — distribuzione oraria dei rilasci
  • Release più frequente — intervallo minimo tra due release
  • Mese più attivo — mese con più release
  • Release notturne — rilasci dopo mezzanotte (00:00-06:00)
  • Release nel weekend — rilasci nel fine settimana

Metriche di Contenuto

  • Release note più lunga — caratteri/parole
  • Release più "emotiva" — più emoji nelle note
  • Parole più usate — nelle release note (es. "fix", "feature", "breaking")
  • Release con più commit — numero di commit inclusi
  • Release con più autori — numero di contributor diversi

Metriche di Collaborazione

  • Chi ha rilasciato di più — autore più frequente
  • Release più collaborativa — più reviewer/approver
  • Release "solitario" — rilasciate da una sola persona
  • Release cross-team — con contributor da team diversi

Metriche Tecniche

  • Release più "rischiosa" — più file modificati
  • Release più "pulita" — meno file modificati
  • Release con più breaking changes — identificati nelle note
  • Release più stabile — meno bug fix successivi
  • Release più "hotfix" — rilasciate subito dopo un bug

Utilizzo

Esegui lo script con i seguenti parametri:

python release_analytics.py --org ORGANIZZAZIONE

Parametri Obbligatori

  • --org: Nome dell'organizzazione GitHub

Opzioni Opzionali

  • --repos: Lista di repository da analizzare (separati da virgola, es: repo1,repo2,repo3)
  • --repos-file: File con lista di repository da analizzare (un repository per riga, righe vuote e commenti con # vengono ignorati)
  • --from-date: Data di inizio filtro (YYYY-MM-DD) - analizza solo release in questo periodo
  • --to-date: Data di fine filtro (YYYY-MM-DD) - analizza solo release in questo periodo
  • --token: Token GitHub (alternativa a GITHUB_TOKEN env var)
  • --output: Formato di output (table, json) - default: table
  • --export: File di esportazione JSON (es. release_results.json)
  • --verbose / -v: Mostra informazioni dettagliate durante l'esecuzione

Nota: Se non specifichi --repos o --repos-file, lo script analizza tutti i repository dell'organizzazione.

Esempi

Esempio base con output tabella (tutti i repository):

python release_analytics.py --org Gamindo

Esempio con lista specifica di repository:

python release_analytics.py --org Gamindo --repos my-repo,another-repo,third-repo

Esempio con file di repository:

# Crea un file repos.txt con:
# my-repo
# another-repo
# third-repo

python release_analytics.py --org Gamindo --repos-file repos.txt

Esempio con filtro temporale:

python release_analytics.py --org Gamindo --from-date 2024-01-01 --to-date 2024-12-31

Esempio combinato (repository specifici + filtro temporale):

python release_analytics.py --org Gamindo --repos my-repo,another-repo --from-date 2024-01-01 --to-date 2024-12-31

Esempio con output JSON:

python release_analytics.py --org Gamindo --output json

Esempio con esportazione:

python release_analytics.py --org Gamindo --export release_metrics.json

Esempio con modalità verbose:

python release_analytics.py --org Gamindo --verbose

Output

Lo script supporta due formati di output:

Output Tabella (default)

Mostra tabelle formattate organizzate per categoria:

  • 📅 Metriche Temporali
  • 📝 Metriche di Contenuto
  • 👥 Metriche di Collaborazione
  • ⚙️ Metriche Tecniche

Output JSON

Formato strutturato JSON con tutte le metriche calcolate:

  • Metriche temporali complete con distribuzioni
  • Dettagli su release specifiche (più lunga, più emotiva, ecc.)
  • Statistiche di collaborazione
  • Metriche tecniche dettagliate

lines_analytics.py - Descrizione

Script per ottenere il numero di linee di codice prodotte per specifiche repository in un'organizzazione GitHub.

Metriche Calcolate

Per ogni repository analizzato, lo script mostra:

  • Linee Aggiunte — numero totale di linee aggiunte nel repository
  • Linee Rimosse — numero totale di linee rimosse nel repository
  • Totale Netto — differenza tra linee aggiunte e rimosse (additions - deletions)
  • Commit — numero totale di commit nel repository
  • Contributor — numero di contributor unici che hanno contribuito al repository

Utilizzo

Esegui lo script con i seguenti parametri:

python lines_analytics.py --org ORGANIZZAZIONE --repos REPO1,REPO2,REPO3

Oppure usando un file:

python lines_analytics.py --org ORGANIZZAZIONE --repos-file repos.txt

Parametri Obbligatori

  • --org: Nome dell'organizzazione GitHub (es. Gamindo)
  • --repos o --repos-file: Deve essere specificato almeno uno tra questi due parametri
    • --repos: Lista di repository separati da virgola (es: repo1,repo2,repo3)
    • --repos-file: File con lista di repository (un repository per riga, righe vuote e commenti con # vengono ignorati)

Opzioni Opzionali

  • --from-date: Data inizio filtro (YYYY-MM-DD) - analizza solo linee aggiunte da questa data
  • --to-date: Data fine filtro (YYYY-MM-DD) - analizza solo linee aggiunte fino a questa data
  • --token: Token GitHub (alternativa a GITHUB_TOKEN env var)
  • --output: Formato di output (table, json, csv) - default: table
  • --export: File di esportazione per JSON/CSV (es. lines_results.json, lines_results.csv)
  • --verbose / -v: Mostra informazioni dettagliate durante l'esecuzione

Nota: Se specifichi --from-date, devi specificare anche --to-date e viceversa. Entrambe le date devono essere nel formato YYYY-MM-DD.

Esempi

Esempio base con lista di repository:

python lines_analytics.py --org Gamindo --repos my-repo,another-repo,third-repo

Esempio con file di repository:

# Crea un file repos.txt con:
# my-repo
# another-repo
# third-repo

python lines_analytics.py --org Gamindo --repos-file repos.txt

Esempio con output JSON:

python lines_analytics.py --org Gamindo --repos my-repo,another-repo --output json

Esempio con esportazione CSV:

python lines_analytics.py --org Gamindo --repos my-repo,another-repo --output csv --export lines_results.csv

Esempio con modalità verbose:

python lines_analytics.py --org Gamindo --repos my-repo,another-repo --verbose

Esempio con filtro temporale:

python lines_analytics.py --org Gamindo --repos my-repo,another-repo --from-date 2024-01-01 --to-date 2024-12-31

Esempio combinato (filtro temporale + esportazione CSV):

python lines_analytics.py --org Gamindo --repos my-repo,another-repo --from-date 2024-01-01 --to-date 2024-12-31 --output csv --export lines_2024.csv

Output

Lo script supporta tre formati di output:

Output Tabella (default)

Mostra tabelle formattate con:

  • Tabella dettaglio per ogni repository con tutte le metriche
  • Tabella totali con statistiche aggregate
  • Formattazione colorata e leggibile grazie a Rich

Output JSON

Formato strutturato JSON con tutte le informazioni:

  • Lista completa dei repository con tutte le metriche
  • Totali aggregati per tutte le repository analizzate
  • Informazioni sull'organizzazione
  • Periodo analizzato (se specificato con --from-date e --to-date)

Output CSV

File CSV esportabile con colonne:

  • Repository
  • Linee Aggiunte
  • Linee Rimosse
  • Totale Netto
  • Commit
  • Contributor
  • Status

Note

  • Tutti gli script utilizzano la GitHub API che ha limiti di rate limiting
  • Le date devono essere nel formato YYYY-MM-DD
  • pr_analytics.py analizza solo le PR che sono state effettivamente mergiate nel periodo specificato
  • bug_analytics.py classifica le issues come bug se hanno la label bug su GitHub. Assicurati che le issues siano etichettate correttamente nell'organizzazione
  • bug_analytics.py conta le issues aperte create nel periodo e le issues chiuse nel periodo (indipendentemente da quando sono state create)
  • bug_analytics.py supporta il filtro per repository specifici tramite --repos (lista separata da virgola) o --repos-file (file con un repository per riga). Se non specificato, analizza tutti i repository dell'organizzazione
  • bug_analytics.py quando usa --repos o --repos-file, per default cerca solo i bug per ridurre le chiamate API e evitare rate limit. Usa --all-types per cercare anche i non-bug con repository specificati
  • release_analytics.py analizza tutte le release di tutti i repository dell'organizzazione (o solo quelli specificati con --repos o --repos-file). Per metriche accurate su commit e file modificati, richiede accesso ai tag e alla storia dei commit
  • release_analytics.py identifica breaking changes cercando parole chiave nelle release notes ("breaking change", "breaking", "major", ecc.)
  • release_analytics.py mostra il repository di origine per ogni metrica (es. "release più lunga" indica anche da quale repo proviene)
  • release_analytics.py supporta il filtro per repository specifici tramite --repos (lista separata da virgola) o --repos-file (file con un repository per riga)
  • lines_analytics.py utilizza l'API /repos/{owner}/{repo}/stats/contributors di GitHub che può richiedere tempo per calcolare le statistiche. Lo script gestisce automaticamente i ritardi e i retry necessari
  • lines_analytics.py richiede che almeno un repository sia specificato tramite --repos o --repos-file. Non analizza tutti i repository dell'organizzazione per default
  • lines_analytics.py mostra "N/A" per repository non accessibili o con errori, ma continua l'analisi degli altri repository
  • lines_analytics.py supporta il filtro temporale con --from-date e --to-date per analizzare solo le linee di codice aggiunte in un determinato periodo. Le date devono essere specificate entrambe se si vuole filtrare per periodo
  • lines_analytics.py quando usa il filtro temporale, filtra le settimane di contribuzione basandosi sul timestamp Unix della settimana. Il conteggio dei commit è una stima basata sulla presenza di attività nelle settimane del periodo specificato

About

Github CLI to analyze performance

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages