inst/doc/design.R

## ---- include = FALSE---------------------------------------------------------
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)

## ----setup--------------------------------------------------------------------
library("tibble")
library("jsonlite")
library("purrr")

## -----------------------------------------------------------------------------
str(mtcars[, c("wt", "mpg")])
str(mtcars[, "mpg"])

## -----------------------------------------------------------------------------
str(mtcars[, "mpg", drop = FALSE])

## -----------------------------------------------------------------------------
str(as_tibble(mtcars)[, "mpg"])

## -----------------------------------------------------------------------------
content <- 
  fromJSON(
    '{
      "entries": [
        {
          "id": "12345",
          "etag": "1",
          "type": "file",
          "sequence_id": "3",
          "name": "Contract.pdf",
          "sha1": "85136C79CBF9FE36BB9D05D0639C70C265C18D37",
          "file_version": {
            "id": "12345",
            "type": "file_version",
            "sha1": "134b65991ed521fcfe4724b7d814ab8ded5185dc"
          }
        }
      ],
      "limit": 1000,
      "offset": 2000,
      "order": [
        {
          "by": "type",
          "direction": "ASC"
        }
      ],
      "total_count": 5000
    }',
    simplifyVector = FALSE
  )

## -----------------------------------------------------------------------------
str(content)

## -----------------------------------------------------------------------------
# we could imagine this as a function that would contain all our parsing rules
parse_entry <- function(entry) {
  
  # if we import tidyselect, we can use functions like `ends_with()`
  entry <- purrr::map_at(entry, c("etag", "sequence_id"), as.numeric)
  entry <- purrr::map_if(entry, is.list, parse_entry)
  
  entry
}

entries <-
  content$entries %>%
  map(parse_entry)

str(entries)

## -----------------------------------------------------------------------------
boxr:::stack_rows_df(entries)

## -----------------------------------------------------------------------------
boxr:::stack_rows_tbl(entries)

## ----eval=FALSE---------------------------------------------------------------
#  library("boxr")
#  
#  box_auth()

## ----eval=FALSE---------------------------------------------------------------
#  # this works for Ian's Box account - no-one else
#  dir_id <- "123053109701"
#  
#  # returns a httr response object
#  box_api_response <- function(verb, endpoint) {
#  
#    response <-
#      httr::RETRY(
#        verb,
#        glue::glue("https://api.box.com/2.0/{endpoint}"),
#        boxr:::get_token(),
#        terminate_on = boxr:::box_terminal_http_codes()
#      )
#  
#    response
#  }
#  
#  response <- box_api_response("GET", glue::glue("folders/{dir_id}/items/"))
#  
#  response

## -----------------------------------------------------------------------------
box_content <- function(response, task = NULL) {
  
  httr::stop_for_status(response, task = task)

  text <- httr::content(response, as = "text", encoding = "UTF-8")
  
  # we may want to deviate from the defaults
  content <- jsonlite::fromJSON(text, simplifyDataFrame = FALSE)
  
  content
}

## ----eval=FALSE---------------------------------------------------------------
#  content <- box_content(response, task = "get directory listing")
#  
#  str(content)

## ----eval=FALSE---------------------------------------------------------------
#  box_parse_entries <- function(entries) {
#    purrr::map(entries, parse_entry)
#  }
#  
#  parsed <- box_parse_entries(content$entries)
#  
#  str(parsed)

## ----eval=FALSE---------------------------------------------------------------
#  tbl <- boxr:::stack_rows_tbl(parsed)
#  
#  tbl

## ----eval=FALSE---------------------------------------------------------------
#  box_dir_info <- function(dir_id) {
#  
#    response <- box_api_response("GET", glue::glue("folders/{dir_id}/items/"))
#  
#    entries <- box_content(response, task = "get directory listing")[["entries"]]
#  
#    # The above is an oversimplification. In actuality, these two functions
#    # would be combined into one function that would take care of the pagination,
#    # something like:
#    #
#    # entries <-
#    #  box_api_entries(
#    #    "GET",
#    #     endpoint = glue::glue("folders/{dir_id}/items/"),
#    #     task = "get directory listing"
#    #  )
#    #
#    # box_api_entries() would call box_api_response() and box_content()
#  
#    parsed <- box_parse_entries(entries)
#  
#    stacked <- boxr:::stack_rows_tbl(parsed)
#  
#    # not doing anything here, but box_version_history() changes some columns
#    wrangled <- stacked
#  
#    wrangled
#  }
#  
#  box_dir_info(dir_id)

## -----------------------------------------------------------------------------
boxr:::string_side_effects()

Try the boxr package in your browser

Any scripts or data that you put into this service are public.

boxr documentation built on Jan. 19, 2021, 5:06 p.m.