diff --git a/DESCRIPTION b/DESCRIPTION index 97c6778..e0e2168 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -18,7 +18,8 @@ Imports: stringi, jsonlite, processx, - dplyr + dplyr, + tibble, Language: fr Encoding: UTF-8 LazyData: true diff --git a/NAMESPACE b/NAMESPACE index e398f52..572d5ca 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -7,3 +7,4 @@ import(stringi) import(jsonlite) import(processx) import(dplyr) +import(tibble) diff --git a/R/client.R b/R/client.R index a3a9b21..e07f907 100644 --- a/R/client.R +++ b/R/client.R @@ -32,7 +32,6 @@ préparerNomFoncMessage <- function(nomFonction) { #' mais plutôt d'appeler `constellationR::avecClientEtServeur`, ou bien `constellationR::avecClient`, lesquels #' s'occuperont de la création et de la fermeture du client pour vous. #' -#' @field port Le numéro du port local sur lequel le serveur est ouvert, et auquel le client se connectera. #' #' @export Client <- R6Class( @@ -47,6 +46,9 @@ Client <- R6Class( ), public = list( + #' + #' @param port Le numéro du port local sur lequel le serveur est ouvert, et auquel le client se connectera. + #' initialize = function( port ) { @@ -132,7 +134,16 @@ Client <- R6Class( }, - action = function(fonction, paramètres = NULL) { + #' Fonction pour invoquer un action sur Constellation. + #' + #' @param fonction Le nom de la fonction à invoquer (p. ex., "variables.créerVariable") + #' @param paramètres Liste nommée avec les paramètres de la fonction + #' @param patience Le nombre de secondes qu'on va attendre pour une réponse + #' avant de perdre patience. + #' + #' @return Le résultat ded la fonction invoquée. + #' + action = function(fonction, paramètres = NULL, patience = 15) { nomFonction <- résoudreNomFonction(fonction) id <- uuid::UUIDgenerate() @@ -156,12 +167,29 @@ Client <- R6Class( private$envoyerMessage(messageAction) - retry::wait_until(isTRUE(résultatReçu), timeout = 30) + retry::wait_until(isTRUE(résultatReçu), timeout = patience) return(résultat) }, - suivre = function(fonction, paramètres = NULL, nomArgFonction='f', condition=function(x) !is.null(x)) { + #' Fonction pour invoquer un suivi sur Constellation. + #' + #' @param fonction Le nom de la fonction à invoquer (p. ex., "profil.suivreNoms") + #' @param paramètres Liste nommée avec les paramètres de la fonction + #' @param nomArgFonction Le nom du paramètre correspondant à la + #' fonction de suivi (voir documentation IPA Constellation). + #' "f" par défaut. + #' @param condition Condition nécessaire pour valider le premier résultat + #' à retourner. Uniquement utilisé si `paramètres[[nomArgFonction]]` n'existe pas. + #' @param patience Le nombre de secondes qu'on va attendre pour une réponse + #' avant de perdre patience. + #' + #' @return Si `paramètres[[nomArgFonction]]` existe, cette fonction sera invoqué de manière + #' continue chaque fois que les résultats changent, et la fonction + #' `suivre` elle-même retournera une fonction pour annuler le suivi. + #' Si `paramètres[[nomArgFonction]]` n'existe pas, retourne le premier résultat obtenu. + #' + suivre = function(fonction, paramètres = NULL, nomArgFonction='f', condition=function(x) !is.null(x), patience = 15) { nomFonction <- résoudreNomFonction(fonction) id <- uuid::UUIDgenerate() @@ -194,19 +222,35 @@ Client <- R6Class( ) private$envoyerMessage(messageSuivi) - retry::wait_until(!is.null(fOublier), timeout = 30) + retry::wait_until(!is.null(fOublier), timeout = patience) if (appelléAvecFonction) { return(fOublier) } else { - retry::wait_until(condition(résultatSuivi), timeout = 30) + retry::wait_until(condition(résultatSuivi), timeout = patience) fOublier() return(résultatSuivi) } }, - rechercher = function(fonction, paramètres, nomArgFonction = "f") { + #' Fonction pour invoquer une recherche sur Constellation. + #' + #' @param fonction Le nom de la fonction à invoquer (p. ex., "recherche.rechercherVariablesSelonNom") + #' @param paramètres Liste nommée avec les paramètres de la fonction + #' @param nomArgFonction Le nom du paramètre correspondant à la fonction + #' de suivi (voir documentation IPA Constellation). + #' "f" par défaut. + #' @param patience Le nombre de secondes qu'on va attendre pour une réponse + #' avant de perdre patience. + #' + #' @return Si `paramètres[[nomArgFonction]]` existe, cette fonction sera invoqué de manière + #' continue chaque fois que les résultats de la recherche changent, et la fonction + #' `recherche` elle-même retournera des fonctions pour annuler la recherche et pour + #' changer le nombre de résultats désirés. Si `paramètres[[nomArgFonction]]` n'existe + #' pas, retourne le premier résultat obtenu par la recherche. + #' + rechercher = function(fonction, paramètres, nomArgFonction = "f", patience = 15) { nomFonction <- résoudreNomFonction(fonction) id <- uuid::UUIDgenerate() @@ -239,43 +283,70 @@ Client <- R6Class( ) private$envoyerMessage(messageSuivi) - retry::wait_until(!is.null(retour), timeout = 30) + retry::wait_until(!is.null(retour), timeout = patience) if (appelléAvecFonction) { return(retour) } else { - retry::wait_until(!is.null(résultatRecherche), timeout = 30) + retry::wait_until(!is.null(résultatRecherche), timeout = patience) retour$fOublier() return(résultatRecherche) } }, - appeler = function(fonction, paramètres = NULL, nomArgFonction='f') { + #' Fonction pour invoquer une fonction (action, recherche, ou suivi) + #' de Constellation. + #' + #' @param fonction Le nom de la fonction à invoquer (p. ex., "bds.créerBd") + #' @param paramètres Liste nommée avec les paramètres de la fonction, si approprié + #' @param nomArgFonction S'il s'agit d'un fonction de suivi ou de recherche, le nom du paramètre + #' correspondant à la fonction de suivi (voir documentation IPA Constellation). + #' "f" par défaut. + #' @param patience Le nombre de secondes qu'on va attendre pour une réponse + #' avant de perdre patience. + #' + #' @return Le résultat de la fonction + #' + appeler = function(fonction, paramètres = NULL, nomArgFonction='f', patience = 45) { typeFonction <- constellationR::résoudreTypeFonction(fonction) if (typeFonction == "action") { return( - self$action(fonction=fonction, paramètres = paramètres) + self$action(fonction=fonction, paramètres = paramètres, patience = patience) ) } else if (typeFonction == "suivi") { return( self$suivre( - fonction=fonction, paramètres = paramètres, nomArgFonction = nomArgFonction + fonction=fonction, paramètres = paramètres, nomArgFonction = nomArgFonction, patience = patience ) ) } else if (typeFonction == "recherche") { return( self$rechercher( - fonction = fonction, paramètres = paramètres, nomArgFonction=nomArgFonction + fonction = fonction, paramètres = paramètres, nomArgFonction=nomArgFonction, patience = patience ) ) } }, + #' Méthode privée. Touche pas. + #' + #' @param id Identifiant unique + #' @param résoudre Fonction résolution + #' @param rejeter Fonction rejet + #' @param f Fonction de suivi + #' enregistrerÉcoute = function(id, résoudre, rejeter, f=NULL) { private$écouteurs[[id]] <- list(résoudre=résoudre, rejeter=rejeter, f=f) }, + #' Fonction rapide pour obtenir des données d'un tableau en format tibble + #' + #' @param idTableau L'identifiant du tableau + #' @param langues Liste optionnelle des langues (en ordre de préférence) dans lesquelles on veut obtenir les résultats + #' + #' @return Les données en format tibble::tibble + #' obtDonnéesTableau = function(idTableau, langues=NULL) { données <- self$suivre( "tableaux.suivreDonnéesExportation", @@ -286,6 +357,33 @@ Client <- R6Class( return(td) }, + #' Fonction rapide pour obtenir des données d'une nuée en format tibble + #' + #' @param idNuée L'identifiant de la nuée + #' @param clefTableau La clef du tableau d'intérêt + #' @param langues Liste optionnelle des langues (en ordre de préférence) dans lesquelles on veut obtenir les résultats + #' @param nRésultatsDésirés Le nombre de résultats désirés + #' + #' @return Les données en format tibble::tibble + #' + obtDonnéesTableauNuée = function( + idNuée, clefTableau, nRésultatsDésirés=100, langues=NULL + ) { + données <- self$suivre( + "nuées.suivreDonnéesExportationTableau", + paramètres = list( + idNuée=idNuée, + clefTableau=clefTableau, + nRésultatsDésirés=nRésultatsDésirés, + langues=langues + ) + ) + + return(donnéesNuéeÀTrame(données["données"])) + }, + + #' Fermer le client + #' fermer = function() { private$ws$close() } diff --git a/R/utils.R b/R/utils.R index 9a00d8d..b83f414 100644 --- a/R/utils.R +++ b/R/utils.R @@ -50,11 +50,16 @@ résoudreNomFonction <- function(nomFonction) { #' @return Une trame de données en format tibble R #' #' @examples -#' données <- jsonlite::fromJSON("{\"données\":[{\"a050decf-fc58-4283-8b85-0b791041aaa9\":123},{\"6a5dfef5-2e7e-46c2-bbe0-134cce21fd66\":\"abc\",\"a050decf-fc58-4283-8b85-0b791041aaa9\":456}]}", simplifyDataFrame = FALSE) +#' données <- jsonlite::fromJSON("{ +#' \"données\":[{ +#' \"col1\":123},{\"col2\":\"abc\",\"col1\":456} +#' ]}" +#' , simplifyDataFrame = FALSE +#' ) #' td <- donnéesTableauÀTrame(données["données"]) #' donnéesTableauÀTrame <- function(données) { - colonnes <- unique(unlist(sapply(données[[1]], function (x) names(x)))) + colonnes <- unique(unlist(as.vector(sapply(données[[1]], function (x) names(x))))) nRangées <- length(données[[1]]) trame_données <- data.frame(matrix(nrow=nRangées, ncol=length(colonnes))) @@ -62,6 +67,28 @@ donnéesTableauÀTrame <- function(données) { for (colonne in colonnes) { trame_données[[colonne]] <- sapply(données[[1]], function (x) if (is.null(x[[colonne]])) NA else x[[colonne]]) } - return(as_tibble(trame_données)) } + +#' Transforme des données de nuée de format Constellation en +#' format de trame de données tibble R. +#' +#' @param données Les données provenant de Constellation +#' +#' @return Une trame de données en format tibble R +#' +#' @examples +#' données <- jsonlite::fromJSON( +#' "{\"données\":[ +#' {\"col1\":123, +#' \"auteur\": \"/orbitdb/zdpuB1wjvzSEsY9YZ4Z2kUEX2DLzwV9G8LCQnzfLccHgY1LdH\"}, +#' {\"col2\":\"abc\",\"col1\":456, +#' \"auteur\": \"/orbitdb/zdpuB1wjvzSEsY9YZ4Z2kUEX2DLzwV9G8LCQnzfLccHgY1LdH\" +#' }]}", +#' simplifyDataFrame = FALSE +#' ) +#' td <- donnéesTableauÀTrame(données["données"]) +#' +donnéesNuéeÀTrame <- function(données) { + return(donnéesTableauÀTrame(données)) +} diff --git a/man/Client.Rd b/man/Client.Rd index 6293704..f6175b2 100644 --- a/man/Client.Rd +++ b/man/Client.Rd @@ -8,20 +8,6 @@ Cette classe se connecte à un serveur Constellation déjà ouvert. Nous vous re mais plutôt d'appeler `constellationR::avecClientEtServeur`, ou bien `constellationR::avecClient`, lesquels s'occuperont de la création et de la fermeture du client pour vous. } -\section{Public fields}{ -\if{html}{\out{
}} -\describe{ -\item{\code{port}}{Le numéro du port local sur lequel le serveur est ouvert, et auquel le client se connectera.} -} -\if{html}{\out{
}} -} -\section{Active bindings}{ -\if{html}{\out{
}} -\describe{ -\item{\code{port}}{Le numéro du port local sur lequel le serveur est ouvert, et auquel le client se connectera.} -} -\if{html}{\out{
}} -} \section{Methods}{ \subsection{Public methods}{ \itemize{ @@ -31,6 +17,8 @@ s'occuperont de la création et de la fermeture du client pour vous. \item \href{#method-ClientConstellation-rechercher}{\code{Client$rechercher()}} \item \href{#method-ClientConstellation-appeler}{\code{Client$appeler()}} \item \href{#method-ClientConstellation-enregistrerÉcoute}{\code{Client$enregistrerÉcoute()}} +\item \href{#method-ClientConstellation-obtDonnéesTableau}{\code{Client$obtDonnéesTableau()}} +\item \href{#method-ClientConstellation-obtDonnéesTableauNuée}{\code{Client$obtDonnéesTableauNuée()}} \item \href{#method-ClientConstellation-fermer}{\code{Client$fermer()}} \item \href{#method-ClientConstellation-clone}{\code{Client$clone()}} } @@ -43,42 +31,153 @@ s'occuperont de la création et de la fermeture du client pour vous. \if{html}{\out{
}}\preformatted{Client$new(port)}\if{html}{\out{
}} } +\subsection{Arguments}{ +\if{html}{\out{
}} +\describe{ +\item{\code{port}}{Le numéro du port local sur lequel le serveur est ouvert, et auquel le client se connectera. + +Fonction pour invoquer un action sur Constellation.} +} +\if{html}{\out{
}} +} } \if{html}{\out{
}} \if{html}{\out{}} \if{latex}{\out{\hypertarget{method-ClientConstellation-action}{}}} \subsection{Method \code{action()}}{ \subsection{Usage}{ -\if{html}{\out{
}}\preformatted{Client$action(fonction, paramètres = NULL)}\if{html}{\out{
}} +\if{html}{\out{
}}\preformatted{Client$action(fonction, paramètres = NULL, patience = 15)}\if{html}{\out{
}} +} + +\subsection{Arguments}{ +\if{html}{\out{
}} +\describe{ +\item{\code{fonction}}{Le nom de la fonction à invoquer (p. ex., "variables.créerVariable")} + +\item{\code{paramètres}}{Liste nommée avec les paramètres de la fonction} + +\item{\code{patience}}{Le nombre de secondes qu'on va attendre pour une réponse +avant de perdre patience.} } +\if{html}{\out{
}} +} +\subsection{Returns}{ +Le résultat ded la fonction invoquée. +Fonction pour invoquer un suivi sur Constellation. +} } \if{html}{\out{
}} \if{html}{\out{}} \if{latex}{\out{\hypertarget{method-ClientConstellation-suivre}{}}} \subsection{Method \code{suivre()}}{ \subsection{Usage}{ -\if{html}{\out{
}}\preformatted{Client$suivre(fonction, paramètres = NULL, nomArgFonction = "f")}\if{html}{\out{
}} +\if{html}{\out{
}}\preformatted{Client$suivre( + fonction, + paramètres = NULL, + nomArgFonction = "f", + condition = function(x) !is.null(x), + patience = 15 +)}\if{html}{\out{
}} } +\subsection{Arguments}{ +\if{html}{\out{
}} +\describe{ +\item{\code{fonction}}{Le nom de la fonction à invoquer (p. ex., "profil.suivreNoms")} + +\item{\code{paramètres}}{Liste nommée avec les paramètres de la fonction} + +\item{\code{nomArgFonction}}{Le nom du paramètre correspondant à la +fonction de suivi (voir documentation IPA Constellation). +"f" par défaut.} + +\item{\code{condition}}{Condition nécessaire pour valider le premier résultat +à retourner. Uniquement utilisé si `paramètres[[nomArgFonction]]` n'existe pas.} + +\item{\code{patience}}{Le nombre de secondes qu'on va attendre pour une réponse +avant de perdre patience.} +} +\if{html}{\out{
}} +} +\subsection{Returns}{ +Si `paramètres[[nomArgFonction]]` existe, cette fonction sera invoqué de manière +continue chaque fois que les résultats changent, et la fonction +`suivre` elle-même retournera une fonction pour annuler le suivi. +Si `paramètres[[nomArgFonction]]` n'existe pas, retourne le premier résultat obtenu. + +Fonction pour invoquer une recherche sur Constellation. +} } \if{html}{\out{
}} \if{html}{\out{}} \if{latex}{\out{\hypertarget{method-ClientConstellation-rechercher}{}}} \subsection{Method \code{rechercher()}}{ \subsection{Usage}{ -\if{html}{\out{
}}\preformatted{Client$rechercher(fonction, paramètres, nomArgFonction = "f")}\if{html}{\out{
}} +\if{html}{\out{
}}\preformatted{Client$rechercher(fonction, paramètres, nomArgFonction = "f", patience = 15)}\if{html}{\out{
}} } +\subsection{Arguments}{ +\if{html}{\out{
}} +\describe{ +\item{\code{fonction}}{Le nom de la fonction à invoquer (p. ex., "recherche.rechercherVariablesSelonNom")} + +\item{\code{paramètres}}{Liste nommée avec les paramètres de la fonction} + +\item{\code{nomArgFonction}}{Le nom du paramètre correspondant à la fonction +de suivi (voir documentation IPA Constellation). +"f" par défaut.} + +\item{\code{patience}}{Le nombre de secondes qu'on va attendre pour une réponse +avant de perdre patience.} +} +\if{html}{\out{
}} +} +\subsection{Returns}{ +Si `paramètres[[nomArgFonction]]` existe, cette fonction sera invoqué de manière +continue chaque fois que les résultats de la recherche changent, et la fonction +`recherche` elle-même retournera des fonctions pour annuler la recherche et pour +changer le nombre de résultats désirés. Si `paramètres[[nomArgFonction]]` n'existe +pas, retourne le premier résultat obtenu par la recherche. + +Fonction pour invoquer une fonction (action, recherche, ou suivi) +de Constellation. +} } \if{html}{\out{
}} \if{html}{\out{}} \if{latex}{\out{\hypertarget{method-ClientConstellation-appeler}{}}} \subsection{Method \code{appeler()}}{ \subsection{Usage}{ -\if{html}{\out{
}}\preformatted{Client$appeler(fonction, paramètres = NULL, nomArgFonction = "f")}\if{html}{\out{
}} +\if{html}{\out{
}}\preformatted{Client$appeler( + fonction, + paramètres = NULL, + nomArgFonction = "f", + patience = 45 +)}\if{html}{\out{
}} } +\subsection{Arguments}{ +\if{html}{\out{
}} +\describe{ +\item{\code{fonction}}{Le nom de la fonction à invoquer (p. ex., "bds.créerBd")} + +\item{\code{paramètres}}{Liste nommée avec les paramètres de la fonction, si approprié} + +\item{\code{nomArgFonction}}{S'il s'agit d'un fonction de suivi ou de recherche, le nom du paramètre +correspondant à la fonction de suivi (voir documentation IPA Constellation). +"f" par défaut.} + +\item{\code{patience}}{Le nombre de secondes qu'on va attendre pour une réponse +avant de perdre patience.} +} +\if{html}{\out{
}} +} +\subsection{Returns}{ +Le résultat de la fonction + +Méthode privée. Touche pas. +} } \if{html}{\out{
}} \if{html}{\out{}} @@ -88,6 +187,76 @@ s'occuperont de la création et de la fermeture du client pour vous. \if{html}{\out{
}}\preformatted{Client$enregistrerÉcoute(id, résoudre, rejeter, f = NULL)}\if{html}{\out{
}} } +\subsection{Arguments}{ +\if{html}{\out{
}} +\describe{ +\item{\code{id}}{Identifiant unique} + +\item{\code{résoudre}}{Fonction résolution} + +\item{\code{rejeter}}{Fonction rejet} + +\item{\code{f}}{Fonction de suivi + +Fonction rapide pour obtenir des données d'un tableau en format tibble} +} +\if{html}{\out{
}} +} +} +\if{html}{\out{
}} +\if{html}{\out{}} +\if{latex}{\out{\hypertarget{method-ClientConstellation-obtDonnéesTableau}{}}} +\subsection{Method \code{obtDonnéesTableau()}}{ +\subsection{Usage}{ +\if{html}{\out{
}}\preformatted{Client$obtDonnéesTableau(idTableau, langues = NULL)}\if{html}{\out{
}} +} + +\subsection{Arguments}{ +\if{html}{\out{
}} +\describe{ +\item{\code{idTableau}}{L'identifiant du tableau} + +\item{\code{langues}}{Liste optionnelle des langues (en ordre de préférence) dans lesquelles on veut obtenir les résultats} +} +\if{html}{\out{
}} +} +\subsection{Returns}{ +Les données en format tibble::tibble + +Fonction rapide pour obtenir des données d'une nuée en format tibble +} +} +\if{html}{\out{
}} +\if{html}{\out{}} +\if{latex}{\out{\hypertarget{method-ClientConstellation-obtDonnéesTableauNuée}{}}} +\subsection{Method \code{obtDonnéesTableauNuée()}}{ +\subsection{Usage}{ +\if{html}{\out{
}}\preformatted{Client$obtDonnéesTableauNuée( + idNuée, + clefTableau, + nRésultatsDésirés = 100, + langues = NULL +)}\if{html}{\out{
}} +} + +\subsection{Arguments}{ +\if{html}{\out{
}} +\describe{ +\item{\code{idNuée}}{L'identifiant de la nuée} + +\item{\code{clefTableau}}{La clef du tableau d'intérêt} + +\item{\code{nRésultatsDésirés}}{Le nombre de résultats désirés} + +\item{\code{langues}}{Liste optionnelle des langues (en ordre de préférence) dans lesquelles on veut obtenir les résultats} +} +\if{html}{\out{
}} +} +\subsection{Returns}{ +Les données en format tibble::tibble + +Fermer le client +} } \if{html}{\out{
}} \if{html}{\out{}} diff --git a/man/donn-esNu-e-Trame.Rd b/man/donn-esNu-e-Trame.Rd new file mode 100644 index 0000000..6e1b10e --- /dev/null +++ b/man/donn-esNu-e-Trame.Rd @@ -0,0 +1,32 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils.R +\name{donnéesNuéeÀTrame} +\alias{donnéesNuéeÀTrame} +\title{Transforme des données de nuée de format Constellation en +format de trame de données tibble R.} +\usage{ +donnéesNuéeÀTrame(données) +} +\arguments{ +\item{données}{Les données provenant de Constellation} +} +\value{ +Une trame de données en format tibble R +} +\description{ +Transforme des données de nuée de format Constellation en +format de trame de données tibble R. +} +\examples{ +données <- jsonlite::fromJSON( + "{\"données\":[ + {\"col1\":123, + \"auteur\": \"/orbitdb/zdpuB1wjvzSEsY9YZ4Z2kUEX2DLzwV9G8LCQnzfLccHgY1LdH\"}, + {\"col2\":\"abc\",\"col1\":456, + \"auteur\": \"/orbitdb/zdpuB1wjvzSEsY9YZ4Z2kUEX2DLzwV9G8LCQnzfLccHgY1LdH\" + }]}", + simplifyDataFrame = FALSE + ) +td <- donnéesTableauÀTrame(données["données"]) + +} diff --git a/man/donn-esTableau-Trame.Rd b/man/donn-esTableau-Trame.Rd new file mode 100644 index 0000000..d244d9c --- /dev/null +++ b/man/donn-esTableau-Trame.Rd @@ -0,0 +1,29 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils.R +\name{donnéesTableauÀTrame} +\alias{donnéesTableauÀTrame} +\title{Transforme des données de tableau de format Constellation en +format de trame de données tibble R.} +\usage{ +donnéesTableauÀTrame(données) +} +\arguments{ +\item{données}{Les données provenant de Constellation} +} +\value{ +Une trame de données en format tibble R +} +\description{ +Transforme des données de tableau de format Constellation en +format de trame de données tibble R. +} +\examples{ +données <- jsonlite::fromJSON("{ + \"données\":[{ + \"col1\":123},{\"col2\":\"abc\",\"col1\":456} + ]}" + , simplifyDataFrame = FALSE + ) +td <- donnéesTableauÀTrame(données["données"]) + +} diff --git a/tests/testthat/test-client.R b/tests/testthat/test-client.R index 7a6688b..5ea17db 100644 --- a/tests/testthat/test-client.R +++ b/tests/testthat/test-client.R @@ -162,7 +162,6 @@ avecClientEtServeurTest( vals2 <- list() vals2[[idCol]] <- 456 vals2[[idColC]] <- "abc" - print(list(vals1, vals2)) client$appeler( "tableaux.ajouterÉlément", @@ -177,9 +176,52 @@ avecClientEtServeurTest( testthat::expect_equal(donnéesTableau, référence) }) +}) +avecClientEtServeurTest( + function (client) { testthat::test_that("Obtenir données nuée", { + clefTableau <- "clef" + + idNuée <- client$appeler("nuées.créerNuée") + idVariable <- client$appeler("variables.créerVariable", list(catégorie="numérique")) + idTableau <- client$appeler("nuées.ajouterTableauNuée", list( + idNuée=idNuée, + clefTableau=clefTableau + )) + idCol <- client$appeler('nuées.ajouterColonneTableauNuée', list( + idTableau=idTableau, + idVariable=idVariable + )) + schéma <- client$appeler("nuées.générerSchémaBdNuée", list( + idNuée=idNuée, licence="ODbl-1_0" + ), patience = 60) + + vals1 <- list() + vals1[[idCol]] <- 123 + vals2 <- list() + vals2[[idCol]] <- 456 + client$appeler("bds.ajouterÉlémentÀTableauUnique", list( + schémaBd=schéma, + idNuéeUnique=idNuée, + clefTableau=clefTableau, + vals=list(vals1, vals2) + )) + + données <- client$obtDonnéesTableauNuée( + idNuée=idNuée, clefTableau=clefTableau, + nRésultatsDésirés=100 + ) + + idCompte <- client$appeler("obtIdCompte") + + référence <- tibble::tibble(colNumérique=c(123, 456), auteur=c(idCompte, idCompte)) + names(référence)[names(référence) == "colNumérique"] <- idCol + + testthat::expect_equal( + données, référence + ) }) } ) diff --git a/tests/testthat/test-utils.R b/tests/testthat/test-utils.R index b22949d..d62401d 100644 --- a/tests/testthat/test-utils.R +++ b/tests/testthat/test-utils.R @@ -21,11 +21,49 @@ testthat::test_that("Auto-détection type recherche", { testthat::expect_equal(résolu, "recherche") }) -testthat::test_that("Conversion données tableau", { +testthat::test_that("Conversion données tableau - une valeur vide", { données <- jsonlite::fromJSON( "{\"données\":[{\"col1\":123},{\"col2\":\"abc\",\"col1\":456}]}", simplifyDataFrame = FALSE ) td <- donnéesTableauÀTrame(données["données"]) - testthat::expect_equal(td, tibble(col1=c(123, 456), col2=c(NA, "abc"))) + testthat::expect_equal(td, tibble::tibble(col1=c(123, 456), col2=c(NA, "abc"))) +}) + +testthat::test_that("Conversion données tableau - données vides", { + données <- jsonlite::fromJSON( + "{\"données\":[]}", + simplifyDataFrame = FALSE + ) + td <- donnéesTableauÀTrame(données["données"]) + testthat::expect_equal(td, tibble::tibble()) +}) + +testthat::test_that("Conversion données nuées - toutes valeurs présentes", { + auteur <- "/orbitdb/zdpuB1wjvzSEsY9YZ4Z2kUEX2DLzwV9G8LCQnzfLccHgY1LdH" + données <- jsonlite::fromJSON( + "{\"données\":[{\"col1\":123,\"auteur\":\"/orbitdb/zdpuB1wjvzSEsY9YZ4Z2kUEX2DLzwV9G8LCQnzfLccHgY1LdH\"},{\"col1\":456,\"auteur\":\"/orbitdb/zdpuB1wjvzSEsY9YZ4Z2kUEX2DLzwV9G8LCQnzfLccHgY1LdH\"}]}", + simplifyDataFrame = FALSE + ) + td <- donnéesTableauÀTrame(données["données"]) + testthat::expect_equal(td, tibble(col1=c(123, 456), auteur=c(auteur, auteur))) +}) + +testthat::test_that("Conversion données nuées - une valeur vide", { + auteur <- "/orbitdb/zdpuB1wjvzSEsY9YZ4Z2kUEX2DLzwV9G8LCQnzfLccHgY1LdH" + données <- jsonlite::fromJSON( + "{\"données\":[{\"col1\":123,\"auteur\":\"/orbitdb/zdpuB1wjvzSEsY9YZ4Z2kUEX2DLzwV9G8LCQnzfLccHgY1LdH\"},{\"col1\":456,\"col2\":\"abc\",\"auteur\":\"/orbitdb/zdpuB1wjvzSEsY9YZ4Z2kUEX2DLzwV9G8LCQnzfLccHgY1LdH\"}]}", + simplifyDataFrame = FALSE + ) + td <- donnéesTableauÀTrame(données["données"]) + testthat::expect_equal(td, tibble::tibble(col1=c(123, 456), auteur=c(auteur, auteur), col2=c(NA, "abc"))) +}) + +testthat::test_that("Conversion données nuée - données vides", { + données <- jsonlite::fromJSON( + "{\"données\":[]}", + simplifyDataFrame = FALSE + ) + td <- donnéesTableauÀTrame(données["données"]) + testthat::expect_equal(td, tibble::tibble()) })