Content Runtimes
Python, R, and Quarto Versions in Use
This recipe contains an R Markdown document that presents a table detailing the R and Python versions used by content deployed to a Posit Connect server.
The document uses the GET /v1/content
endpoint to obtain information about content. This API call returns every content item visible to your API key.
Tip
Use the GET /v1/server_settings/r
, GET /v1/server_settings/python
, and GET /v1/server_settings/quarto
endpoints to determine the full set of R, Python, and Quarto versions available on your server.
---
title: "Runtime Versions in Use"
---
This document analyzes the Python, R, and Quarto versions used to
run content on the Posit Connect server. The table presents the
number of unique content items currently using each combination of
Python, R, and Quarto versions.
```{r setup, echo = FALSE, include=FALSE}
::opts_chunk$set(echo = TRUE)
knitr```
```{r libraries, echo = FALSE, message = FALSE}
library(httr)
library(jsonlite)
library(magrittr)
library(dplyr)
library(knitr)
# Ignore summarise telling us about the grouping.
options(dplyr.summarise.inform = FALSE)
```
```{r verification, echo = FALSE}
# Confirm that environment variables are available.
<- Sys.getenv("CONNECT_SERVER")
connectServer if (nchar(connectServer) == 0) {
stop("Set the CONNECT_SERVER environment variable.")
}<- Sys.getenv("CONNECT_API_KEY")
connectAPIKey if (nchar(connectAPIKey) == 0) {
stop("Set the CONNECT_API_KEY environment variable.")
}<- paste0(connectServer, "/__api__/v1/content")
contentURL ```
```{r fetch, echo = FALSE}
# Fetch all content items from Posit Connect.
<- httr::GET(
res
contentURL,::add_headers(Authorization = paste("Key", connectAPIKey)),
httr::write_memory()
httr
)if (httr::http_error(res)) {
<- sprintf(
err "%s request failed with %s",
$request$url,
res::http_status(res)$message
httr
)message(capture.output(str(httr::content(res))))
stop(err)
}<- httr::content(res, as = "text")
payload <- jsonlite::fromJSON(payload, simplifyDataFrame = TRUE)
content ```
```{r report, echo = FALSE}
# Retain only MAJOR.MINOR version components.
<- function(versions) {
major_minor sapply(versions, function(version) {
if (is.na(version) || version == "") {
NA
else {
} <- strsplit(version, ".", fixed = TRUE)[[1]]
parts paste(parts[1:2], collapse = ".")
}
})
}
# Report the number of content items with each combination of
# R and Python MAJOR.MINOR versions.
<- content %>%
versions mutate(
Python = major_minor(py_version),
R = major_minor(r_version),
Quarto = major_minor(quarto_version),
%>%
) select(Python, R, Quarto) %>%
group_by(Python, R, Quarto) %>%
summarise(N = n()) %>%
arrange(desc(Python), desc(R), desc(Quarto)) %>%
ungroup()
kable(versions)
```