diff --git a/DESCRIPTION b/DESCRIPTION index ebd77f1..2061c44 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: doremifasol Title: Data on Insee Website -Version: 0.5.5.9001 +Version: 0.5.6.0001 Authors@R: c( person("Pierre", "Lamarche", email = "pierre.lamarche@insee.fr", role = c("aut", "cre")), person("Pierre-Yves", "Berrard", role = "aut", email = "pierre-yves.berrard@insee.fr"), diff --git a/R/chargerDonnees.R b/R/chargerDonnees.R index 9399331..0df6ead 100644 --- a/R/chargerDonnees.R +++ b/R/chargerDonnees.R @@ -85,11 +85,16 @@ chargerDonnees <- function(telechargementFichier, vars = NULL, ...) { res <- as.data.frame(do.call(rbind, res_int)) } } else if (telechargementFichier$type == "xlsx") { - if (!is.null(telechargementFichier$argsImport$sheet)) { - res <- as.data.frame(do.call(readxl::read_xlsx, telechargementFichier$argsImport)) - } else { + if (!is.null(telechargementFichier$argsImport$sheet) && telechargementFichier$argsImport$sheet != "__MELODI__") { + res <- as.data.frame(do.call(readxl::read_xlsx, telechargementFichier$argsImport)) + } else { onglets <- readxl::excel_sheets(telechargementFichier$argsImport$path) - res_int <- lapply(intersect(onglets, toupper(onglets)), function(x) { + if (!is.null(telechargementFichier$argsImport$sheet) && telechargementFichier$argsImport$sheet == "__MELODI__"){ + onglets <- onglets[!onglets %in% c("M\u00e9tadonn\u00e9es", "Documentation")] + } else { + onglet <- intersect(onglets, toupper(onglets)) + } + res_int <- lapply(onglets, function(x) { telechargementFichier$argsImport[["sheet"]] <- x table <- do.call(readxl::read_xlsx, c(telechargementFichier$argsImport, ...)) table$onglet <- x @@ -97,9 +102,9 @@ chargerDonnees <- function(telechargementFichier, vars = NULL, ...) { }) #res <- as.data.frame(do.call(rbind, res_int)) res <- res_int - names(res) <- intersect(onglets, toupper(onglets)) + names(res) <- onglets } - } else if (telechargementFichier$type == "json") { + } else if (telechargementFichier$type == "json") { if (!is.null(vars)) warning("Il n'est pas possible de filtrer les variables charg\u00e9es en m\u00e9moire sur le format JSON pour le moment.") res <- do.call(chargerDonneesJson, telechargementFichier$argsImport) diff --git a/R/millesimesDisponibles.R b/R/millesimesDisponibles.R index 16fa604..78018c2 100644 --- a/R/millesimesDisponibles.R +++ b/R/millesimesDisponibles.R @@ -10,7 +10,7 @@ millesimesDisponibles <- function(donnees) { ## check the parameter donnees takes a valid value donnees <- toupper(donnees) - liste_nom <- unlist(lapply(ld, function(x) return(x$nom))) + liste_nom <- toupper(unlist(lapply(ld, function(x) return(x$nom)))) if (!donnees %in% liste_nom) stop("Le param\u00e8tre donnees est mal sp\u00e9cifi\u00e9, la valeur n'est pas r\u00e9f\u00e9renc\u00e9e") liste_possible <- ld[which(liste_nom == donnees)] diff --git a/R/telechargerFichier.R b/R/telechargerFichier.R index 961e29e..5df7d0b 100644 --- a/R/telechargerFichier.R +++ b/R/telechargerFichier.R @@ -23,7 +23,7 @@ telechargerFichier <- function(donnees, date=NULL, telDir=getOption("doremifasol ## vérifie donnees et date. si ok les infos nécessaires sont extraites dans caract caract <- infosDonnees(donnees, date) - + ## test de la connexion if (!curl::has_internet()) stop("aucune connexion Internet") @@ -39,7 +39,19 @@ telechargerFichier <- function(donnees, date=NULL, telDir=getOption("doremifasol ## télécharge les fichiers csv, xls, xlsx... if (!caract$api_rest) { - nomFichier <- file.path(telDir, basename(caract$lien)) + if (caract$zip){ + if (grepl(".*\\.zip", basename(caract$lien))){ + nomFichier <- file.path(telDir, basename(caract$lien)) + } else { + nomFichier <- file.path(telDir, paste0(caract$nom, ".zip")) + } + } else { + if (grepl(paste0(".*\\.", caract$type), basename(caract$lien))){ + nomFichier <- file.path(telDir, basename(caract$lien)) + } else { + nomFichier <- file.path(telDir, paste0(caract$nom, ".", caract$type)) + } + } dl <- NULL if (!file.exists(nomFichier) || force) { diff --git a/R/utile.R b/R/utile.R index 42a2041..67dc5c0 100644 --- a/R/utile.R +++ b/R/utile.R @@ -21,7 +21,7 @@ infosDonnees <- function(donnees, date = NULL, silencieux = FALSE) { donnees <- toupper(donnees) # pour rendre insensible à la casse - liste_nom <- vapply(ld, `[[`, "nom", FUN.VALUE = character(1)) + liste_nom <- toupper(vapply(ld, `[[`, "nom", FUN.VALUE = character(1))) res <- ld[liste_nom == donnees] # 1 - identifiant introuvable diff --git a/R/zzz.R b/R/zzz.R index 0e59dd2..664efa9 100644 --- a/R/zzz.R +++ b/R/zzz.R @@ -1,3 +1,20 @@ .onLoad <- function(libname, pkgname) { #data(liste_donnees) + if (curl::has_internet()) { + requete_melodi <- httr::GET("https://minio.lab.sspcloud.fr/pierrelamarche/melodi/liste_donnees.json") + ld_melodi <- jsonlite::fromJSON(httr::content(requete_melodi, as = "text", encoding = "utf-8"), + simplifyDataFrame = FALSE) + ld_melodi <- lapply(ld_melodi, function(x) { + within(x, { + if (!is.null(x$date_ref)) + date_ref <- as.Date(date_ref, format = "%Y-%m-%d") + if(!is.null(x$separateur)) + separateur <- paste0("quote(\"", separateur, "\")") + }) + } + ) + assign("ld", c(ld, ld_melodi), + envir = asNamespace("doremifasol") + ) + } } \ No newline at end of file diff --git a/README.md b/README.md index ccbf164..76574f8 100644 --- a/README.md +++ b/README.md @@ -13,13 +13,17 @@ ## Français +## 🚀 Nouvelle fonctionnalité + +Le catalogue de données intègre désormais les données mises à disposition dans [l'API Melodi](https://portail-api.insee.fr/catalog/all). Outre la [liste de données] disponible dans le _package_, les données listées dans le catalogue de Melodi sont intégrées _via_ [ce fichier](https://minio.lab.sspcloud.fr/) qui est mis quotidiennement à jour. + ### De quoi s'agit-il ? Le _package_ `doremifasol` (_Données en R Mises à disposition par l’Insee et Facilement Sollicitables_) permet d'importer facilement dans R des données mises à disposition sur le site de l'Insee. Il offre deux fonctionnalités principales : -* télécharger et importer dans R des fichiers disponibles sur insee.fr (Base Permanente des Équipements, Recensement de Population, Filosofi...) ; +* télécharger et importer dans R des fichiers disponibles sur insee.fr (Base Permanente des Équipements, Recensement de Population, Filosofi...), **y compris les données mises à disposition _via_ Melodi** ; * requêter l'[API](https://api.insee.fr/catalogue) Sirene et recupérer les résultats dans R. L'objectif du _package_ est de rendre transparentes les différentes tâches à réaliser avant de pouvoir traiter les données : recherche sur le site, téléchargement, décompression, import dans R... @@ -91,6 +95,10 @@ Agent du Service Statistique Public, ou utilisateur des données mises à dispos ## English +## 🚀 New Feature + +The data catalog now includes data made available in the [Melodi API](https://portail-api.insee.fr/catalog/all). In addition to the [list of data] available in the package, the data listed in the Melodi catalog is integrated via [this file](https://minio.lab.sspcloud.fr/) which is updated on a daily basis. + ### What is it about? `doremifasol` (data with R made available by Insee and easily retrievable in French) is a R package mainly aiming at showing off data available on Insee's website (Insee, for the French Institute for Statistics and Economic Studies), helping the user to put them on stage and extract the information they carry. So it is about analysing data, creating maps, quantifying phenomenons and in general using the data without the painful effort to retrieve them on the website, as well as import them into R's memory. The name of the _package_ stands for the five first notes of music, and pushing the metaphore, underlines its aim at helping the users to easily pratice their _solfège_ in R. diff --git a/tests/testthat/test_liste_donnees.R b/tests/testthat/test_liste_donnees.R index 28ec8c1..cb4948d 100644 --- a/tests/testthat/test_liste_donnees.R +++ b/tests/testthat/test_liste_donnees.R @@ -23,9 +23,10 @@ test_that("pas de valeurs incongrues", { # lien (motif, pas existence) url_pattern <- "^https://www.insee.fr/fr/statistiques/fichier/\\d{5,}/.+\\.(zip|xls|xlsx|parquet)$" - api_url_pattern <- "^https://api.insee.fr/entreprises/sirene(/V3.11)?/sire[nt](/(liensSuccession|nonDiffusibles))?$" + api_sirene_url_pattern <- "^https://api.insee.fr/entreprises/sirene(/V3.11)?/sire[nt](/(liensSuccession|nonDiffusibles))?$" + api_melodi_url_pattern <- "^https://api.insee.fr/melodi/.*$" expect_true( - all(grepl(paste0(url_pattern, "|", api_url_pattern), df_ld$lien)) + all(grepl(paste0(url_pattern, "|", api_sirene_url_pattern, "|", api_melodi_url_pattern), df_ld$lien)) ) # type @@ -43,7 +44,7 @@ test_that("pas de valeurs incongrues", { # big_zip expect_true( - all(df_ld$big_zip[df_ld$zip] %in% c(TRUE, FALSE)) + with(df_ld, all(big_zip[zip] %in% c(TRUE, FALSE))) ) # premiere_ligne / derniere_ligne @@ -64,3 +65,4 @@ test_that("pas de valeurs incongrues", { ) }) + diff --git a/tests/testthat/test_telechargerDonnees.R b/tests/testthat/test_telechargerDonnees.R index 9e69e1f..b77fb4c 100644 --- a/tests/testthat/test_telechargerDonnees.R +++ b/tests/testthat/test_telechargerDonnees.R @@ -115,7 +115,7 @@ test_that("Télécharger des données sur l'API pour les entreprises créées un skip_if_no_app() check_configuration() expect_s3_class(telechargerDonnees("SIRENE_SIRET_LIENS", argsApi = list(q = "siretEtablissementPredecesseur:32957439600019")), - "try-error") + "try-error") }) ## test dl sur l'API Sirene avec une requête sur les unités non diffusibles test_that("Télécharger des données sur l'API pour les unités non diffusibles", { @@ -130,5 +130,20 @@ test_that("Erreur de syntaxe dans la requête sur l'API Sirene", { check_configuration() expect_s3_class(telechargerDonnees("SIRENE_SIREN_NONDIFF", argsApi = list(q = 'dateDernierTraitementUniteLegale:"2018-11-01" TO "2018-11-15"')), - "try-error") + "try-error") +}) +## test dl de données sur mélodi - csv brut +test_that("Télécharger le csv sur l'API melodi", { + expect_s3_class(telechargerDonnees("DS_BPE"), + c("insee_data_frame", "data.frame")) +}) +## test dl de données sur mélodi - csv zippé +test_that("Télécharger un produit csv zippé sur melodi", { + expect_s3_class(telechargerDonnees("DS_ANTIPOL_CSV_FR"), + c("insee_data_frame", "data.frame")) +}) +## test dl de données sur mélodi - XLSX +test_that("Télécharger un produit xlsx zippé sur melodi", { + expect_type(telechargerDonnees("ANTIPOL_GLOBAL_T0_FR"), + "list") })