Skip to content

Commit

Permalink
Tests nuée passent
Browse files Browse the repository at this point in the history
  • Loading branch information
julienmalard committed Nov 23, 2023
1 parent 740d9d3 commit 50d198c
Show file tree
Hide file tree
Showing 9 changed files with 475 additions and 38 deletions.
3 changes: 2 additions & 1 deletion DESCRIPTION
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@ Imports:
stringi,
jsonlite,
processx,
dplyr
dplyr,
tibble,
Language: fr
Encoding: UTF-8
LazyData: true
Expand Down
1 change: 1 addition & 0 deletions NAMESPACE
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,4 @@ import(stringi)
import(jsonlite)
import(processx)
import(dplyr)
import(tibble)
124 changes: 111 additions & 13 deletions R/client.R
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand All @@ -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
) {
Expand Down Expand Up @@ -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()
Expand All @@ -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()

Expand Down Expand Up @@ -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()

Expand Down Expand Up @@ -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",
Expand All @@ -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()
}
Expand Down
33 changes: 30 additions & 3 deletions R/utils.R
Original file line number Diff line number Diff line change
Expand Up @@ -50,18 +50,45 @@ 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)))
colnames(trame_données) <- colonnes
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))
}
Loading

0 comments on commit 50d198c

Please sign in to comment.