Skip to content
Snippets Groups Projects
Commit 6d1f688e authored by LE DURAND Matteo's avatar LE DURAND Matteo
Browse files

Merge branch '24-transformation-ui' into 'dev'

changement du chargement des données

See merge request !21
parents f1d67250 97883a88
Branches
No related tags found
2 merge requests!21changement du chargement des données,!18MAJ de main de la branche dev
#dernier -----
# Charger les packages nécessaires
library(httr)
library(jsonlite)
library(dplyr)
library(DT)
# Récupérer le token GitHub depuis l'environnement
api_key <- Sys.getenv("GITHUB_PAT")
# Fonction pour récupérer les commits d'un projet GitHub avec clé API
get_github_commits <- function(repo) {
url <- paste0("https://api.github.com/repos/", repo, "/commits")
response <- GET(url, authenticate(api_key, "")) # Utilisation de la clé API
if (status_code(response) != 200) {
stop("Failed to fetch commits from GitHub API")
}
commits <- fromJSON(content(response, "text"), flatten = TRUE)
commits <- commits %>%
mutate(project_name = repo, # Ajouter le nom du projet
type = "commit", # Spécifier le type comme "commit"
message = commit.message, # Utiliser le message du commit
last_updated = commit.committer.date) %>% # Date de la dernière mise à jour
select(project_name, type, message, last_updated) # Conserver les colonnes pertinentes
return(commits)
}
# Fonction pour récupérer les issues d'un projet GitHub avec clé API
get_github_issues <- function(repo) {
url <- paste0("https://api.github.com/repos/", repo, "/issues?state=all")
response <- GET(url, authenticate(api_key, "")) # Utilisation de la clé API
if (status_code(response) != 200) {
stop("Failed to fetch issues from GitHub API")
}
issues <- fromJSON(content(response, "text"), flatten = TRUE)
issues <- issues %>%
mutate(project_name = repo, # Ajouter le nom du projet
type = "issue", # Spécifier le type comme "issue"
message = title, # Utiliser le titre de l'issue
last_updated = updated_at) %>% # Date de la dernière mise à jour
select(project_name, type, message, last_updated) # Conserver les colonnes pertinentes
return(issues)
}
# Récupérer les commits et les issues pour le projet spyrales/shinygouv
repo_shinygouv <- "spyrales/shinygouv"
commits_shinygouv <- get_github_commits(repo_shinygouv)
issues_shinygouv <- get_github_issues(repo_shinygouv)
# Récupérer les commits et les issues pour le projet spyrales/gouvdown
repo_gouvdown <- "spyrales/gouvdown"
commits_gouvdown <- get_github_commits(repo_gouvdown)
issues_gouvdown <- get_github_issues(repo_gouvdown)
# Combiner les dataframes de commits et issues pour les deux dépôts
combined_data <- bind_rows(commits_shinygouv, issues_shinygouv, commits_gouvdown, issues_gouvdown)
combined_data <- rename(combined_data, "updated_at" = 'last_updated')
# Afficher les premières lignes du tableau combiné
date_datamart <-format.Date(Sys.Date(), '%d/%m/%Y')
save.image("github.RData")
# Charger les packages nécessaires
library(httr)
library(jsonlite)
library(dplyr)
library(DT)
library(stringr)
# Variables pour l'API GitLab -----
base_url <- "https://gitlab.com"
private_token <- Sys.getenv("GITLAB_PAT") # Récupération du token depuis Renviron
# Fonction pour gérer la pagination de l'API GitLab avec retry et timeout
get_all_pages <- function(url, private_token, max_retries = 3) {
# Fonction interne pour récupérer une page avec retry
get_page <- function(page) {
retries <- 0
success <- FALSE
while (!success && retries < max_retries) {
tryCatch({
# Faire la requête GET pour une page spécifique
response <- GET(
url,
query = list(page = page, per_page = 100),
add_headers("PRIVATE-TOKEN" = private_token),
timeout(120) # Timeout augmenté à 120 secondes
)
# Vérification du statut de la réponse
if (status_code(response) != 200) {
stop("La requête API a échoué avec le statut: ", status_code(response))
}
# Extraire les données de la réponse avec l'encodage UTF-8 pour éviter le message
data <- fromJSON(content(response, "text", encoding = "UTF-8"), flatten = TRUE)
success <- TRUE # Si la requête réussit, sortir de la boucle
return(data)
}, error = function(e) {
retries <- retries + 1
message("Erreur de connexion, tentative: ", retries, ". Détails: ", e$message)
Sys.sleep(2 * retries) # Attendre avant de réessayer
})
}
if (!success) {
stop("Echec de récupération des données après ", max_retries, " tentatives.")
}
}
# Initialiser la récupération des données avec la première page
first_page_data <- get_page(1)
# Vérifier s'il y a plusieurs pages en analysant l'en-tête "Link"
link_header <- headers(response)[["link"]]
if (!is.null(link_header) && str_detect(link_header, "rel=\"next\"")) {
# Trouver le nombre total de pages dans l'en-tête
num_pages <- max(str_extract_all(link_header, "page=\\d+")[[1]] %>% str_remove_all("page=") %>% as.integer())
# Utiliser lapply pour récupérer les pages suivantes
other_pages_data <- lapply(2:num_pages, get_page)
# Combiner toutes les pages de données
all_data <- bind_rows(first_page_data, bind_rows(other_pages_data))
} else {
# Si une seule page, renvoyer seulement les données de la première page
all_data <- first_page_data
}
return(all_data)
}
# Fonction pour extraire le nom du projet à partir de l'URL
extract_project_name <- function(web_url) {
# Utiliser une expression régulière pour capturer le dernier segment significatif avant "/-/"
str_extract(web_url, "(?<=/)[^/]+(?=/-/)")
}
# Fonction pour récupérer les commits d'un projet GitLab
get_gitlab_commits <- function(base_url, project_id, private_token) {
api_url <- paste0(base_url, "/api/v4/projects/", project_id, "/repository/commits")
# Récupérer toutes les pages avec pagination
data <- get_all_pages(api_url, private_token)
# Harmoniser les types de colonnes et sélectionner les colonnes pertinentes
data <- data %>%
mutate(
id = as.character(id),
project_name = extract_project_name(web_url),
data_type = "commit",
discussion = message,
updated_at = committed_date
)
return(data %>% select(project_name, data_type, discussion, updated_at))
}
# Fonction pour récupérer les issues d'un projet GitLab
get_gitlab_issues <- function(base_url, project_id, private_token) {
api_url <- paste0(base_url, "/api/v4/projects/", project_id, "/issues")
# Récupérer toutes les pages avec pagination
data <- get_all_pages(api_url, private_token)
# Harmoniser les types de colonnes et sélectionner les colonnes pertinentes
data <- data %>%
mutate(
id = as.character(id),
project_name = extract_project_name(web_url),
data_type = "issue",
discussion = title
)
return(data %>% select(project_name, data_type, discussion, updated_at))
}
# Fonction pour récupérer et filtrer les events d'un projet GitLab
get_gitlab_events <- function(base_url, project_id, private_token) {
api_url <- paste0(base_url, "/api/v4/projects/", project_id, "/events")
# Récupérer toutes les pages avec pagination
data <- get_all_pages(api_url, private_token)
# Garder seulement les événements où action_name est "commented on"
data <- data %>%
filter(action_name == "commented on") %>%
mutate(
id = as.character(id),
project_name = extract_project_name(web_url),
data_type = "event",
discussion = note.body,
updated_at = note.updated_at
)
return(data %>% select(project_name, data_type, discussion, updated_at))
}
# Fonction pour récupérer les données d'un projet
get_data_for_project <- function(base_url, project_id, private_token) {
commits_data <- tryCatch(get_gitlab_commits(base_url, project_id, private_token), error = function(e) NULL)
issues_data <- tryCatch(get_gitlab_issues(base_url, project_id, private_token), error = function(e) NULL)
events_data <- tryCatch(get_gitlab_events(base_url, project_id, private_token), error = function(e) NULL)
# Combiner les résultats en un seul dataframe
return(bind_rows(commits_data, issues_data, events_data))
}
# Fonction pour traiter plusieurs projets avec lapply
get_data_from_multiple_projects <- function(base_url, project_ids, private_token) {
all_data <- lapply(project_ids, function(project_id) {
get_data_for_project(base_url, project_id, private_token)
})
# Combiner tous les dataframes en un seul
return(bind_rows(all_data))
}
# Define the query parameters pour récupérer les projets
params <- list(
include_subgroups = "true",
per_page = 100
)
# Fetch the projects avec pagination et retry
response <- GET(
"https://gitlab-forge.din.developpement-durable.gouv.fr/api/v4/groups/1013/projects",
add_headers(`PRIVATE-TOKEN` = Sys.getenv("GITLAB_COM_TOKEN")),
query = params,
timeout(120) # Timeout augmenté pour les projets
)
# Parse the JSON content
projects <- content(response, as = "text", encoding = "UTF-8") %>% fromJSON()
# Extract the project IDs
project_ids <- c(41600697, 19859695, 49118792, 21138017, 18439010, 44145525, 18441361, 17610613)
# Récupérer les données pour tous les projets
all_data_gitlab <- get_data_from_multiple_projects(base_url, project_ids, private_token)
all_data_gitlab <- rename(all_data_gitlab, "type" = 'data_type',"message" = 'discussion')
# Afficher un aperçu des données combinées
save.image("gitlab.RData")
# Charger les packages nécessaires
library(httr)
library(jsonlite)
library(dplyr)
library(DT)
library(stringr)
# Variables pour l'API GitLab -----
base_url <- "https://gitlab-forge.din.developpement-durable.gouv.fr"
private_token <- Sys.getenv("GITLAB_COM_TOKEN") # Récupération du token depuis Renviron
# Fonction pour gérer la pagination de l'API GitLab avec retry et timeout
get_all_pages <- function(url, private_token, max_retries = 3) {
# Fonction interne pour récupérer une page avec retry
get_page <- function(page) {
retries <- 0
success <- FALSE
while (!success && retries < max_retries) {
tryCatch({
# Faire la requête GET pour une page spécifique
response <- GET(
url,
query = list(page = page, per_page = 100),
add_headers("PRIVATE-TOKEN" = private_token),
timeout(120) # Timeout augmenté à 120 secondes
)
# Vérification du statut de la réponse
if (status_code(response) != 200) {
stop("La requête API a échoué avec le statut: ", status_code(response))
}
# Extraire les données de la réponse avec l'encodage UTF-8 pour éviter le message
data <- fromJSON(content(response, "text", encoding = "UTF-8"), flatten = TRUE)
success <- TRUE # Si la requête réussit, sortir de la boucle
return(data)
}, error = function(e) {
retries <- retries + 1
message("Erreur de connexion, tentative: ", retries, ". Détails: ", e$message)
Sys.sleep(2 * retries) # Attendre avant de réessayer
})
}
if (!success) {
stop("Echec de récupération des données après ", max_retries, " tentatives.")
}
}
# Initialiser la récupération des données avec la première page
first_page_data <- get_page(1)
# Vérifier s'il y a plusieurs pages en analysant l'en-tête "Link"
link_header <- headers(response)[["link"]]
if (!is.null(link_header) && str_detect(link_header, "rel=\"next\"")) {
# Trouver le nombre total de pages dans l'en-tête
num_pages <- max(str_extract_all(link_header, "page=\\d+")[[1]] %>% str_remove_all("page=") %>% as.integer())
# Utiliser lapply pour récupérer les pages suivantes
other_pages_data <- lapply(2:num_pages, get_page)
# Combiner toutes les pages de données
all_data <- bind_rows(first_page_data, bind_rows(other_pages_data))
} else {
# Si une seule page, renvoyer seulement les données de la première page
all_data <- first_page_data
}
return(all_data)
}
# Fonction pour extraire le nom du projet à partir de l'URL
extract_project_name <- function(web_url) {
# Utiliser une expression régulière pour capturer le dernier segment significatif avant "/-/"
str_extract(web_url, "(?<=/)[^/]+(?=/-/)")
}
# Fonction pour récupérer les commits d'un projet GitLab
get_gitlab_commits <- function(base_url, project_id, private_token) {
api_url <- paste0(base_url, "/api/v4/projects/", project_id, "/repository/commits")
# Récupérer toutes les pages avec pagination
data <- get_all_pages(api_url, private_token)
# Harmoniser les types de colonnes et sélectionner les colonnes pertinentes
data <- data %>%
mutate(
id = as.character(id),
project_name = extract_project_name(web_url),
data_type = "commit",
discussion = message,
updated_at = committed_date
)
return(data %>% select(project_name, data_type, discussion, updated_at))
}
# Fonction pour récupérer les issues d'un projet GitLab
get_gitlab_issues <- function(base_url, project_id, private_token) {
api_url <- paste0(base_url, "/api/v4/projects/", project_id, "/issues")
# Récupérer toutes les pages avec pagination
data <- get_all_pages(api_url, private_token)
# Harmoniser les types de colonnes et sélectionner les colonnes pertinentes
data <- data %>%
mutate(
id = as.character(id),
project_name = extract_project_name(web_url),
data_type = "issue",
discussion = title
)
return(data %>% select(project_name, data_type, discussion, updated_at))
}
# Fonction pour récupérer et filtrer les events d'un projet GitLab
get_gitlab_events <- function(base_url, project_id, private_token) {
api_url <- paste0(base_url, "/api/v4/projects/", project_id, "/events")
# Récupérer toutes les pages avec pagination
data <- get_all_pages(api_url, private_token)
# Garder seulement les événements où action_name est "commented on"
data <- data %>%
filter(action_name == "commented on") %>%
mutate(
id = as.character(id),
project_name = extract_project_name(web_url),
data_type = "event",
discussion = note.body,
updated_at = note.updated_at
)
return(data %>% select(project_name, data_type, discussion, updated_at))
}
# Fonction pour récupérer les données d'un projet
get_data_for_project <- function(base_url, project_id, private_token) {
commits_data <- tryCatch(get_gitlab_commits(base_url, project_id, private_token), error = function(e) NULL)
issues_data <- tryCatch(get_gitlab_issues(base_url, project_id, private_token), error = function(e) NULL)
events_data <- tryCatch(get_gitlab_events(base_url, project_id, private_token), error = function(e) NULL)
# Combiner les résultats en un seul dataframe
return(bind_rows(commits_data, issues_data, events_data))
}
# Fonction pour traiter plusieurs projets avec lapply
get_data_from_multiple_projects <- function(base_url, project_ids, private_token) {
all_data <- lapply(project_ids, function(project_id) {
get_data_for_project(base_url, project_id, private_token)
})
# Combiner tous les dataframes en un seul
return(bind_rows(all_data))
}
# Define the query parameters pour récupérer les projets
params <- list(
include_subgroups = "true",
per_page = 100
)
# Fetch the projects avec pagination et retry
response <- GET(
"https://gitlab-forge.din.developpement-durable.gouv.fr/api/v4/groups/1013/projects",
add_headers(`PRIVATE-TOKEN` = Sys.getenv("GITLAB_COM_TOKEN")),
query = params,
timeout(120) # Timeout augmenté pour les projets
)
# Parse the JSON content
projects <- content(response, as = "text", encoding = "UTF-8") %>% fromJSON()
# Extract the project IDs
project_ids <- projects$id
# Récupérer les données pour tous les projets
all_data_forge <- get_data_from_multiple_projects(base_url, project_ids, private_token)
all_data_forge <- rename(all_data_forge, "type" = 'data_type',"message" = 'discussion')
# Afficher un aperçu des données combinées
save.image("gitlab_forge.RData")
...@@ -17,9 +17,10 @@ library(jsonlite) ...@@ -17,9 +17,10 @@ library(jsonlite)
library(utils) library(utils)
library(lubridate) library(lubridate)
library(bizdays) library(bizdays)
# chargement des données (résultat du script "dev/script_chargement_rdata.R")
load("datamart_gitlabr.RData")
# chargement des données (résultat du script "dev/script_chargement_rdata.R")
load("github.RData")
load("gitlab_forge.RData")
load("gitlab.RData")
...@@ -83,14 +83,15 @@ server <- function(input, output) { ...@@ -83,14 +83,15 @@ server <- function(input, output) {
# utilisation du jeu de donnée data_chronol qui se trouve dans le global # utilisation du jeu de donnée data_chronol qui se trouve dans le global
filteredData <- reactive({ filteredData <- reactive({
shiny::req(input$daterange) req(input$daterange)
gitlab_chronol %>% all_data %>%
dplyr::filter(temps >= as.Date(input$daterange[[1]]) & temps <= as.Date(input$daterange[[2]])) filter(updated_at >= as.Date(input$daterange[[1]]) & updated_at <= as.Date(input$daterange[[2]]))
}) })
output$filteredPlot <- plotly::renderPlotly({ output$filteredPlot <- plotly::renderPlotly({
p <- ggplot2::ggplot(filteredData(), ggplot2::aes(x = temps, y = as.factor(name))) + p <- ggplot2::ggplot(filteredData(), ggplot2::aes(x = updated_at, y = as.factor(project_name))) +
ggplot2::geom_jitter(ggplot2::aes(color = type, text = paste(temps, info, sep = "\n")), ggplot2::geom_jitter(ggplot2::aes(color = type, text = paste(updated_at, message, sep = "\n")),
size = 3, alpha = 0.5, size = 3, alpha = 0.5,
height = 0, width = 0.75 height = 0, width = 0.75
) + ) +
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment