1 getAPIDocument <- function(){
2 url <- "https://4xphq.arvadosapi.com/discovery/v1/apis/arvados/v1/rest"
3 serverResponse <- httr::RETRY("GET", url = url)
5 httr::content(serverResponse, as = "parsed", type = "application/json")
9 generateAPI <- function()
11 JSONDocument <- getAPIDocument()
13 generateArvadosClasses(JSONDocument)
14 generateArvadosAPIClass(JSONDocument)
17 generateArvadosAPIClass <- function(discoveryDocument)
19 classMetadata <- discoveryDocument$schemas
20 functionResources <- discoveryDocument$resources
21 resourceNames <- names(functionResources)
23 arvadosAPIHeader <- generateAPIClassHeader()
24 arvadosAPIFooter <- generateAPIClassFooter()
26 arvadosMethods <- Map(function(resource, resourceName)
28 methodNames <- names(resource$methods)
30 functions <- Map(function(methodMetadata, methodName)
32 methodName <- paste0(resourceName, ".", methodName)
33 createFunction(methodName, methodMetadata, classMetadata)
35 }, resource$methods, methodNames)
37 unlist(unname(functions))
39 }, functionResources, resourceNames)
41 arvadosClass <- c(arvadosAPIHeader, arvadosMethods, arvadosAPIFooter)
43 #TODO: To file or load in memory?
44 fileConn <- file("ArvadosAPI.R", "w")
45 writeLines(unlist(arvadosClass), fileConn)
50 getFunctionName <- function(functionMetaData)
52 stringr::str_replace(functionMetaData$id, "arvados.", "")
55 getFunctionArguments <- function(functionMetaData)
57 argNames <- names(functionMetaData$parameters)
58 args <- sapply(argNames, function(argName)
60 arg <- functionMetaData$parameters[[argName]]
64 if(!is.null(arg$default))
65 return(paste0(argName, " = ", "\"", arg$default, "\""))
67 return(paste(argName, "=", "NULL"))
73 paste0(args, collapse = ", ")
76 getFunctionBody <- function(functionMetaData, classMetadata)
78 url <- getRequestURL(functionMetaData)
79 headers <- getRequestHeaders()
80 requestQueryList <- getRequestQueryList(functionMetaData)
81 request <- getRequest()
82 response <- getResponse(functionMetaData)
83 returnObject <- getReturnObject(functionMetaData, classMetadata)
85 body <- c(url, headers, requestQueryList, request, response, returnObject)
86 paste0("\t\t\t", body)
89 getRequestHeaders <- function()
91 "headers <- list(Authorization = paste(\"OAuth2\", private$token))"
94 getReturnObject <- function(functionMetaData, classMetadata)
96 returnClass <- functionMetaData$response[["$ref"]]
97 classArguments <- getReturnClassArguments(returnClass, classMetadata)
99 c(paste0(returnClass, "$new(", classArguments, ")"))
102 getReturnClassArguments <- function(className, classMetadata)
104 classArguments <- unique(names(classMetadata[[className]]$properties))
106 arguments <- sapply(classArguments, function(arg)
108 paste0(arg, " = resource$", arg)
111 paste0(arguments, collapse = ", ")
114 getRequest <- function()
116 "response <- private$http$exec(\"GET\", url, headers, NULL, queryArgs)"
119 getResponse <- function(functionMetaData)
121 "resource <- private$httpParser$parseJSONResponse(response)"
124 getRequestURL <- function(functionMetaData)
126 endPoint <- functionMetaData$path
127 endPoint <- stringr::str_replace_all(endPoint, "\\{", "${")
128 url <- c(paste0("endPoint <- stringr::str_interp(\"", endPoint, "\")"),
129 paste0("url <- paste0(private$host, endPoint)"))
133 getRequestQueryList <- function(functionMetaData)
135 argNames <- names(functionMetaData$parameters)
137 if(length(argNames) == 0)
138 return("queryArgs <- NULL")
140 queryListContent <- sapply(argNames, function(arg) paste0(arg, " = ", arg))
142 paste0("queryArgs <- list(", paste0(queryListContent, collapse = ', ') , ")")
145 createFunction <- function(functionName, functionMetaData, classMetadata)
148 args <- getFunctionArguments(functionMetaData)
149 body <- getFunctionBody(functionMetaData, classMetadata)
151 functionString <- c(paste0("\t\t", name, " = function(", args, ")"),
159 generateAPIClassHeader <- function()
162 "ArvadosAPI <- R6::R6Class(",
168 "\t\tinitialize = function(authToken = NULL, hostName = NULL, numRetries = 0)",
170 "\t\t\tif(!is.null(hostName))",
171 "\t\t\t\tSys.setenv(ARVADOS_API_HOST = hostName)",
173 "\t\t\tif(!is.null(authToken))",
174 "\t\t\t\tSys.setenv(ARVADOS_API_TOKEN = authToken)",
176 "\t\t\tprivate$rawHost <- Sys.getenv(\"ARVADOS_API_HOST\")",
177 "\t\t\tprivate$host <- paste0(\"http://\", private$rawHost, \"/arvados/v1/\")",
178 "\t\t\tprivate$token <- Sys.getenv(\"ARVADOS_API_TOKEN\")",
179 "\t\t\tprivate$numRetries <- numRetries",
180 "\t\t\tprivate$http <- ArvadosR:::HttpRequest$new()",
181 "\t\t\tprivate$httpParser <- ArvadosR:::HttpParser$new()",
183 "\t\t\tif(private$rawHost == \"\" | private$token == \"\")",
184 "\t\t\t\tstop(paste(\"Please provide host name and authentification token\",",
185 "\t\t\t\t\t\t \"or set ARVADOS_API_HOST and ARVADOS_API_TOKEN\",",
186 "\t\t\t\t\t\t \"environment variables.\"))",
190 generateAPIClassFooter <- function()
192 c("\t\tgetHostName = function() private$host,",
193 "\t\tgetToken = function() private$token",
199 "\t\trawHost = NULL,",
202 "\t\thttpParser = NULL,",
203 "\t\tnumRetries = NULL",
206 "\tcloneable = FALSE",
210 generateArvadosClasses <- function(resources)
212 classes <- sapply(resources$schemas, function(classSchema)
214 getArvadosClass(classSchema)
218 unlist(unname(classes))
220 #Todo: To file or directley to memory?
221 fileConn <- file("ArvadosClasses.R", "w")
222 writeLines(unlist(classes), fileConn)
227 getArvadosClass <- function(classSchema)
229 name <- classSchema$id
230 fields <- unique(names(classSchema$properties))
231 fieldsList <- paste0("c(", paste0("\"", fields, "\"", collapse = ", "), ")")
232 constructorArgs <- paste0(fields, " = NULL", collapse = ", ")
234 classString <- c(paste0(name, " <- R6::R6Class("),
236 paste0("\t\"", name, "\","),
239 paste0("\t\t", fields, " = NULL,"),
241 paste0("\t\tinitialize = function(", constructorArgs, ") {"),
242 paste0("\t\t\tself$", fields, " <- ", fields),
244 paste0("\t\t\tprivate$classFields <- ", fieldsList),
247 "\t\ttoJSON = function() {",
248 "\t\t\tfields <- sapply(private$classFields, function(field)",
250 "\t\t\t\tself[[field]]",
251 "\t\t\t}, USE.NAMES = TRUE)",
253 paste0("\t\t\tlist(\"", name, "\" = Filter(Negate(is.null), fields))"),
258 "\t\tclassFields = NULL",
261 "\tcloneable = FALSE",