writeResult
},
- move = function(newLocationInCollection)
+ move = function(newLocation)
{
if(is.null(private$collection))
stop("ArvadosFile doesn't belong to any collection")
- newLocationInCollection <- trimFromEnd(newLocationInCollection, "/")
- newParentLocation <- trimFromEnd(newLocationInCollection, private$name)
- newParent <- private$collection$get(newParentLocation)
+ newLocation <- trimFromEnd(newLocation, "/")
+ nameAndPath <- splitToPathAndName(newLocation)
+
+ newParent <- private$collection$get(nameAndPath$path)
if(is.null(newParent))
{
stop("Unable to get destination subcollection")
}
- childWithSameName <- newParent$get(private$name)
+ childWithSameName <- newParent$get(nameAndPath$name)
if(!is.null(childWithSameName))
stop("Destination already contains content with same name.")
REST <- private$collection$getRESTService()
REST$move(self$getRelativePath(),
- paste0(newParent$getRelativePath(), "/", self$getName()),
+ paste0(newParent$getRelativePath(), "/", nameAndPath$name),
private$collection$uuid)
private$dettachFromCurrentParent()
private$attachToNewParent(newParent)
+ private$name <- nameAndPath$name
+
"Content moved successfully."
}
),
+source("./R/util.R")
+
HttpRequest <- R6::R6Class(
"HttrRequest",
GET = function(url, headers = NULL, queryFilters = NULL, limit = NULL, offset = NULL)
{
headers <- httr::add_headers(unlist(headers))
- query <- private$createQuery(queryFilters, limit, offset)
+ query <- self$createQuery(queryFilters, limit, offset)
url <- paste0(url, query)
serverResponse <- httr::GET(url = url, config = headers)
queryFilters = NULL, limit = NULL, offset = NULL)
{
headers <- httr::add_headers(unlist(headers))
- query <- private$createQuery(queryFilters, limit, offset)
+ query <- self$createQuery(queryFilters, limit, offset)
url <- paste0(url, query)
serverResponse <- httr::PUT(url = url, config = headers, body = body)
queryFilters = NULL, limit = NULL, offset = NULL)
{
headers <- httr::add_headers(unlist(headers))
- query <- private$createQuery(queryFilters, limit, offset)
+ query <- self$createQuery(queryFilters, limit, offset)
url <- paste0(url, query)
serverResponse <- httr::POST(url = url, config = headers, body = body)
queryFilters = NULL, limit = NULL, offset = NULL)
{
headers <- httr::add_headers(unlist(headers))
- query <- private$createQuery(queryFilters, limit, offset)
+ query <- self$createQuery(queryFilters, limit, offset)
url <- paste0(url, query)
serverResponse <- httr::DELETE(url = url, config = headers)
curl::handle_setopt(h, customrequest = "PROPFIND")
curl::handle_setheaders(h, .list = headers)
- propfindResponse <- curl::curl_fetch_memory(url, h)
+ propfindResponse <- curl::curl_fetch_memory(url, h)
},
MOVE = function(url, headers = NULL)
curl::handle_setheaders(h, .list = headers)
propfindResponse <- curl::curl_fetch_memory(url, h)
- }
- ),
-
- private = list(
+ },
createQuery = function(filters, limit, offset)
{
finalQuery <- NULL
- if(!is.null(filters))
- {
- filters <- sapply(filters, function(filter)
- {
- if(length(filter) != 3)
- stop("Filter list must have exactly 3 elements.")
-
- attributeAndOperator = filter[c(1, 2)]
- filterList = filter[[3]]
- filterListIsPrimitive = TRUE
- if(length(filterList) > 1)
- filterListIsPrimitive = FALSE
+ finalQuery <- c(finalQuery, private$createFiltersQuery(filters))
+ finalQuery <- c(finalQuery, private$createLimitQuery(limit))
+ finalQuery <- c(finalQuery, private$createOffsetQuery(offset))
- attributeAndOperator <- sapply(attributeAndOperator, function(component) {
- component <- paste0("\"", component, "\"")
- })
+ finalQuery <- finalQuery[!is.null(finalQuery)]
+ finalQuery <- paste0(finalQuery, collapse = "&")
- filterList <- sapply(unlist(filterList), function(filter) {
- filter <- paste0("\"", filter, "\"")
- })
-
- filterList <- paste(filterList, collapse = ",+")
-
- if(!filterListIsPrimitive)
- filterList <- paste0("[", filterList, "]")
+ if(finalQuery != "")
+ finalQuery <- paste0("/?", finalQuery)
- filter <- c(attributeAndOperator, filterList)
+ finalQuery
+ }
+ ),
- queryParameter <- paste(filter, collapse = ",+")
- queryParameter <- paste0("[", queryParameter, "]")
-
- })
+ private = list(
- filters <- paste(filters, collapse = ",+")
- filters <- paste0("[", filters, "]")
+ createFiltersQuery = function(filters)
+ {
+ if(!is.null(filters))
+ {
+ filters <- RListToPythonList(filters, ",+")
encodedQuery <- URLencode(filters, reserved = T, repeated = T)
-
encodedQuery <- stringr::str_replace_all(encodedQuery, "%2B", "+")
- finalQuery <- c(finalQuery, paste0("filters=", encodedQuery))
-
- finalQuery
+ return(paste0("filters=", encodedQuery))
}
+ return(NULL)
+ },
+
+ createLimitQuery = function(limit)
+ {
if(!is.null(limit))
{
- if(!is.numeric(limit))
+ limit <- suppressWarnings(as.numeric(limit))
+
+ if(is.na(limit))
stop("Limit must be a numeric type.")
- finalQuery <- c(finalQuery, paste0("limit=", limit))
+ return(paste0("limit=", limit))
}
+ return(NULL)
+ },
+
+ createOffsetQuery = function(offset)
+ {
if(!is.null(offset))
{
- if(!is.numeric(offset))
+ offset <- suppressWarnings(as.numeric(offset))
+
+ if(is.na(offset))
stop("Offset must be a numeric type.")
- finalQuery <- c(finalQuery, paste0("offset=", offset))
- }
-
- if(length(finalQuery) > 1)
- {
- finalQuery <- paste0(finalQuery, collapse = "&")
+ return(paste0("offset=", offset))
}
- if(!is.null(finalQuery))
- finalQuery <- paste0("/?", finalQuery)
-
- finalQuery
+ return(NULL)
}
),
return(sum(fileSizes))
},
- move = function(newLocationInCollection)
+ move = function(newLocation)
{
if(is.null(private$collection))
stop("Subcollection doesn't belong to any collection")
- newLocationInCollection <- trimFromEnd(newLocationInCollection, "/")
- newParentLocation <- trimFromEnd(newLocationInCollection, private$name)
+ newLocation <- trimFromEnd(newLocation, "/")
+ nameAndPath <- splitToPathAndName(newLocation)
- newParent <- private$collection$get(newParentLocation)
+ newParent <- private$collection$get(nameAndPath$path)
if(is.null(newParent))
{
stop("Unable to get destination subcollection")
}
- childWithSameName <- newParent$get(private$name)
+ childWithSameName <- newParent$get(nameAndPath$name)
if(!is.null(childWithSameName))
stop("Destination already contains content with same name.")
REST <- private$collection$getRESTService()
REST$move(self$getRelativePath(),
- paste0(newParent$getRelativePath(), "/", self$getName()),
+ paste0(newParent$getRelativePath(), "/", nameAndPath$name),
private$collection$uuid)
private$dettachFromCurrentParent()
private$attachToNewParent(newParent)
- "Content moved successfully"
+ private$name <- nameAndPath$name
+
+ "Content moved successfully."
},
get = function(name)
expect_that(result, equals("./something/random"))
})
+
+test_that("RListToPythonList converts nested R list to char representation of Python list", {
+
+ sample <- list("insert", list("random", list("text")), list("here"))
+
+ result <- RListToPythonList(sample)
+ resultWithSeparator <- RListToPythonList(sample, separator = ",+")
+
+ expect_that(result, equals("[\"insert\", [\"random\", \"text\"], \"here\"]"))
+ expect_that(resultWithSeparator,
+ equals("[\"insert\",+[\"random\",+\"text\"],+\"here\"]"))
+})
+
+test_that("appendToStartIfNotExist appends characters to beginning of a string", {
+
+ sample <- "New Year"
+ charactersToAppend <- "Happy "
+
+ result <- appendToStartIfNotExist(sample, charactersToAppend)
+
+ expect_that(result, equals("Happy New Year"))
+})
+
+test_that(paste("appendToStartIfNotExist returns original string if string",
+ "doesn't start with specified characters"), {
+
+ sample <- "Happy New Year"
+ charactersToAppend <- "Happy"
+
+ result <- appendToStartIfNotExist(sample, charactersToAppend)
+
+ expect_that(result, equals("Happy New Year"))
+})
+
+test_that(paste("splitToPathAndName splits relative path to file/folder",
+ "name and rest of the path"), {
+
+ relativePath <- "path/to/my/file.exe"
+
+ result <- splitToPathAndName( relativePath)
+
+ expect_that(result$name, equals("file.exe"))
+ expect_that(result$path, equals("path/to/my"))
+})