Raccolta di script Python per analizzare attività su GitHub, inclusi Pull Request e Issues.
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.
Script per ottenere il numero di "bug" e "non-bug" aperti e risolti su GitHub per un'organizzazione in un determinato periodo di tempo.
Script per analizzare le release di un repository GitHub e calcolare metriche complete su temporali, contenuto, collaborazione e aspetti tecnici.
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.
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).
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_REQUESTEDprima di essere approvate
- PR approvate senza bocciature: PR che sono state approvate senza mai ricevere una review con stato
- Python 3.x
- Un token di accesso personale GitHub con i permessi necessari per leggere le informazioni dell'organizzazione
- Clona o scarica questo repository
- Installa le dipendenze richieste:
pip install -r requirements.txtOppure installa manualmente:
pip install requests click rich openaiPer changelog_email.py è richiesto anche openai (client OpenAI).
Prima di utilizzare lo script, devi configurare un token di accesso GitHub:
- Crea un Personal Access Token su GitHub con i permessi necessari per leggere le informazioni dell'organizzazione
- Imposta la variabile d'ambiente
GITHUB_TOKEN:
export GITHUB_TOKEN=tuo_token_personalePer rendere la variabile permanente, aggiungi la riga al tuo file ~/.zshrc o ~/.bashrc.
Alternativa: Puoi passare il token direttamente come parametro CLI con --token.
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 labelbug) - Contare le issues aperte e risolte nel periodo specificato
- Fornire statistiche aggregate per bug e non-bug
Le issues sono classificate come:
- Bug: Issues che hanno la label
bugsu GitHub - Non-Bug: Issues che non hanno la label
bug(tutte le altre issues)
- Aperte: Issues create nel periodo specificato che risultano ancora aperte
- Risolte: Issues chiuse nel periodo specificato (indipendentemente da quando sono state create)
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--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)
--token: Token GitHub (alternativa aGITHUB_TOKENenv 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)
Esempio base con output tabella:
python pr_analytics.py --org Gamindo --author pacoogle --from-date 2024-01-01 --to-date 2024-12-31Esempio con output JSON:
python pr_analytics.py --org Gamindo --author pacoogle --from-date 2024-01-01 --to-date 2024-12-31 --output jsonEsempio 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.csvEsempio con modalità verbose:
python pr_analytics.py --org Gamindo --author pacoogle --from-date 2024-01-01 --to-date 2024-12-31 --verboseEsempio senza dettagli (solo statistiche):
python pr_analytics.py --org Gamindo --author pacoogle --from-date 2024-01-01 --to-date 2024-12-31 --no-detailsEsempio 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_quiGenera 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-31Solo download PR (senza OpenAI):
python changelog_email.py --org Gamindo --from-date 2025-01-01 --to-date 2025-01-31 --no-openai -vLo script stampa il corpo dell'email da copiare e inviare; l’oggetto (subject) va scelto da te (es. "Changelog mensile – Gennaio 2025").
Lo script supporta tre formati di output:
Mostra una tabella formattata con:
- Statistiche riassuntive (numero di PR per categoria)
- Dettaglio delle PR divise per categoria (se
--no-detailsnon è specificato) - Formattazione colorata e leggibile grazie a Rich
Formato strutturato JSON con tutte le informazioni:
- Lista completa delle PR con dettagli (numero, titolo, URL, repository, data merge)
- Statistiche aggregate
File CSV esportabile con colonne:
- Categoria
- Numero PR
- Titolo
- Repository
- URL
- Data Merge
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 --helpper vedere tutte le opzioni
Esegui lo script con i seguenti parametri obbligatori:
python bug_analytics.py --org ORGANIZZAZIONE --from-date YYYY-MM-DD --to-date YYYY-MM-DD--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)
--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--reposper ridurre chiamate API)--token: Token GitHub (alternativa aGITHUB_TOKENenv 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.
Esempio base con output tabella:
python bug_analytics.py --org Gamindo --from-date 2024-01-01 --to-date 2024-12-31Esempio con output JSON:
python bug_analytics.py --org Gamindo --from-date 2024-01-01 --to-date 2024-12-31 --output jsonEsempio con esportazione CSV:
python bug_analytics.py --org Gamindo --from-date 2024-01-01 --to-date 2024-12-31 --output csv --export bug_risultati.csvEsempio con modalità verbose:
python bug_analytics.py --org Gamindo --from-date 2024-01-01 --to-date 2024-12-31 --verboseEsempio senza dettagli (solo statistiche):
python bug_analytics.py --org Gamindo --from-date 2024-01-01 --to-date 2024-12-31 --no-detailsEsempio 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-repoEsempio 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.txtEsempio 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 --verboseEsempio 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-typesNota: Con --repos o --repos-file, per default cerca solo i bug per evitare rate limit. Usa --all-types per cercare anche i non-bug.
Lo script supporta tre formati di output:
Mostra una tabella formattata con:
- Statistiche riassuntive (numero di PR per categoria)
- Dettaglio delle PR divise per categoria (se
--no-detailsnon è specificato) - Formattazione colorata e leggibile grazie a Rich
Formato strutturato JSON con tutte le informazioni:
- Lista completa delle PR con dettagli (numero, titolo, URL, repository, data merge)
- Statistiche aggregate
File CSV esportabile con colonne:
- Categoria
- Numero PR
- Titolo
- Repository
- URL
- Data Merge
Lo script supporta tre formati di output:
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-detailsnon è specificato) - Formattazione colorata e leggibile grazie a Rich
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
File CSV esportabile con colonne:
- Tipo (Bug/Non-Bug)
- Stato (Aperto/Risolto)
- Numero Issue
- Titolo
- Repository
- URL
- Data Creazione
- Data Chiusura
- Labels
Script completo per analizzare le release di tutti i repository di un'organizzazione GitHub e calcolare metriche dettagliate su:
- 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
- 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
- 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
- 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
Esegui lo script con i seguenti parametri:
python release_analytics.py --org ORGANIZZAZIONE--org: Nome dell'organizzazione GitHub
--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 aGITHUB_TOKENenv 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.
Esempio base con output tabella (tutti i repository):
python release_analytics.py --org GamindoEsempio con lista specifica di repository:
python release_analytics.py --org Gamindo --repos my-repo,another-repo,third-repoEsempio 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.txtEsempio con filtro temporale:
python release_analytics.py --org Gamindo --from-date 2024-01-01 --to-date 2024-12-31Esempio 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-31Esempio con output JSON:
python release_analytics.py --org Gamindo --output jsonEsempio con esportazione:
python release_analytics.py --org Gamindo --export release_metrics.jsonEsempio con modalità verbose:
python release_analytics.py --org Gamindo --verboseLo script supporta due formati di output:
Mostra tabelle formattate organizzate per categoria:
- 📅 Metriche Temporali
- 📝 Metriche di Contenuto
- 👥 Metriche di Collaborazione
- ⚙️ Metriche Tecniche
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
Script per ottenere il numero di linee di codice prodotte per specifiche repository in un'organizzazione GitHub.
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
Esegui lo script con i seguenti parametri:
python lines_analytics.py --org ORGANIZZAZIONE --repos REPO1,REPO2,REPO3Oppure usando un file:
python lines_analytics.py --org ORGANIZZAZIONE --repos-file repos.txt--org: Nome dell'organizzazione GitHub (es.Gamindo)--reposo--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)
--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 aGITHUB_TOKENenv 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.
Esempio base con lista di repository:
python lines_analytics.py --org Gamindo --repos my-repo,another-repo,third-repoEsempio 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.txtEsempio con output JSON:
python lines_analytics.py --org Gamindo --repos my-repo,another-repo --output jsonEsempio con esportazione CSV:
python lines_analytics.py --org Gamindo --repos my-repo,another-repo --output csv --export lines_results.csvEsempio con modalità verbose:
python lines_analytics.py --org Gamindo --repos my-repo,another-repo --verboseEsempio con filtro temporale:
python lines_analytics.py --org Gamindo --repos my-repo,another-repo --from-date 2024-01-01 --to-date 2024-12-31Esempio 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.csvLo script supporta tre formati di output:
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
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-datee--to-date)
File CSV esportabile con colonne:
- Repository
- Linee Aggiunte
- Linee Rimosse
- Totale Netto
- Commit
- Contributor
- Status
- Tutti gli script utilizzano la GitHub API che ha limiti di rate limiting
- Le date devono essere nel formato
YYYY-MM-DD pr_analytics.pyanalizza solo le PR che sono state effettivamente mergiate nel periodo specificatobug_analytics.pyclassifica le issues come bug se hanno la labelbugsu GitHub. Assicurati che le issues siano etichettate correttamente nell'organizzazionebug_analytics.pyconta le issues aperte create nel periodo e le issues chiuse nel periodo (indipendentemente da quando sono state create)bug_analytics.pysupporta 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'organizzazionebug_analytics.pyquando usa--reposo--repos-file, per default cerca solo i bug per ridurre le chiamate API e evitare rate limit. Usa--all-typesper cercare anche i non-bug con repository specificatirelease_analytics.pyanalizza tutte le release di tutti i repository dell'organizzazione (o solo quelli specificati con--reposo--repos-file). Per metriche accurate su commit e file modificati, richiede accesso ai tag e alla storia dei commitrelease_analytics.pyidentifica breaking changes cercando parole chiave nelle release notes ("breaking change", "breaking", "major", ecc.)release_analytics.pymostra il repository di origine per ogni metrica (es. "release più lunga" indica anche da quale repo proviene)release_analytics.pysupporta il filtro per repository specifici tramite--repos(lista separata da virgola) o--repos-file(file con un repository per riga)lines_analytics.pyutilizza l'API/repos/{owner}/{repo}/stats/contributorsdi GitHub che può richiedere tempo per calcolare le statistiche. Lo script gestisce automaticamente i ritardi e i retry necessarilines_analytics.pyrichiede che almeno un repository sia specificato tramite--reposo--repos-file. Non analizza tutti i repository dell'organizzazione per defaultlines_analytics.pymostra "N/A" per repository non accessibili o con errori, ma continua l'analisi degli altri repositorylines_analytics.pysupporta il filtro temporale con--from-datee--to-dateper analizzare solo le linee di codice aggiunte in un determinato periodo. Le date devono essere specificate entrambe se si vuole filtrare per periodolines_analytics.pyquando 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