24ff888965d7e38e9a28767adbcc1bb5b3f377fb — boB Rudis 10 months ago dea91f5 + 029dae9
master cran
M .Rbuildignore => .Rbuildignore +1 -0
@@ 1,3 1,4 @@
+^LICENSE\.md$
 ^.*\.Rproj$
 ^\.Rproj\.user$
 ^\.travis\.yml$

M .travis.yml => .travis.yml +19 -38
@@ 15,53 15,34 @@ env:
   matrix:
   include:
     - dist: trusty
-    - dist: trusty
       r_check_args: '--ignore-vignettes'
       r_build_args: '--no-build-vignettes'
-      addons:
-        apt:
-          update: true
-          packages:
-            - libmagick++-dev
-            - librsvg2-dev
-            - libwebp-dev
-            - libpoppler-cpp-dev
-            - libtesseract-dev
-            - libleptonica-dev
-            - tesseract-ocr-eng
-            - r-cran-rgdal
-            - libfftw3-dev
-            - cargo
-    - PIP="pip" RETICULATE_PYTHON="/usr/bin/python"
-    - PYTHON=3 PIP="pip3" RETICULATE_PYTHON="/usr/bin/python3"
 
 addons:
-  apt:
-    update: true
-    sources:
-      - sourceline: 'ppa:opencpu/imagemagick'
-    packages:
-      - libmagick++-dev
-      - librsvg2-dev
-      - libwebp-dev
-      - libpoppler-cpp-dev
-      - libtesseract-dev
-      - libleptonica-dev
-      - tesseract-ocr-eng
-      - r-cran-rgdal
-      - libfftw3-dev
-      - cargo
+   apt:
+     update: true
+     sources:
+       - sourceline: 'ppa:opencpu/imagemagick'
+       - sourceline: 'ppa:ubuntugis/ppa'
+     packages:
+       - libmagick++-dev
+       - librsvg2-dev
+       - libwebp-dev
+       - libpoppler-cpp-dev
+       - libtesseract-dev
+       - libleptonica-dev
+       - tesseract-ocr-eng
+       - r-cran-rgdal
+       - libfftw3-dev
+       - cargo
 
 bioc_packages:
   - EBImage
 
 before_install:
-  - docker pull scrapinghub/splash:3.0
-  - docker run -p 5023:5023 -p 8050:8050 -p 8051:8051 -d scrapinghub/splash:3.0
+  - docker pull scrapinghub/splash:3.2
+  - docker run -p 5023:5023 -p 8050:8050 -p 8051:8051 -d scrapinghub/splash:3.2
   - docker ps -a
-  - sudo apt-get -y install python${PYTHON}-pip python-dev python${PYTHON}-numpy
-  - sudo $PIP install -U setuptools
-  - sudo $PIP install -U docker
   - (while true; do echo 'Ping? Pong!'; sleep 500; done) &
 
 r:


@@ 70,4 51,4 @@ r:
  - devel
 
 after_success:
-  - Rscript -e 'covr::codecov()'>
\ No newline at end of file
+  - Rscript -e 'covr::codecov()'

M DESCRIPTION => DESCRIPTION +2 -2
@@ 2,7 2,7 @@ Package: splashr
 Type: Package
 Title: Tools to Work with the 'Splash' 'JavaScript' Rendering and Scraping Service
 Version: 0.6.0
-Date: 2019-01-13
+Date: 2019-02-24
 Encoding: UTF-8
 Authors@R: c(
     person("Bob", "Rudis", email = "bob@rud.is", role = c("aut", "cre"), 


@@ 18,7 18,7 @@ Description: 'Splash' <https://github.com/scrapinghub/splash> is a 'JavaScript' 
     page context; getting detailed rendering info in 'HAR' format.
 URL: http://gitlab.com/hrbrmstr/splashr
 BugReports: https://gitlab.com/hrbrmstr/splashr/issues
-License: AGPL
+License: MIT + file LICENSE
 Suggests:
     testthat,
     tibble,

A LICENSE => LICENSE +2 -0
@@ 0,0 1,2 @@
+YEAR: 2019
+COPYRIGHT HOLDER: Bob Rudis

A LICENSE.md => LICENSE.md +21 -0
@@ 0,0 1,21 @@
+# MIT License
+
+Copyright (c) 2019 Bob Rudis
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.

M NAMESPACE => NAMESPACE +6 -0
@@ 5,6 5,7 @@ S3method(as.data.frame,harentries)
 S3method(as.data.frame,harentry)
 S3method(print,splash_debug)
 S3method(print,splash_json)
+S3method(print,splashr)
 export("%>%")
 export(HARviewer)
 export(HARviewerOutput)


@@ 77,11 78,16 @@ export(splash_version)
 export(splash_wait)
 export(start_splash)
 export(stop_splash)
+export(ua_android_samsung)
+export(ua_apple_tv)
+export(ua_chromecast)
 export(ua_ios_safari)
+export(ua_kindle)
 export(ua_linux_chrome)
 export(ua_linux_firefox)
 export(ua_macos_chrome)
 export(ua_macos_safari)
+export(ua_ps4)
 export(ua_splashr)
 export(ua_win10_chrome)
 export(ua_win10_firefox)

M NEWS.md => NEWS.md +4 -0
@@ 2,6 2,10 @@
 
 * Switch Docker orchestration to the `stevedore` package
 * Fixed minor check on as.data.frame functions
+* Cleaned up splashr object printing
+* Added Android, Kindle, Apple TV & Chromecast user agents and updated 
+  other user agents
+* Updated Travis config to not use old docker pkg components
 
 0.5.0
 

M R/docker-splash.r => R/docker-splash.r +49 -13
@@ 2,6 2,7 @@
 #'
 #' @md
 #' @param tag Splash Docker image tag to install
+#' @return a `docker_image` object or `NULL` if an error occurred.
 #' @export
 #' @family splash_docker_helpers
 #' @examples \dontrun{


@@ 9,9 10,23 @@
 #' splash_container <- start_splash()
 #' stop_splash(splash_container)
 #' }
-install_splash <- function(tag="3.2") {
+install_splash <- function(tag="latest") {
+
   docker <- stevedore::docker_client()
-  res <- docker$image$pull("scrapinghub/splash", tag=tag, stream=stdout())
+
+  tryCatch(
+    docker$image$pull("scrapinghub/splash", tag=tag, stream=stdout()),
+    error = function(e) {
+      message("Error pulling image from DockerHub.\n", e)
+      return(NULL)
+    },
+    interrupt = function(e) {
+      stop("Terminated by user", call. = FALSE)
+    }
+  ) -> res
+
+  invisible(res)
+
 }
 
 #' Start a Splash server Docker container


@@ 19,6 34,10 @@ install_splash <- function(tag="3.2") {
 #' If using this in an automation context, you should consider adding a
 #' `Sys.sleep(3)` (or higher) after starting the docker container.
 #'
+#' This uses the `latest` image and passed the `--disable-browser-caches`
+#' parameter. If you do not want to use the 3.2.x+ versions of `Splash`
+#' you should use your own startup scripts vs this helper function.
+#'
 #' @param tag Splash Docker image tag to start
 #' @note you need Docker running on your system and have pulled the container with
 #'       [install_splash] for this to work. You should save the resultant


@@ 27,25 46,37 @@ install_splash <- function(tag="3.2") {
 #' @param container_name naem for the container. Defaults to "`splashr`".
 #' @param remove remove the Splash container instance after it's stopped?
 #'        Defaults to `FALSE`.
+#' @param ... passed on to Splash instance launch parameters
 #' @family splash_docker_helpers
-#' @return `stevedor` container object
+#' @return `stevedore` container object
 #' @export
 #' @examples \dontrun{
 #' install_splash()
 #' splash_container <- start_splash()
 #' stop_splash(splash_container)
 #' }
-start_splash <- function(tag="3.2", container_name = "splashr", remove=FALSE) {
+start_splash <- function(tag="latest", container_name = "splashr", remove=FALSE, ...) {
 
   docker <- stevedore::docker_client()
 
-  docker$container$run(
-    image = sprintf("scrapinghub/splash:%s", tag),
-    name = container_name,
-    ports = c("5023:5023", "8051:8051"),
-    detach = TRUE,
-    rm = remove,
-    tty = TRUE
+  tryCatch(
+    docker$container$run(
+      image = sprintf("scrapinghub/splash:%s", tag),
+      name = container_name,
+      ports = c("5023:5023", "8051:8051", "8050:8050"),
+      detach = TRUE,
+      rm = remove,
+      tty = TRUE,
+      "--disable-browser-caches",
+      ...
+    ),
+    error = function(e) {
+      message("Error pulling image from DockerHub.")
+      return(NULL)
+    },
+    interrupt = function(e) {
+      stop("Terminated by user", call. = FALSE)
+    }
   ) -> splash_inst
 
   invisible(splash_inst)


@@ 66,8 97,10 @@ start_splash <- function(tag="3.2", container_name = "splashr", remove=FALSE) {
 #' stop_splash(splash_container)
 #' }
 stop_splash <- function(splash_container) {
-  splash_container$stop()
-  splash_container$remove()
+  if (inherits(splash_container, "stevedore_object")) {
+    splash_container$stop()
+    splash_container$remove()
+  }
   invisible(NULL)
 }
 


@@ 83,7 116,9 @@ stop_splash <- function(splash_container) {
 killall_splash <- function() {
 
   docker <- stevedore::docker_client()
+
   x <- docker$container$list(all=TRUE)
+
   for (i in 1:nrow(x)) {
     if (grepl("bin/splash", x$command[i])) {
       message(sprintf("Pruning: %s...", x$id[i]))


@@ 94,6 129,7 @@ killall_splash <- function() {
       }
     }
   }
+
 }
 
 

M R/splashr.r => R/splashr.r +27 -1
@@ 2,6 2,10 @@ splash_url <- function(splash_obj) { sprintf("http://%s:%s", splash_obj$host, sp
 
 #' Configure parameters for connecting to a Splash server
 #'
+#'
+#' @md
+#' @note There is a quick "helper" object named `splash_local` which is preconfigured
+#'       with `localhost` as the host name.
 #' @param host host or IP address
 #' @param port port the server is running on (default is 8050)
 #' @param user,pass leave `NULL` if basic auth is not configured. Otherwise,


@@ 11,7 15,29 @@ splash_url <- function(splash_obj) { sprintf("http://%s:%s", splash_obj$host, sp
 #' sp <- splash()
 #' }
 splash <- function(host, port=8050L, user=NULL, pass=NULL) {
-  list(host=host, port=port, user=user, pass=pass)
+  obj <- list(host=host, port=port, user=user, pass=pass)
+  class(obj) <- c("splashr", "list")
+  obj
+}
+
+#' Print for splashr
+#'
+#' @md
+#' @param x a splashr object
+#' @param ... unused
+#' @keywords internal
+#' @return x
+#' @export
+print.splashr <- function(x, ...) {
+
+  cat(
+    "<splashr instance connection; ",
+    if (length(x$user)) sprintf("%s@", x$user) else "",
+    x$host, ":", x$port, ">\n", sep=""
+  )
+
+  invisible(x)
+
 }
 
 #' @rdname splash

M R/user-agents.R => R/user-agents.R +20 -0
@@ 46,3 46,23 @@ ua_linux_firefox <- "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:51.0) Gecko/2010
 #' @rdname splash_user_agent
 #' @export
 ua_ios_safari <- "Mozilla/5.0 (iPad; CPU OS 10_2 like Mac OS X) AppleWebKit/602.3.12 (KHTML, like Gecko) Version/10.0 Mobile/14C92 Safari/602.1"
+
+#' @rdname splash_user_agent
+#' @export
+ua_android_samsung <- "Mozilla/5.0 (Linux; Android 7.0; SM-G892A Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/60.0.3112.107 Mobile Safari/537.36"
+
+#' @rdname splash_user_agent
+#' @export
+ua_kindle <- "Mozilla/5.0 (X11; U; Linux armv7l like Android; en-us) AppleWebKit/531.2+ (KHTML, like Gecko) Version/5.0 Safari/533.2+ Kindle/3.0+"
+
+#' @rdname splash_user_agent
+#' @export
+ua_ps4 <- "Mozilla/5.0 (PlayStation 4 3.11) AppleWebKit/537.73 (KHTML, like Gecko)"
+
+#' @rdname splash_user_agent
+#' @export
+ua_apple_tv <- "AppleTV6,2/11.1"
+
+#' @rdname splash_user_agent
+#' @export
+ua_chromecast <- "Mozilla/5.0 (CrKey armv7l 1.5.16041) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.0 Safari/537.36"

A R/utils-safely.R => R/utils-safely.R +90 -0
@@ 0,0 1,90 @@
+# Less cool counterparts to purrr's side-effect capture-rs
+#
+# Most of the helper functions are 100% from output.R in purrr repo
+#
+# @param quiet Hide errors (`TRUE`, the default), or display them
+#   as they occur?
+# @param otherwise Default value to use when an error occurs.
+#
+# @return `safely`: wrapped function instead returns a list with
+#   components `result` and `error`. One value is always `NULL`.
+#
+#   `quietly`: wrapped function instead returns a list with components
+#   `result`, `output`, `messages` and `warnings`.
+#
+#   `possibly`: wrapped function uses a default value (`otherwise`)
+#   whenever an error occurs.
+safely <- function(.f, otherwise = NULL, quiet = TRUE) {
+  function(...) capture_error(.f(...), otherwise, quiet)
+}
+
+quietly <- function(.f) {
+  function(...) capture_output(.f(...))
+}
+
+possibly <- function(.f, otherwise, quiet = TRUE) {
+  force(otherwise)
+  function(...) {
+    tryCatch(.f(...),
+      error = function(e) {
+        if (!quiet)
+          message("Error: ", e$message)
+        otherwise
+      },
+      interrupt = function(e) {
+        stop("Terminated by user", call. = FALSE)
+      }
+    )
+  }
+}
+
+capture_error <- function(code, otherwise = NULL, quiet = TRUE) {
+  tryCatch(
+    list(result = code, error = NULL),
+    error = function(e) {
+      if (!quiet)
+        message("Error: ", e$message)
+
+      list(result = otherwise, error = e)
+    },
+    interrupt = function(e) {
+      stop("Terminated by user", call. = FALSE)
+    }
+  )
+}
+
+capture_output <- function(code) {
+  warnings <- character()
+  wHandler <- function(w) {
+    warnings <<- c(warnings, w$message)
+    invokeRestart("muffleWarning")
+  }
+
+  messages <- character()
+  mHandler <- function(m) {
+    messages <<- c(messages, m$message)
+    invokeRestart("muffleMessage")
+  }
+
+  temp <- file()
+  sink(temp)
+  on.exit({
+    sink()
+    close(temp)
+  })
+
+  result <- withCallingHandlers(
+    code,
+    warning = wHandler,
+    message = mHandler
+  )
+
+  output <- paste0(readLines(temp, warn = FALSE), collapse = "\n")
+
+  list(
+    result = result,
+    output = output,
+    warnings = warnings,
+    messages = messages
+  )
+}

M man/as_har.Rd => man/as_har.Rd +1 -1
@@ 1,5 1,5 @@
 % Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/render-har.R
+% Please edit documentation in R/render-har.r
 \name{as_har}
 \alias{as_har}
 \title{Turn a generic Splash HAR response into a HAR object}

M man/as_httr_req.Rd => man/as_httr_req.Rd +1 -1
@@ 1,5 1,5 @@
 % Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/as_req.R
+% Please edit documentation in R/as_req.r
 \name{as_httr_req}
 \alias{as_httr_req}
 \title{Create an httr verb request function from an HAR request}

M man/as_response.Rd => man/as_response.Rd +1 -1
@@ 1,5 1,5 @@
 % Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/as_request.R
+% Please edit documentation in R/as_request.r
 \name{as_response}
 \alias{as_response}
 \title{Return a HAR entry response as an httr::response object}

M man/execute_lua.Rd => man/execute_lua.Rd +1 -1
@@ 1,5 1,5 @@
 % Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/execute.R
+% Please edit documentation in R/execute.r
 \name{execute_lua}
 \alias{execute_lua}
 \title{Execute a custom rendering script and return a result.}

M man/get_content_size.Rd => man/get_content_size.Rd +1 -1
@@ 1,5 1,5 @@
 % Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/content.R
+% Please edit documentation in R/content.r
 \name{get_content_size}
 \alias{get_content_size}
 \alias{get_body_size}

M man/get_content_type.Rd => man/get_content_type.Rd +1 -1
@@ 1,5 1,5 @@
 % Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/helpers.R
+% Please edit documentation in R/helpers.r
 \name{get_content_type}
 \alias{get_content_type}
 \alias{is_content_type}

M man/get_har_entry.Rd => man/get_har_entry.Rd +1 -1
@@ 1,5 1,5 @@
 % Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/helpers.R
+% Please edit documentation in R/helpers.r
 \name{get_har_entry}
 \alias{get_har_entry}
 \title{Retrieve an entry by index from a HAR object}

M man/get_request_type.Rd => man/get_request_type.Rd +1 -1
@@ 1,5 1,5 @@
 % Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/helpers.R
+% Please edit documentation in R/helpers.r
 \name{get_request_type}
 \alias{get_request_type}
 \alias{is_get}

M man/get_request_url.Rd => man/get_request_url.Rd +1 -1
@@ 1,5 1,5 @@
 % Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/helpers.R
+% Please edit documentation in R/helpers.r
 \name{get_request_url}
 \alias{get_request_url}
 \title{Retrieve request URL}

M man/get_response_body.Rd => man/get_response_body.Rd +1 -1
@@ 1,5 1,5 @@
 % Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/helpers.R
+% Please edit documentation in R/helpers.r
 \name{get_response_body}
 \alias{get_response_body}
 \title{Retrieve the body content of a HAR entry}

M man/har_entries.Rd => man/har_entries.Rd +1 -1
@@ 1,5 1,5 @@
 % Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/helpers.R
+% Please edit documentation in R/helpers.r
 \name{har_entries}
 \alias{har_entries}
 \title{Retrieve just the HAR entries from a splashr request}

M man/har_entry_count.Rd => man/har_entry_count.Rd +1 -1
@@ 1,5 1,5 @@
 % Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/helpers.R
+% Please edit documentation in R/helpers.r
 \name{har_entry_count}
 \alias{har_entry_count}
 \title{Retrieves number of HAR entries in a response}

M man/install_splash.Rd => man/install_splash.Rd +5 -2
@@ 1,14 1,17 @@
 % Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/docker-splash.R
+% Please edit documentation in R/docker-splash.r
 \name{install_splash}
 \alias{install_splash}
 \title{Retrieve the Docker image for Splash}
 \usage{
-install_splash(tag = "3.2")
+install_splash(tag = "latest")
 }
 \arguments{
 \item{tag}{Splash Docker image tag to install}
 }
+\value{
+a \code{docker_image} object or \code{NULL} if an error occurred.
+}
 \description{
 Retrieve the Docker image for Splash
 }

M man/json_fromb64.Rd => man/json_fromb64.Rd +1 -1
@@ 1,5 1,5 @@
 % Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/utils.R
+% Please edit documentation in R/utils.r
 \name{json_fromb64}
 \alias{json_fromb64}
 \title{Convert a Base64 encoded string into an R object}

M man/killall_splash.Rd => man/killall_splash.Rd +1 -1
@@ 1,5 1,5 @@
 % Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/docker-splash.R
+% Please edit documentation in R/docker-splash.r
 \name{killall_splash}
 \alias{killall_splash}
 \title{Prune all dead and running Splash Docker containers}

A man/print.splashr.Rd => man/print.splashr.Rd +20 -0
@@ 0,0 1,20 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/splashr.r
+\name{print.splashr}
+\alias{print.splashr}
+\title{Print for splashr}
+\usage{
+\method{print}{splashr}(x, ...)
+}
+\arguments{
+\item{x}{a splashr object}
+
+\item{...}{unused}
+}
+\value{
+x
+}
+\description{
+Print for splashr
+}
+\keyword{internal}

M man/render_har.Rd => man/render_har.Rd +1 -1
@@ 1,5 1,5 @@
 % Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/render-har.R
+% Please edit documentation in R/render-har.r
 \name{render_har}
 \alias{render_har}
 \title{Return information about Splash interaction with a website in HAR format.}

M man/render_html.Rd => man/render_html.Rd +1 -1
@@ 1,5 1,5 @@
 % Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/render-html.R
+% Please edit documentation in R/render-html.r
 \name{render_html}
 \alias{render_html}
 \title{Return the HTML of the javascript-rendered page.}

M man/render_jpeg.Rd => man/render_jpeg.Rd +1 -1
@@ 1,5 1,5 @@
 % Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/render-jpg.R
+% Please edit documentation in R/render-jpg.r
 \name{render_jpeg}
 \alias{render_jpeg}
 \title{Return a image (in JPEG format) of the javascript-rendered page.}

M man/render_json.Rd => man/render_json.Rd +1 -1
@@ 1,5 1,5 @@
 % Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/render-json.R
+% Please edit documentation in R/render-json.r
 \name{render_json}
 \alias{render_json}
 \title{Return a json-encoded dictionary with information about javascript-rendered webpage.}

M man/render_png.Rd => man/render_png.Rd +1 -1
@@ 1,5 1,5 @@
 % Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/render-png.R
+% Please edit documentation in R/render-png.r
 \name{render_png}
 \alias{render_png}
 \title{Return an image (in PNG format) of the javascript-rendered page.}

M man/splash.Rd => man/splash.Rd +7 -3
@@ 1,11 1,11 @@
 % Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/splashr.R
+% Please edit documentation in R/splashr.r
 \docType{data}
 \name{splash}
 \alias{splash}
 \alias{splash_local}
 \title{Configure parameters for connecting to a Splash server}
-\format{An object of class \code{list} of length 4.}
+\format{An object of class \code{splashr} (inherits from \code{list}) of length 4.}
 \usage{
 splash(host, port = 8050L, user = NULL, pass = NULL)
 


@@ 16,12 16,16 @@ splash_local
 
 \item{port}{port the server is running on (default is 8050)}
 
-\item{user, pass}{leave `NULL` if basic auth is not configured. Otherwise,
+\item{user, pass}{leave \code{NULL} if basic auth is not configured. Otherwise,
 fill in what you need for basic authentication.}
 }
 \description{
 Configure parameters for connecting to a Splash server
 }
+\note{
+There is a quick "helper" object named \code{splash_local} which is preconfigured
+with \code{localhost} as the host name.
+}
 \examples{
 \dontrun{
 sp <- splash()

M man/splash_active.Rd => man/splash_active.Rd +1 -1
@@ 1,5 1,5 @@
 % Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/splashr.R
+% Please edit documentation in R/splashr.r
 \name{splash_active}
 \alias{splash_active}
 \title{Test if a Splash server is up}

M man/splash_add_lua.Rd => man/splash_add_lua.Rd +1 -1
@@ 1,5 1,5 @@
 % Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/dsl.R
+% Please edit documentation in R/dsl.r
 \name{splash_add_lua}
 \alias{splash_add_lua}
 \title{Add raw lua code into DSL call chain}

M man/splash_click.Rd => man/splash_click.Rd +1 -1
@@ 1,5 1,5 @@
 % Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/dsl.R
+% Please edit documentation in R/dsl.r
 \name{splash_click}
 \alias{splash_click}
 \title{Trigger mouse click event in web page.}

M man/splash_debug.Rd => man/splash_debug.Rd +1 -1
@@ 1,5 1,5 @@
 % Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/splashr.R
+% Please edit documentation in R/splashr.r
 \name{splash_debug}
 \alias{splash_debug}
 \alias{print.splash_debug}

M man/splash_enable_javascript.Rd => man/splash_enable_javascript.Rd +1 -1
@@ 1,5 1,5 @@
 % Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/dsl.R
+% Please edit documentation in R/dsl.r
 \name{splash_enable_javascript}
 \alias{splash_enable_javascript}
 \title{Enable or disable execution of JavaSript code embedded in the page.}

M man/splash_focus.Rd => man/splash_focus.Rd +1 -1
@@ 1,5 1,5 @@
 % Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/dsl.R
+% Please edit documentation in R/dsl.r
 \name{splash_focus}
 \alias{splash_focus}
 \title{Focus on a document element provided by a CSS selector}

M man/splash_go.Rd => man/splash_go.Rd +1 -1
@@ 1,5 1,5 @@
 % Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/dsl.R
+% Please edit documentation in R/dsl.r
 \name{splash_go}
 \alias{splash_go}
 \title{Go to an URL.}

M man/splash_har.Rd => man/splash_har.Rd +1 -1
@@ 1,5 1,5 @@
 % Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/dsl.R
+% Please edit documentation in R/dsl.r
 \name{splash_har}
 \alias{splash_har}
 \title{Return information about Splash interaction with a website in HAR format.}

M man/splash_har_reset.Rd => man/splash_har_reset.Rd +1 -1
@@ 1,5 1,5 @@
 % Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/dsl.R
+% Please edit documentation in R/dsl.r
 \name{splash_har_reset}
 \alias{splash_har_reset}
 \title{Drops all internally stored HAR records.}

M man/splash_history.Rd => man/splash_history.Rd +1 -1
@@ 1,5 1,5 @@
 % Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/splashr.R
+% Please edit documentation in R/splashr.r
 \name{splash_history}
 \alias{splash_history}
 \title{Get information about requests/responses for the pages loaded}

M man/splash_html.Rd => man/splash_html.Rd +1 -1
@@ 1,5 1,5 @@
 % Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/dsl.R
+% Please edit documentation in R/dsl.r
 \name{splash_html}
 \alias{splash_html}
 \title{Return a HTML snapshot of a current page.}

M man/splash_images.Rd => man/splash_images.Rd +1 -1
@@ 1,5 1,5 @@
 % Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/dsl.R
+% Please edit documentation in R/dsl.r
 \name{splash_images}
 \alias{splash_images}
 \title{Enable/disable images}

M man/splash_perf_stats.Rd => man/splash_perf_stats.Rd +1 -1
@@ 1,5 1,5 @@
 % Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/splashr.R
+% Please edit documentation in R/splashr.r
 \name{splash_perf_stats}
 \alias{splash_perf_stats}
 \title{Get Splash performance-related statistics}

M man/splash_plugins.Rd => man/splash_plugins.Rd +1 -1
@@ 1,5 1,5 @@
 % Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/dsl.R
+% Please edit documentation in R/dsl.r
 \name{splash_plugins}
 \alias{splash_plugins}
 \title{Enable or disable browser plugins (e.g. Flash).}

M man/splash_png.Rd => man/splash_png.Rd +1 -1
@@ 1,5 1,5 @@
 % Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/dsl.R
+% Please edit documentation in R/dsl.r
 \name{splash_png}
 \alias{splash_png}
 \title{Return a screenshot of a current page in PNG format.}

M man/splash_press.Rd => man/splash_press.Rd +1 -1
@@ 1,5 1,5 @@
 % Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/dsl.R
+% Please edit documentation in R/dsl.r
 \name{splash_press}
 \alias{splash_press}
 \title{Trigger mouse press event in web page.}

M man/splash_private_mode.Rd => man/splash_private_mode.Rd +1 -1
@@ 1,5 1,5 @@
 % Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/dsl.R
+% Please edit documentation in R/dsl.r
 \name{splash_private_mode}
 \alias{splash_private_mode}
 \title{Enable or disable execution of JavaSript code embedded in the page.}

M man/splash_release.Rd => man/splash_release.Rd +1 -1
@@ 1,5 1,5 @@
 % Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/dsl.R
+% Please edit documentation in R/dsl.r
 \name{splash_release}
 \alias{splash_release}
 \title{Trigger mouse release event in web page.}

M man/splash_response_body.Rd => man/splash_response_body.Rd +1 -1
@@ 1,5 1,5 @@
 % Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/dsl.R
+% Please edit documentation in R/dsl.r
 \name{splash_response_body}
 \alias{splash_response_body}
 \title{Enable or disable response content tracking.}

M man/splash_send_keys.Rd => man/splash_send_keys.Rd +1 -1
@@ 1,5 1,5 @@
 % Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/dsl.R
+% Please edit documentation in R/dsl.r
 \name{splash_send_keys}
 \alias{splash_send_keys}
 \title{Send keyboard events to page context.}

M man/splash_send_text.Rd => man/splash_send_text.Rd +1 -1
@@ 1,5 1,5 @@
 % Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/dsl.R
+% Please edit documentation in R/dsl.r
 \name{splash_send_text}
 \alias{splash_send_text}
 \title{Send text as input to page context, literally, character by character.}

M man/splash_user_agent.Rd => man/splash_user_agent.Rd +16 -1
@@ 1,5 1,5 @@
 % Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/dsl.R, R/user-agents.R
+% Please edit documentation in R/dsl.r, R/user-agents.R
 \docType{data}
 \name{splash_user_agent}
 \alias{splash_user_agent}


@@ 15,6 15,11 @@
 \alias{ua_linux_chrome}
 \alias{ua_linux_firefox}
 \alias{ua_ios_safari}
+\alias{ua_android_samsung}
+\alias{ua_kindle}
+\alias{ua_ps4}
+\alias{ua_apple_tv}
+\alias{ua_chromecast}
 \title{Overwrite the User-Agent header for all further requests.}
 \format{An object of class \code{character} of length 1.}
 \usage{


@@ 43,6 48,16 @@ ua_linux_chrome
 ua_linux_firefox
 
 ua_ios_safari
+
+ua_android_samsung
+
+ua_kindle
+
+ua_ps4
+
+ua_apple_tv
+
+ua_chromecast
 }
 \arguments{
 \item{splash_obj}{splashr object}

M man/splash_version.Rd => man/splash_version.Rd +1 -1
@@ 1,5 1,5 @@
 % Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/splashr.R
+% Please edit documentation in R/splashr.r
 \name{splash_version}
 \alias{splash_version}
 \title{Get Splash version information}

M man/splash_wait.Rd => man/splash_wait.Rd +1 -1
@@ 1,5 1,5 @@
 % Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/dsl.R
+% Please edit documentation in R/dsl.r
 \name{splash_wait}
 \alias{splash_wait}
 \title{Wait for a period time}

M man/start_splash.Rd => man/start_splash.Rd +11 -3
@@ 1,10 1,11 @@
 % Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/docker-splash.R
+% Please edit documentation in R/docker-splash.r
 \name{start_splash}
 \alias{start_splash}
 \title{Start a Splash server Docker container}
 \usage{
-start_splash(tag = "3.2", container_name = "splashr", remove = FALSE)
+start_splash(tag = "latest", container_name = "splashr",
+  remove = FALSE, ...)
 }
 \arguments{
 \item{tag}{Splash Docker image tag to start}


@@ 13,14 14,21 @@ start_splash(tag = "3.2", container_name = "splashr", remove = FALSE)
 
 \item{remove}{remove the Splash container instance after it's stopped?
 Defaults to `FALSE`.}
+
+\item{...}{passed on to Splash instance launch parameters}
 }
 \value{
-`stevedor` container object
+`stevedore` container object
 }
 \description{
 If using this in an automation context, you should consider adding a
 `Sys.sleep(3)` (or higher) after starting the docker container.
 }
+\details{
+This uses the `latest` image and passed the `--disable-browser-caches`
+parameter. If you do not want to use the 3.2.x+ versions of `Splash`
+you should use your own startup scripts vs this helper function.
+}
 \note{
 you need Docker running on your system and have pulled the container with
       [install_splash] for this to work. You should save the resultant

M man/stop_splash.Rd => man/stop_splash.Rd +1 -1
@@ 1,5 1,5 @@
 % Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/docker-splash.R
+% Please edit documentation in R/docker-splash.r
 \name{stop_splash}
 \alias{stop_splash}
 \title{Stop a running a Splash server Docker container}

M tests/testthat/test-splash.R => tests/testthat/test-splash.R +2 -2
@@ 6,7 6,7 @@ test_that("we can do something", {
   test_url <- "http://localhost:8050/"
 
   xpct <- function(x) {
-    spact <- splash_active()
+    spact <- splash_active(splash_local)
     expect_that(spact, equals(TRUE))
     expect_that(length(splash_debug()), equals(7))
     expect_that(length(splash_version()), equals(9))


@@ 17,7 17,7 @@ test_that("we can do something", {
     expect_that(render_har(url = test_url), is_a("har"))
   }
 
-  spact <- splash_active()
+  spact <- splash_active(splash_local)
 
   if (spact) {
     xpct()