diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index af0ef95..8704066 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,3 +21,23 @@ jobs: use-public-rspm: true - uses: r-lib/actions/setup-renv@f9a764fea8d5c63df6ef9a5c7795bf7deb5d7e05 # v2 - run: make check + - uses: quarto-dev/quarto-actions/setup@8a96df13519ee81fd526f2dfca5962811136661b # v2.2.0 + with: + version: '1.10.19' + - run: make site + - name: Capture website previews + run: | + mkdir -p out/previews + for page in index docs/test docs/odi docs/t20i; do + for size in 1440,1800 480,2000; do + google-chrome --headless --no-sandbox --disable-gpu --hide-scrollbars \ + --timeout=15000 --window-size="$size" \ + --screenshot="out/previews/${page##*/}-${size%,*}.png" \ + "file://$PWD/out/site/$page.html" + done + done + - uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2 + with: + name: site-previews + path: out/previews + retention-days: 7 diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml new file mode 100644 index 0000000..7796a74 --- /dev/null +++ b/.github/workflows/pages.yml @@ -0,0 +1,61 @@ +name: Publish site + +on: + push: + branches: [main] + workflow_dispatch: + workflow_call: + inputs: + ref: + description: Commit containing the validated publication + type: string + required: true + +permissions: + contents: read + +concurrency: + group: pages + cancel-in-progress: false + +jobs: + build: + if: github.ref == 'refs/heads/main' + runs-on: ubuntu-latest + timeout-minutes: 30 + permissions: + contents: read + pages: read + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + ref: ${{ inputs.ref || github.sha }} + persist-credentials: false + - uses: r-lib/actions/setup-r@f9a764fea8d5c63df6ef9a5c7795bf7deb5d7e05 # v2 + with: + r-version: '4.6.0' + use-public-rspm: true + - uses: r-lib/actions/setup-renv@f9a764fea8d5c63df6ef9a5c7795bf7deb5d7e05 # v2 + - uses: quarto-dev/quarto-actions/setup@8a96df13519ee81fd526f2dfca5962811136661b # v2.2.0 + with: + version: '1.10.19' + - run: make site + - uses: actions/configure-pages@45bfe0192ca1faeb007ade9deae92b16b8254a0d # v6.0.0 + - uses: actions/upload-pages-artifact@fc324d3547104276b827a68afc52ff2a11cc49c9 # v5.0.0 + with: + path: out/site + + deploy: + needs: build + runs-on: ubuntu-latest + timeout-minutes: 10 + permissions: + pages: write + id-token: write + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - name: Deploy verified site + id: deployment + uses: actions/deploy-pages@368f82528645a54fb793d4d04e342629a3f51346 # v5.0.1 diff --git a/.github/workflows/ratings.yml b/.github/workflows/ratings.yml index 62a719e..eda5d64 100644 --- a/.github/workflows/ratings.yml +++ b/.github/workflows/ratings.yml @@ -19,10 +19,13 @@ concurrency: jobs: update: + if: github.ref == 'refs/heads/main' runs-on: ubuntu-latest timeout-minutes: 120 permissions: contents: write + outputs: + commit: ${{ steps.publication.outputs.commit }} steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: @@ -32,6 +35,9 @@ jobs: r-version: '4.6.0' use-public-rspm: true - uses: r-lib/actions/setup-renv@f9a764fea8d5c63df6ef9a5c7795bf7deb5d7e05 # v2 + - uses: quarto-dev/quarto-actions/setup@8a96df13519ee81fd526f2dfca5962811136661b # v2.2.0 + with: + version: '1.10.19' - run: make check - name: Fetch, prepare, fit, and render env: @@ -42,7 +48,10 @@ jobs: args+=(--refresh) fi Rscript scripts/pipeline.R "${args[@]}" + - name: Validate website before publishing data + run: make site - name: Publish validated results + id: publication run: | git config user.name 'github-actions[bot]' git config user.email '41898282+github-actions[bot]@users.noreply.github.com' @@ -51,3 +60,14 @@ jobs: git commit -m 'Update cricket ratings' git push origin HEAD:main fi + echo "commit=$(git rev-parse HEAD)" >> "$GITHUB_OUTPUT" + + site: + needs: update + permissions: + contents: read + pages: write + id-token: write + uses: ./.github/workflows/pages.yml + with: + ref: ${{ needs.update.outputs.commit }} diff --git a/.gitignore b/.gitignore index 844f0e2..8534672 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,7 @@ out/**/stage-*/ out/**/*.previous/ figs/stage-*/ figs/*.previous/ +out/site/ + +/.quarto/ +**/*.quarto_ipynb diff --git a/DESCRIPTION b/DESCRIPTION index c1fd385..c65eef8 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -6,10 +6,13 @@ Imports: digest, EloRating, ggplot2, + ggrepel, httr2, jsonlite, + knitr, readr, rlang, + rmarkdown, rvest, xml2, lintr, diff --git a/Makefile b/Makefile index 283f6b6..90113ae 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,6 @@ -.PHONY: sync fetch prepare analyze visualize publish update lint test check ci-docker +.PHONY: sync fetch prepare analyze visualize publish update site lint test check ci-docker + +QUARTO ?= quarto sync: Rscript -e 'renv::restore(prompt = FALSE)' @@ -14,5 +16,9 @@ test: check: lint test +site: + $(QUARTO) render + Rscript scripts/check_site.R + ci-docker: docker run --rm -v "$(CURDIR):/app" -w /app -e RENV_PATHS_LIBRARY=/tmp/library -e RENV_PATHS_CACHE=/tmp/cache rocker/r-ver:4.6.0 sh -c 'apt-get update && apt-get install -y libcurl4-openssl-dev libssl-dev libxml2-dev && make sync check' diff --git a/R/pipeline.R b/R/pipeline.R index f85bd54..fc5d002 100644 --- a/R/pipeline.R +++ b/R/pipeline.R @@ -5,7 +5,8 @@ write_json <- function(value, path) { } code_fingerprint <- function() { - paths <- sort(c(list.files("R", pattern = "\\.R$", full.names = TRUE), "scripts/pipeline.R", "renv.lock")) + modules <- setdiff(list.files("R", pattern = "\\.R$", full.names = TRUE), "R/site.R") + paths <- sort(c(modules, "scripts/pipeline.R", "renv.lock")) if (length(paths) < 3L || !all(file.exists(paths))) stop("Run from the repository root to record code provenance") as.list(setNames(vapply(paths, sha256, character(1)), paths)) } @@ -101,30 +102,22 @@ read_analysis <- function(directory) { list(manifest = manifest, latest = read("latest"), monthly = read("monthly"), updates = read("updates")) } -chart_data <- function(latest, monthly, format_name) { - leaders <- head(latest[latest$format == format_name & latest$is_active, ], 10) - history <- monthly[monthly$format == format_name & monthly$team_id %in% leaders$team_id, ] - history$team <- leaders$team[match(history$team_id, leaders$team_id)] - history -} - visualize_data <- function(input, output) { data <- read_analysis(input) - .data <- rlang::.data + styles <- chart_styles(data$latest) replace_directory(output, function(directory) { for (format in unique(data$latest$format)) { - history <- chart_data(data$latest, data$monthly, format) - chart <- ggplot2::ggplot(history, ggplot2::aes(x = .data$date, y = .data$rating, colour = .data$team)) + - ggplot2::geom_line(linewidth = 0.45) + - ggplot2::theme_minimal(base_size = 11) + - ggplot2::labs( - title = paste(format, toupper(data$manifest$model), "ratings"), - subtitle = paste("Month-end history of the current top ten active teams · through", data$manifest$as_of), - x = NULL, y = "Rating", colour = NULL, - caption = "Completed matches only; no smoothing or interpolation. Independent of ICC rankings." - ) + - ggplot2::theme(panel.grid.minor = ggplot2::element_blank()) - ggplot2::ggsave(file.path(directory, paste0(tolower(format), ".png")), chart, width = 11, height = 6, dpi = 150) + charts <- ratings_charts(data, format, styles) + for (view in names(charts)) { + stem <- paste0(tolower(format), if (view == "history") "_history" else "") + height <- if (view == "history") 12 else 7 + ggplot2::ggsave(file.path(directory, paste0(stem, ".png")), charts[[view]], + width = 12, height = height, dpi = 180, bg = "white" + ) + ggplot2::ggsave(file.path(directory, paste0(stem, ".svg")), charts[[view]], + device = grDevices::svg, width = 12, height = height, bg = "white" + ) + } } manifest <- list( analysis_sha256 = sha256(file.path(input, "manifest.json")), @@ -152,10 +145,16 @@ write_report <- function(data, path) { lines <- c( lines, paste0("## ", format), "", paste("Most recent recorded result:", data$manifest$last_result[[format]]), "", + paste0(", ".png)"), "", + paste0("[Download recent-history SVG](", tolower(format), ".svg)"), "", + "", "Full history by team", "", + paste0(", "_history.png)"), "", + paste0("[Download full-history SVG](", tolower(format), "_history.svg)"), "", + "", "", "### Current ratings", "", "| Rank | Team | Rating | Rated matches | Last rated match |", "| ---: | --- | ---: | ---: | --- |", sprintf("| %s | %s | %s | %s | %s |", rows$rank, label, rows$rating, rows$rated_matches, rows$last_rated_match), - "", paste0(", ".png)"), "" + "" ) } writeLines(head(lines, -1L), path, useBytes = TRUE) diff --git a/R/site.R b/R/site.R new file mode 100644 index 0000000..d3b794a --- /dev/null +++ b/R/site.R @@ -0,0 +1,66 @@ +read_publication <- function(directory) { + manifest <- jsonlite::read_json(file.path(directory, "manifest.json")) + files <- names(manifest$files) + required <- c("latest.csv", "monthly.csv", "updates.csv") + if (!all(required %in% files) || any(basename(files) != files) || anyDuplicated(files)) { + stop("Invalid publication file manifest") + } + for (name in files) { + path <- file.path(directory, name) + if (!file.exists(path) || !identical(digest::digest(file = path, algo = "sha256"), manifest$files[[name]])) { + stop("Publication checksum mismatch: ", name) + } + } + latest <- readr::read_csv( + file.path(directory, "latest.csv"), show_col_types = FALSE, + col_types = readr::cols(date = readr::col_date(), last_rated_match = readr::col_date()) + ) + if ( + !nrow(latest) || anyNA(latest$date) || + !identical(unique(as.character(latest$date)), manifest$analysis$as_of) || + !identical(manifest$source$as_of, manifest$analysis$as_of) + ) { + stop("Inconsistent publication cutoff") + } + list(manifest = manifest, latest = latest) +} + +site_ratings <- function(publication, format) { + rows <- publication$latest + if (!format %in% rows$format) stop("Missing publication format: ", format) + rows <- rows[rows$format == format & rows$is_active, ] + rows <- rows[order(-rows$rating, rows$team_id), ] + data.frame( + Rank = rows$rank, Team = paste0(rows$team, ifelse(rows$is_provisional, " (provisional)", "")), + Elo = rows$rating, `Rated matches` = rows$rated_matches, + `Last rated match` = rows$last_rated_match, check.names = FALSE + ) +} + +check_site <- function(directory, base_path = "/elo_cricket/") { + directory <- normalizePath(directory, mustWork = TRUE) + pages <- list.files(directory, pattern = "[.]html$", recursive = TRUE, full.names = TRUE) + if (!file.exists(file.path(directory, "index.html"))) stop("Missing site index") + for (page in pages) { + html <- xml2::read_html(page) + nodes <- xml2::xml_find_all(html, "//*[@href or @src]") + urls <- unique(c(xml2::xml_attr(nodes, "href"), xml2::xml_attr(nodes, "src"))) + urls <- urls[!is.na(urls) & nzchar(urls)] + urls <- urls[!grepl("^([a-zA-Z][a-zA-Z0-9+.-]*:|//)", urls)] + for (url in urls) { + path <- utils::URLdecode(sub("[?#].*$", "", url)) + if (!nzchar(path)) next + if (startsWith(path, "/")) { + if (!startsWith(path, base_path)) stop("Link outside site base path: ", url) + target <- file.path(directory, substring(path, nchar(base_path) + 1L)) + } else { + target <- file.path(dirname(page), path) + } + if (dir.exists(target)) target <- file.path(target, "index.html") + if (!file.exists(target)) stop("Broken site link in ", basename(page), ": ", url) + target <- normalizePath(target, mustWork = TRUE) + if (!startsWith(target, paste0(directory, "/"))) stop("Link escapes site: ", url) + } + } + invisible(length(pages)) +} diff --git a/R/visualization.R b/R/visualization.R new file mode 100644 index 0000000..9800dea --- /dev/null +++ b/R/visualization.R @@ -0,0 +1,113 @@ +chart_teams <- function(latest, format_name) { + teams <- latest[latest$format == format_name & latest$is_active, ] + head(teams[order(-teams$rating, teams$team_id), ], 10) +} + +chart_styles <- function(latest) { + ids <- sort(unique(unlist(lapply(unique(latest$format), function(format) chart_teams(latest, format)$team_id)))) + colours <- grDevices::adjustcolor( + grDevices::palette.colors(10, "Tableau 10"), red.f = 0.7, green.f = 0.7, blue.f = 0.7 + ) + list( + colours = setNames(rep(colours, length.out = length(ids)), ids), + lines = setNames(rep(rep(c("solid", "longdash", "dotdash"), each = 5), length.out = length(ids)), ids) + ) +} + +chart_data <- function(latest, updates, format_name, start = NULL) { + teams <- chart_teams(latest, format_name) + if (!nrow(teams)) stop("No active rated teams to plot for ", format_name) + updates <- updates[updates$format == format_name & updates$date <= max(teams$date), ] + history <- do.call(rbind, lapply(1:2, function(side) { + data.frame( + team_id = updates[[paste0("team", side, "_id")]], date = updates$date, + rating = updates[[paste0("team", side, "_after")]], sequence = seq_len(nrow(updates)) + ) + })) + history <- history[history$team_id %in% teams$team_id, ] + history <- history[order(history$date, history$sequence), ] + history <- history[!duplicated(history[c("team_id", "date")], fromLast = TRUE), c("team_id", "date", "rating")] + history <- rbind(history, teams[c("team_id", "date", "rating")]) + history <- history[!duplicated(history[c("team_id", "date")], fromLast = TRUE), ] + if (!is.null(start)) { + previous <- history[history$date <= start, ] + previous <- previous[!duplicated(previous$team_id, fromLast = TRUE), ] + previous$date <- rep(start, nrow(previous)) + history <- rbind(previous, history[history$date > start, ]) + } + history <- history[order(history$date, history$team_id), ] + history$format <- format_name + history$team <- teams$team[match(history$team_id, teams$team_id)] + panel_labels <- paste(teams$team, format(teams$rating, big.mark = ",", trim = TRUE), sep = " · ") + history$panel <- factor(history$team_id, levels = teams$team_id, labels = panel_labels) + history +} + +ratings_theme <- function() { + ggplot2::theme_minimal(base_size = 13, base_family = "sans") + + ggplot2::theme( + text = ggplot2::element_text(colour = "#222222"), + panel.grid.minor = ggplot2::element_blank(), + panel.grid.major.x = ggplot2::element_blank(), + panel.grid.major.y = ggplot2::element_line(colour = "#E5E5E5", linewidth = 0.25), + plot.title = ggplot2::element_text(face = "bold", size = 18), + plot.subtitle = ggplot2::element_text(size = 12, margin = ggplot2::margin(b = 12)), + plot.caption = ggplot2::element_text(hjust = 0, size = 10, margin = ggplot2::margin(t = 12)), + plot.title.position = "plot", plot.caption.position = "plot", + strip.text = ggplot2::element_text(face = "bold", hjust = 0, size = 12), + legend.position = "none", plot.margin = ggplot2::margin(12, 18, 12, 12) + ) +} + +ratings_charts <- function(data, format_name, styles = chart_styles(data$latest)) { + .data <- rlang::.data + teams <- chart_teams(data$latest, format_name) + cutoff <- as.Date(data$manifest$as_of) + start <- as.Date(paste0(as.integer(format(cutoff, "%Y")) - 9L, "-01-01")) + history <- chart_data(data$latest, data$updates, format_name) + recent <- chart_data(data$latest, data$updates, format_name, start) + teams$label <- paste(teams$team, format(teams$rating, big.mark = ",", trim = TRUE), sep = " ") + note <- paste( + "Current top ten active teams. Steps show end-of-day Elo; flat sections carry ratings forward.", + "No smoothing or uncertainty intervals. Independent of ICC rankings.", + sep = "\n" + ) + comparison <- ggplot2::ggplot(recent, ggplot2::aes( + x = .data$date, y = .data$rating, group = .data$team_id, + colour = factor(.data$team_id), linetype = factor(.data$team_id) + )) + + ggplot2::geom_step(linewidth = 0.7, direction = "hv") + + ggplot2::geom_point(data = teams, size = 2, show.legend = FALSE) + + ggrepel::geom_text_repel( + data = teams, ggplot2::aes(label = .data$label), + colour = "#222222", size = 4.2, direction = "y", hjust = 0, + nudge_x = 180, box.padding = 0.35, point.padding = 0.2, + min.segment.length = 0, segment.colour = "#777777", segment.size = 0.3, + seed = 42, max.overlaps = Inf, max.iter = 10000, max.time = Inf + ) + + ggplot2::scale_colour_manual(values = styles$colours) + + ggplot2::scale_linetype_manual(values = styles$lines) + + ggplot2::scale_x_date( + breaks = seq(start, cutoff, by = "2 years"), date_labels = "%Y", limits = c(start, cutoff + 950), + expand = ggplot2::expansion(mult = c(0.01, 0)) + ) + + ggplot2::scale_y_continuous(expand = ggplot2::expansion(mult = 0.08)) + + ggplot2::labs( + title = paste(format_name, "Elo ratings"), + subtitle = paste("Recent history ·", format(start, "%Y"), "to", cutoff, "· labels show current ratings"), + x = NULL, y = "Elo rating", caption = note + ) + + ratings_theme() + panels <- ggplot2::ggplot(history, ggplot2::aes(x = .data$date, y = .data$rating, group = .data$team_id)) + + ggplot2::geom_step(colour = "#245673", linewidth = 0.5, direction = "hv") + + ggplot2::facet_wrap(ggplot2::vars(.data$panel), ncol = 2, scales = "fixed") + + ggplot2::scale_x_date(date_labels = "%Y", expand = ggplot2::expansion(mult = c(0.01, 0.02))) + + ggplot2::labs( + title = paste(format_name, "Elo ratings · full history"), + subtitle = paste("Current top ten active teams, ordered by current rating · through", cutoff), + x = NULL, y = "Elo rating", + caption = paste("All panels use the same axes. Headings give current ratings.", note, sep = "\n") + ) + + ratings_theme() + list(recent = comparison, history = panels) +} diff --git a/README.md b/README.md index 6076ef2..aaf986a 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,7 @@ The maintained adapter currently calculates **Elo** for men's Tests, ODIs, and T20Is. The existing Glickman and Stan analyses remain research code. They are not silently replaced with Elo, and they are not yet scheduled for publication. +[Ratings website](https://outside-edge.github.io/elo_cricket/) · [Latest Elo tables](out/release/elo/index.md) · [Latest ratings](out/release/elo/latest.csv) · [Monthly history](out/release/elo/monthly.csv) · @@ -53,6 +54,7 @@ also revisits older source years to incorporate historical corrections. | Analyze | `out/analysis//` | Fit each model independently; save ratings, diagnostics, and specification | | Visualize | `figs//` | Render saved model outputs without fetching or refitting | | Publish | `out/release//` | Assemble verified tables, charts, and provenance | +| Site | `out/site/` | Render the verified publication as a website | The implemented adapter writes under `elo/`. Future Glickman and Stan adapters should use their own directories and model identifiers. They can have different @@ -117,8 +119,12 @@ predictive performance. display rules, not ICC eligibility rules. The update ledger records both teams' ratings before and after every rated match. -Charts show month-end histories of the current top ten active teams, without -smoothing. Histories are reconstructed from the saved source version; they are +Charts show end-of-day match updates for the current top ten active teams, without +smoothing. Recent-history comparisons cover the current and preceding nine calendar +years, with team names and current ratings at the line ends. Full histories appear +in separate team panels with common axes. PNG and SVG versions are published. +The same team uses the same color and line type across formats within a publication. +Histories are reconstructed from the saved source version; they are not evidence of what could have been published using records available at the time. Git history preserves successive actual publications. @@ -127,19 +133,38 @@ errors. Glickman uncertainty and Stan posterior summaries belong to their own models and should not be presented as interchangeable Elo standard errors. Before comparing methods, use common chronological forecast cutoffs and document each model's treatment of draws, ties, inactivity, and missing covariates. +The [modeling proposal](docs/rating_models.md) sets out institutional versus lineup +strength, TrueSkill-style and GAM extensions, venue context, and the distinction +between live ratings and retrospective smoothing. ## Publication and checks The workflow is scheduled for Monday at 06:17 UTC, with monthly snapshots included in each update. Scheduling starts when the workflow is on the default branch. -It runs `make check`, updates all stages, and commits the data/output directories -only after successful validation. GitHub schedules can be delayed or disabled; -the publication manifest records the actual cutoff. +It runs `make check`, updates all stages, and renders and checks the website before +committing the data/output directories. GitHub schedules can be delayed or disabled; +the publication manifest records the actual cutoff. After committing an update, +the workflow passes that commit to the Pages workflow, which renders and deploys +the corresponding website. Merges to `main` also rebuild the site. + +The website uses [Quarto 1.10.19](https://quarto.org/docs/get-started/). +Its source is `index.qmd`, `docs/`, and `_quarto.yml`; compiled HTML stays in the +ignored `out/site/` directory. To build and check it locally: + +```sh +make site +``` + +Rendering verifies and reads `out/release/elo/` without fetching or fitting. +The site check validates local page and asset links and verifies the copied +downloads against the original publication manifest. CI renders all eight pages. +GitHub Pages uses the Actions publishing source and the `github-pages` environment. Every stage writes to a temporary directory before replacing its previous output. Input/output hashes prevent mixing different data, model, or figure versions. -Publication also requires every stage's code hashes to match the current R code -and dependency lockfile. Rebuild preparation, analysis, and figures after changing code. +Publication also requires every stage's code hashes to match the current pipeline R code +and dependency lockfile. Rebuild preparation, analysis, and figures after changing that code. +The website reader in `R/site.R` is excluded from model-stage fingerprints. A failed stage leaves the previous publication intact. If interrupted between directory renames, recover `.previous` before rerunning; the pipeline refuses to discard that recovery directory automatically. @@ -153,7 +178,8 @@ make ci-docker real source fixtures, the legacy BOM and outcome regressions, exact numerical reference checks, absence of future-data effects, and publication failure cases. `make ci-docker` uses the standard `rocker/r-ver:4.6.0` image and requires a running -Docker daemon. The GitHub checks run the same R tests on Ubuntu. +Docker daemon. It checks the R pipeline; run `make site` separately with Quarto +to check the website. The GitHub checks run both on Ubuntu. ## Research and historical outputs diff --git a/_quarto.yml b/_quarto.yml new file mode 100644 index 0000000..e906486 --- /dev/null +++ b/_quarto.yml @@ -0,0 +1,66 @@ +project: + type: website + output-dir: out/site + execute-dir: project + render: + - index.qmd + - docs/test.qmd + - docs/odi.qmd + - docs/t20i.qmd + - docs/methods.qmd + - docs/data.qmd + - docs/research.qmd + - docs/correctness.qmd + resources: + - out/release/elo/** + +website: + title: Outside Edge + description: Independent international cricket ratings, histories, and methods. + site-url: https://outside-edge.github.io/elo_cricket/ + repo-url: https://github.com/outside-edge/elo_cricket + navbar: + background: '#173744' + foreground: '#ffffff' + left: + - href: index.qmd + text: Overview + - text: Ratings + menu: + - href: docs/test.qmd + text: Test + - href: docs/odi.qmd + text: ODI + - href: docs/t20i.qmd + text: T20I + - href: docs/methods.qmd + text: Methods + - href: docs/data.qmd + text: Data + - href: docs/research.qmd + text: Research + right: + - icon: github + href: https://github.com/outside-edge/elo_cricket + aria-label: Source code on GitHub + page-footer: + left: Outside Edge · Independent of ICC rankings + right: + - href: docs/correctness.qmd + text: Correctness audit + - href: https://github.com/outside-edge/elo_cricket/issues + text: Report an issue + +format: + html: + theme: cosmo + css: docs/styles.css + toc: true + lang: en + +execute: + echo: false + warning: true + error: false + cache: false + freeze: false diff --git a/data/build/manifest.json b/data/build/manifest.json index 63b1e62..2b4c36a 100644 --- a/data/build/manifest.json +++ b/data/build/manifest.json @@ -2076,8 +2076,9 @@ "R/acquisition.R": "70a51080e845100a95fe9b96cdc70a5803a1f1ecc4b19872eafedd37a8abdf0e", "R/elo.R": "3bca27c1c77aa1f83d4b61ab5ac6b9e4b82ece4b31547806a4fdb2abaacf325e", "R/paths.R": "c267c8c657ffa7b4641f2d36e792d57fe50e95186ebb8ca1571e35855198cad1", - "R/pipeline.R": "72f5f88f8ca237ab7d4ba46b571a3cf618a50d9076ea0ccb82c930766bc127c0", - "renv.lock": "85f4824ac9844eeb077248a141de2d681998cd4d6a8bf5630ebf6633beeb3e2b", - "scripts/pipeline.R": "667412826aaf152f23a26f3d7bd2d45d94c97d13315dc171da7c90679c8d8b03" + "R/pipeline.R": "dd1612e1e4617529e25ffdac6314c48a21de7b1ad33c56cdaf03a2851aed442e", + "R/visualization.R": "971a73ad37b497a8b2f413d20eccc1963512f2224f66185bb31a4aaed092bee4", + "renv.lock": "58165c32219b20358c8ef580332c52dab840d7669df2b8ea5c9b8679b0cc4a3c", + "scripts/pipeline.R": "8875853301c18073af95add7841762f5491c0c6e80640f4b65527c51d02ba824" } } diff --git a/docs/_overview.qmd b/docs/_overview.qmd new file mode 100644 index 0000000..9b87e87 --- /dev/null +++ b/docs/_overview.qmd @@ -0,0 +1,47 @@ +```{r} +#| include: false +source("R/site.R") +publication <- read_publication("out/release/elo") +``` + +Independent ratings of men's international teams, with the match results, +methods, and history available to inspect. + +::: {.publication-date} +**Elo ratings through `r publication$manifest$analysis$as_of`.** +Updated weekly, with monthly history available to download. +::: + +```{r} +#| results: asis +cat('\n') +for (format in c("Test", "ODI", "T20I")) { + table <- head(site_ratings(publication, format), 5) + cat('\n') + cat(sprintf('%s\n', tolower(format), format)) + cat(knitr::kable(table[c("Rank", "Team", "Elo")], format = "html", escape = TRUE)) + cat(sprintf('All ratings and histories →\n', tolower(format))) + cat('\n') +} +cat('\n') +``` + +## Read the ratings + +A higher Elo rating means a stronger team under this model. Results update each +format separately; rating points should not be compared across formats. + +The format pages show recent trajectories, full histories by team, and all +currently active teams. Teams with fewer than +`r publication$manifest$analysis$specification$provisional_matches` rated matches are marked +provisional. These are baseline Elo estimates, without uncertainty intervals +or venue adjustments. + +[How the ratings work](docs/methods.qmd){.btn .btn-primary} +[Download the data](docs/data.qmd){.btn .btn-outline-primary} + +## Beyond Elo + +Elo is the first published model. Work on dynamic strength, uncertainty, +lineups, and venue context is described in the [research agenda](docs/research.qmd). +Each future model will have its own methods and results. diff --git a/docs/_ratings.qmd b/docs/_ratings.qmd new file mode 100644 index 0000000..6ccc9ab --- /dev/null +++ b/docs/_ratings.qmd @@ -0,0 +1,74 @@ +```{r} +#| include: false +source("R/site.R") +publication <- read_publication("out/release/elo") +format_name <- params$format +stem <- tolower(format_name) +``` + +**Elo ratings through `r publication$manifest$analysis$as_of`.** +Most recent recorded result: `r publication$manifest$analysis$last_result[[format_name]]`. + +## Recent history + +The current top ten active teams. Labels give the current rating. Steps show +end-of-day ratings after completed matches; flat sections carry ratings forward. +On narrow screens, scroll the charts sideways to see the complete view. + +::: {.chart-scroll role="region" aria-label="Recent ratings chart" tabindex="0"} + +```{r} +#| results: asis +cat(sprintf( + '{fig-alt="Recent %s ratings with team names and current ratings at line ends."}\n\n', + format_name, stem, format_name +)) +``` + +::: + +```{r} +#| results: asis +cat(sprintf('[Download SVG](../out/release/elo/%s.svg) · [Download PNG](../out/release/elo/%s.png)\n', stem, stem)) +``` + +## Full history by team + +Each panel uses the same axes within this format. Teams are selected and ordered +by their current rating, so these panels do not include every historical leader. + +::: {.chart-scroll role="region" aria-label="Full rating histories" tabindex="0"} + +```{r} +#| results: asis +cat(sprintf( + '{fig-alt="Full %s histories for the current top ten active teams, in separate panels with shared axes."}\n\n', + format_name, stem, format_name +)) +``` + +::: + +```{r} +#| results: asis +cat(sprintf('[Download SVG](../out/release/elo/%s_history.svg) · [Download PNG](../out/release/elo/%s_history.png)\n', stem, stem)) +``` + +## Current ratings + +Active teams have a rated match in the preceding +`r publication$manifest$analysis$specification$active_days` days. Provisional teams have +fewer than `r publication$manifest$analysis$specification$provisional_matches` rated matches. +Inactive teams remain in the downloadable data. + +::: {.ratings-table role="region" aria-label="Current ratings table" tabindex="0"} + +```{r} +#| results: asis +knitr::kable(site_ratings(publication, format_name), format = "html", escape = TRUE) +``` + +::: + +These deterministic Elo ratings have no uncertainty intervals. See the +[methods](methods.qmd) for assumptions and limitations, or [download the complete data](data.qmd). diff --git a/docs/correctness.qmd b/docs/correctness.qmd new file mode 100644 index 0000000..6e7875c --- /dev/null +++ b/docs/correctness.qmd @@ -0,0 +1,8 @@ +--- +title: Correctness audit +--- + +```{r} +#| results: asis +cat(readLines("docs/correctness.md")[-1], sep = "\n") +``` diff --git a/docs/data.qmd b/docs/data.qmd new file mode 100644 index 0000000..cb5fcf3 --- /dev/null +++ b/docs/data.qmd @@ -0,0 +1,50 @@ +--- +title: Data and downloads +--- + +```{r} +#| include: false +source("R/site.R") +publication <- read_publication("out/release/elo") +counts <- publication$manifest$source$match_counts +``` + +**Publication cutoff: `r publication$manifest$analysis$as_of`.** +All downloads below belong to this publication. + +| Download | Contents | +| --- | --- | +| [Current ratings](../out/release/elo/latest.csv) | Every rated team, with active/provisional flags, current rank, and last rated match | +| [Monthly history](../out/release/elo/monthly.csv) | Calendar-month-end ratings for each format and team | +| [Match updates](../out/release/elo/updates.csv) | Both teams' ratings before and after every rated match | +| [Publication metadata](../out/release/elo/manifest.json) | Model specification, source receipts, and file checksums | + +## Coverage + +```{r} +#| results: asis +coverage <- data.frame( + Format = names(counts), Matches = as.integer(unlist(counts)), + `Latest result` = unlist(publication$manifest$analysis$last_result[names(counts)]), check.names = FALSE +) +knitr::kable(coverage, format = "html", escape = TRUE, row.names = FALSE) +``` + +The match counts include no-results, which do not contribute rating updates. +The source is ESPNcricinfo's annual +[match-results tables](https://stats.espncricinfo.com/ci/engine/records/team/match_results.html?class=1;id=2025;type=year). +Collection starts in 1877 for Tests, 1971 for ODIs, and 2005 for T20Is. Coverage +is the set of matches listed there; it has not been independently certified as a census. + +## Using the files + +Join by stable team and match IDs, and keep formats separate. A missing current +rank indicates an inactive team. Month-end history excludes incomplete months; +use the current-ratings file for the latest cutoff. + +The files are regenerated together after successful checks. Earlier publications +remain available through the repository's +[publication history](https://github.com/outside-edge/elo_cricket/commits/main/out/release/elo). + +Charts can be downloaded as SVG or PNG from the [Test](test.qmd), [ODI](odi.qmd), +and [T20I](t20i.qmd) pages. See [methods](methods.qmd) for the rating definitions. diff --git a/docs/methods.qmd b/docs/methods.qmd new file mode 100644 index 0000000..e6aa6c6 --- /dev/null +++ b/docs/methods.qmd @@ -0,0 +1,71 @@ +--- +title: How the ratings work +--- + +```{r} +#| include: false +source("R/site.R") +publication <- read_publication("out/release/elo") +spec <- publication$manifest$analysis$specification +``` + +## The published model + +Elo updates a team's rating after a completed match, using the result and the +opponent's rating. Test, ODI, and T20I matches form separate rating pools. + +```{r} +#| results: asis +settings <- data.frame( + Setting = c("Initial rating", "K", "Expected score", "Ties", "No-result matches", "Update order"), + Value = c(spec$initial_rating, spec$k, spec$expectation, spec$ties, spec$no_result, spec$order) +) +knitr::kable(settings, format = "html", escape = TRUE) +``` + +Draws and ties count as half-results. A regulation tie resolved by a tiebreaker +is treated as a tie when the source records it that way. Abandoned, cancelled, +and no-result matches do not update either team's rating. + +The implementation is `r spec$implementation`, version `r spec$version`, from +the R package [EloRating](https://cran.r-project.org/package=EloRating). +The complete specification is included in the [publication metadata](../out/release/elo/manifest.json). + +## Dates and history + +Matches enter on their completion date. Same-day results use the deterministic +ordering shown above. Monthly downloads contain calendar-month-end snapshots; +the charts show end-of-day match updates, including the latest partial month. +Ratings carry forward between results. The charts do not smooth the estimates. + +Histories are reconstructed from the current saved source version. They do not +prove what could have been known from the source at an earlier date. Git history +records successive actual publications. + +## Which teams are ranked? + +Teams are active if they have played a rated match within `r spec$active_days` +days. Teams with fewer than `r spec$provisional_matches` rated matches are +provisional. Equal ratings share a competition rank. Inactive teams remain in the +CSV without a current rank. These are our display rules, independent of ICC rules. + +## What the ratings leave out + +This baseline has no venue or margin adjustment, inactivity decay, player-lineup +effects, or uncertainty intervals. A fixed K controls responsiveness to results; +the trajectory is an estimate under those choices, not directly observed ability. +Sparse schedules and weak connections between opponent groups can limit comparisons. + +We plan to compare richer models using chronological forecast evaluation. The +[research agenda](research.qmd) describes these choices, including the distinction +between live predictions and retrospective historical estimates. + +## Correctness and reproducibility + +Source responses are saved and checked before modeling. Published files are +verified against their recorded hashes before the website renders. The site +reads saved results and does not refit the model. + +The [correctness audit](correctness.qmd) documents the old outcome and timing +errors, the corrections, and the numerical validation. Code and tests are +available in the [repository](https://github.com/outside-edge/elo_cricket). diff --git a/docs/odi.qmd b/docs/odi.qmd new file mode 100644 index 0000000..12b612f --- /dev/null +++ b/docs/odi.qmd @@ -0,0 +1,7 @@ +--- +title: ODI ratings +params: + format: ODI +--- + +{{< include _ratings.qmd >}} diff --git a/docs/rating_models.md b/docs/rating_models.md new file mode 100644 index 0000000..f7d6c76 --- /dev/null +++ b/docs/rating_models.md @@ -0,0 +1,140 @@ +# What should a cricket rating estimate? + +The production Elo series is a reproducible baseline. The next models should +make different assumptions explicit and earn their place through prediction and +model checks. A smoother-looking curve alone is not evidence of a better model. + +## Three useful targets + +1. **An institution's current strength:** how a national side is expected to + perform under a specified reference schedule and playing conditions. Its + players, selection policy, coaching, and resources can change over time. +2. **A particular XI's match performance:** a prediction conditional on selected + players, opponent, venue, and information available at the prediction time. + This needs lineup and player data beyond the present results table. +3. **Retrospective historical strength:** what all subsequently observed matches + suggest about a side at an earlier date. This can revise history and should + be published separately from the ratings actually available at that date. + +Keep formats separate initially. A team's Test, ODI, and T20I selections and +skills differ. Partial pooling across formats is a later modeling decision. + +## Elo already makes modeling choices + +The current adapter starts teams at 1,000, uses a normal-CDF expectation, fixes +K at 100, and treats draws and ties as half-results. K determines how much a +result changes a rating. The curve's responsiveness is therefore a choice; +it is not a direct observation of underlying ability. The common logistic +Bradley–Terry likelihood is a different link from this normal-CDF baseline. + +The model has no explicit lineup, home, ground, or country effects. Its rating +mixes those influences with team strength. Calendar gaps leave the point rating +unchanged, and it provides no uncertainty distribution. Smaller K values may +reduce volatility but do not supply the missing context or uncertainty. + +## Model candidates + +| Candidate | What it adds | Main choices to resolve | +| --- | --- | --- | +| Elo baseline | Simple sequential updates and an auditable match ledger | Select K using past-only validation; assess sensitivity to the expectation link | +| Glickman-style dynamic model | Evolving strength and uncertainty | Calendar-time evolution, inactivity, context effects, and the specific observation model | +| TrueSkill-style model in Stan | Separate latent skill, match performance noise, and outcome thresholds | Team versus player latent variables, process variance, draw mechanism, and lineup aggregation | +| Paired-comparison GAM in mgcv | Penalized team trajectories and structured context effects | Shared team basis, identifiability, penalties, and a draw-aware likelihood | + +[TrueSkill](https://www.microsoft.com/en-us/research/wp-content/uploads/2006/01/TR-2006-80.pdf) +separates latent skill from noisy match performance and can aggregate players +into teams. A cricket extension could use an evolving country component plus +lineup contributions, with shrinkage to avoid assigning an entire result to +every player independently. Player identification depends on lineup variation +and the match network, not just on having an inference engine. + +For a GAM, the central predictor would contain the same team-strength function +evaluated for each opponent: `strength(A, time) - strength(B, time)`. mgcv supports +[weighted sums of shared smooth evaluations](https://stat.ethz.ch/R-manual/R-devel/library/mgcv/html/linear.functional.terms.html) +and [team-specific smooths](https://stat.ethz.ch/R-manual/R-devel/library/mgcv/html/factor.smooth.html). +Those are implementation ingredients, not a complete validated cricket model. +The precise Lewis reference remains to be identified before attributing a +particular specification to it. + +Match outcomes identify relative strength. Adding the same time-varying function +to every team's strength leaves paired comparisons unchanged, so the model needs +an explicit location constraint. Results alone cannot establish that all teams +became better across eras. A dynamic model should also specify how uncertainty +grows with elapsed calendar time, including long gaps without matches. + +## Context needs a symmetric interpretation + +For decisive outcomes, a proposed linear predictor is + +```text +strength(A, time) - strength(B, time) ++ home advantage(A, venue, time) - home advantage(B, venue, time) ++ suitability(A, conditions) - suitability(B, conditions) ++ signed toss / batting-order effects +``` + +Swapping A and B must reverse the directional predictor. A bare ground intercept +in an arbitrarily ordered team-1 win equation would favor whichever team happens +to be listed first. Ground effects can instead modify home or batting-order +advantages, team-specific suitability, scoring conditions, or draw propensity. +Country and ground effects also need hierarchical structure or constraints: +grounds are nested geographically and some teams rarely visit particular places. + +Test draws deserve an explicit outcome model. Rain, available playing time, and +conditions can produce a draw between unequally matched teams. Treating every +draw as evidence of equal ability is a substantive simplification. No-results +remain distinct from draws and ties. + +## Data work before fitting + +The sibling [fairly_random preparation](https://github.com/outside-edge/fairly_random/blob/master/scripts/01_prep.R) +joins grounds to country, continent, latitude, and longitude, and constructs +home status. It is a useful starting inventory. The ratings pipeline should +extend its canonical table with stable ground IDs and a documented venue-to- +country mapping, then join additional context by stable match ID. + +Audit the mappings and coverage rather than copying the old name-based join. +Distinguish neutral venues, overseas home fixtures, and unknown home status. +National-side names do not always equal geographic country names; West Indies +and England require explicit treatment. Preserve missing context as missing. +Check older team-ID namespaces before joining historical covariates. + +Record which information was available before the toss, after the toss, and +after play. These define different prediction tasks. Outcome-dependent fields +such as whether a rain adjustment was ultimately used cannot enter an ex-ante +forecast without modeling their availability or uncertainty. + +## Filtering, smoothing, and validation + +[TrueSkill Through Time](https://www.microsoft.com/en-us/research/wp-content/uploads/2008/01/NIPS2007_0931.pdf) +uses later evidence to revise earlier skill estimates. That is useful for a +retrospective history. A GAM fitted over the full time span can do the same. +For weekly ratings and forecast evaluation, fit only observations available at +the cutoff and retain those historical vintages. Later information must not +silently enter an earlier forecast. + +Compare models on rolling future-match holdouts, with hyperparameters selected +inside the training period. Report predictive log loss, Brier scores, and +calibration; use the full outcome distribution when modeling draws. Check +performance by format, home/away/neutral status, match frequency, and established +versus new teams. Examine weakly connected opponent groups before interpreting +cross-group ranks. Account for series-level dependence when comparing predictive +performance, and inspect posterior predictive checks for generative models. + +Publish model-specific strengths and uncertainty, plus predictions under a +common, declared reference context. Do not average incompatible rating scales +or choose a model because its trajectories are smoother. Retain Elo as a +benchmark even if a richer model becomes the main publication. + +## Visualizations + +The default comparison uses recent history, endpoint team names and current +ratings, and both color and line type. Full histories use one panel per team +with common axes. These views show current top-ten teams, not every historical +leader. Steps come from end-of-day match updates and carry forward to the cutoff. + +For future probabilistic models, use per-team strength curves with uncertainty +bands and ordered current-strength dot-and-interval plots. A selected-team +interactive comparison could complement the static publication. Keep the +displayed uncertainty tied to a defined model quantity; Elo's current +deterministic ratings do not justify invented confidence bands. diff --git a/docs/research.qmd b/docs/research.qmd new file mode 100644 index 0000000..a580d4d --- /dev/null +++ b/docs/research.qmd @@ -0,0 +1,11 @@ +--- +title: Research agenda +--- + +The models discussed here are proposals. Elo is currently the only verified +publication adapter. + +```{r} +#| results: asis +cat(readLines("docs/rating_models.md")[-1], sep = "\n") +``` diff --git a/docs/styles.css b/docs/styles.css new file mode 100644 index 0000000..77340af --- /dev/null +++ b/docs/styles.css @@ -0,0 +1,25 @@ +:root { + --edge-ink: #173744; + --edge-accent: #176c70; +} + +body { color: #243239; } +.navbar-brand { font-weight: 700; letter-spacing: .02em; } +h1, h2, h3 { color: var(--edge-ink); } +a { color: var(--edge-accent); } +.publication-date { border-left: 4px solid var(--edge-accent); padding: .7rem 1rem; background: #f0f6f5; margin: 1.5rem 0; } +.publication-date p { margin: 0; } +.format-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 1.2rem; margin: 2rem 0; } +.format-card { border: 1px solid #d4dfe0; border-radius: 6px; padding: 1.2rem; } +.format-card h2 { border: 0; margin-top: 0; padding-top: 0; } +.format-card table { width: 100%; font-size: .9rem; } +.format-card td, .format-card th { padding: .4rem .2rem; } +.format-card p { margin-bottom: 0; font-size: .9rem; } +figure img { width: 100%; height: auto; } +.chart-scroll { overflow-x: auto; } +.chart-scroll figure { min-width: 800px; } +.ratings-table { overflow-x: auto; } +.ratings-table td:last-child { white-space: nowrap; } +.btn-primary { background: var(--edge-accent); border-color: var(--edge-accent); } +.btn-outline-primary { color: var(--edge-accent); border-color: var(--edge-accent); } +@media (max-width: 900px) { .format-grid { grid-template-columns: 1fr; } } diff --git a/docs/t20i.qmd b/docs/t20i.qmd new file mode 100644 index 0000000..b2d1f9f --- /dev/null +++ b/docs/t20i.qmd @@ -0,0 +1,7 @@ +--- +title: T20I ratings +params: + format: T20I +--- + +{{< include _ratings.qmd >}} diff --git a/docs/test.qmd b/docs/test.qmd new file mode 100644 index 0000000..6aa98fc --- /dev/null +++ b/docs/test.qmd @@ -0,0 +1,7 @@ +--- +title: Test ratings +params: + format: Test +--- + +{{< include _ratings.qmd >}} diff --git a/figs/elo/manifest.json b/figs/elo/manifest.json index adf7b38..15147d8 100644 --- a/figs/elo/manifest.json +++ b/figs/elo/manifest.json @@ -1,16 +1,26 @@ { - "analysis_sha256": "6bf6d35a5e77cd9401fa0b9f7b86057f6b9220c44c811fe018b8f80cced232c2", + "analysis_sha256": "561af97fc8caf9c131b62de7fbe914864a4ae6cc2ae79f92895fce1403c45195", "code_sha256": { "R/acquisition.R": "70a51080e845100a95fe9b96cdc70a5803a1f1ecc4b19872eafedd37a8abdf0e", "R/elo.R": "3bca27c1c77aa1f83d4b61ab5ac6b9e4b82ece4b31547806a4fdb2abaacf325e", "R/paths.R": "c267c8c657ffa7b4641f2d36e792d57fe50e95186ebb8ca1571e35855198cad1", - "R/pipeline.R": "72f5f88f8ca237ab7d4ba46b571a3cf618a50d9076ea0ccb82c930766bc127c0", - "renv.lock": "85f4824ac9844eeb077248a141de2d681998cd4d6a8bf5630ebf6633beeb3e2b", - "scripts/pipeline.R": "667412826aaf152f23a26f3d7bd2d45d94c97d13315dc171da7c90679c8d8b03" + "R/pipeline.R": "dd1612e1e4617529e25ffdac6314c48a21de7b1ad33c56cdaf03a2851aed442e", + "R/visualization.R": "971a73ad37b497a8b2f413d20eccc1963512f2224f66185bb31a4aaed092bee4", + "renv.lock": "58165c32219b20358c8ef580332c52dab840d7669df2b8ea5c9b8679b0cc4a3c", + "scripts/pipeline.R": "8875853301c18073af95add7841762f5491c0c6e80640f4b65527c51d02ba824" }, "files": { - "odi.png": "fc17cbebad079ce089ba0aa9ad59bea67e9532e1d2a7154bf370b0b08ab60a37", - "t20i.png": "91f9c1bf289b7053c217e64ca4fb7ab20269d9d8f6996a2cac60c1607fb37b3f", - "test.png": "b22c14a5c6b125e8902c0e5612c69a7c329b3d685f1f8e9683327ba7f5f5a980" + "odi_history.png": "798a0eaa8a9e2a38efccfda958b6c51dd3d74f43dad5f536a84071e402f205f1", + "odi_history.svg": "92e23db6f1fd3617df43ab2782134aa56158c6dc881629c7e5a29451bba21b1c", + "odi.png": "699d04054efec0cca520b8be6ee727231448ff06e67a39b0c53c56a50c7ccd79", + "odi.svg": "41fbb664a1f4cc528cea0bc9f359922c2ad278a97183c262525831a6fa11dc0a", + "t20i_history.png": "2e2f14546f11f80184d669753768ff50e3133c914c7a6d0a1975fb769763ee6d", + "t20i_history.svg": "546b59d2d884e005263609a2a3b5a0a48793512cec4a24b804a7fe8049e8751a", + "t20i.png": "8752cf1914ed8939d263e4718e469f5eaa6407e09a2fae735e42af17b18255ed", + "t20i.svg": "0fc469f6b02a8911c28dd886a9b35e22407ebf35e0bffe363527afbbacf9af94", + "test_history.png": "b9b7a26ef8456b59a97183f5fe6d08b372b7cce3bd34b9526d781c3b0ec47e6a", + "test_history.svg": "fb1cff6f70badacf1cb02f9152ffef1c28edbf77a2d803a2ec5964dbbea8950c", + "test.png": "404e61eb3325ada6c8b114c9d5ba4ca3a344c3fc3301d19af1c27f8c9f8fecc9", + "test.svg": "702d2f68a3e9c76a497de4a3fbd020749e3a81cae7c852d7eca6c961700f232d" } } diff --git a/figs/elo/odi.png b/figs/elo/odi.png index 25b8578..5e45d19 100644 Binary files a/figs/elo/odi.png and b/figs/elo/odi.png differ diff --git a/figs/elo/odi.svg b/figs/elo/odi.svg new file mode 100644 index 0000000..ba25411 --- /dev/null +++ b/figs/elo/odi.svg @@ -0,0 +1,938 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/figs/elo/odi_history.png b/figs/elo/odi_history.png new file mode 100644 index 0000000..a7d2e55 Binary files /dev/null and b/figs/elo/odi_history.png differ diff --git a/figs/elo/odi_history.svg b/figs/elo/odi_history.svg new file mode 100644 index 0000000..a29008b --- /dev/null +++ b/figs/elo/odi_history.svg @@ -0,0 +1,1593 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/figs/elo/t20i.png b/figs/elo/t20i.png index 0d30898..9c881a4 100644 Binary files a/figs/elo/t20i.png and b/figs/elo/t20i.png differ diff --git a/figs/elo/t20i.svg b/figs/elo/t20i.svg new file mode 100644 index 0000000..db94e27 --- /dev/null +++ b/figs/elo/t20i.svg @@ -0,0 +1,943 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/figs/elo/t20i_history.png b/figs/elo/t20i_history.png new file mode 100644 index 0000000..7ecdd89 Binary files /dev/null and b/figs/elo/t20i_history.png differ diff --git a/figs/elo/t20i_history.svg b/figs/elo/t20i_history.svg new file mode 100644 index 0000000..c2062b9 --- /dev/null +++ b/figs/elo/t20i_history.svg @@ -0,0 +1,1493 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/figs/elo/test.png b/figs/elo/test.png index 7aa6b16..2490f83 100644 Binary files a/figs/elo/test.png and b/figs/elo/test.png differ diff --git a/figs/elo/test.svg b/figs/elo/test.svg new file mode 100644 index 0000000..82433f7 --- /dev/null +++ b/figs/elo/test.svg @@ -0,0 +1,942 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/figs/elo/test_history.png b/figs/elo/test_history.png new file mode 100644 index 0000000..752951a Binary files /dev/null and b/figs/elo/test_history.png differ diff --git a/figs/elo/test_history.svg b/figs/elo/test_history.svg new file mode 100644 index 0000000..a76c0d6 --- /dev/null +++ b/figs/elo/test_history.svg @@ -0,0 +1,1385 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/index.qmd b/index.qmd new file mode 100644 index 0000000..6248abc --- /dev/null +++ b/index.qmd @@ -0,0 +1,6 @@ +--- +title: International cricket ratings +toc: false +--- + +{{< include docs/_overview.qmd >}} diff --git a/out/analysis/elo/manifest.json b/out/analysis/elo/manifest.json index 921e047..5637b7c 100644 --- a/out/analysis/elo/manifest.json +++ b/out/analysis/elo/manifest.json @@ -27,9 +27,10 @@ "R/acquisition.R": "70a51080e845100a95fe9b96cdc70a5803a1f1ecc4b19872eafedd37a8abdf0e", "R/elo.R": "3bca27c1c77aa1f83d4b61ab5ac6b9e4b82ece4b31547806a4fdb2abaacf325e", "R/paths.R": "c267c8c657ffa7b4641f2d36e792d57fe50e95186ebb8ca1571e35855198cad1", - "R/pipeline.R": "72f5f88f8ca237ab7d4ba46b571a3cf618a50d9076ea0ccb82c930766bc127c0", - "renv.lock": "85f4824ac9844eeb077248a141de2d681998cd4d6a8bf5630ebf6633beeb3e2b", - "scripts/pipeline.R": "667412826aaf152f23a26f3d7bd2d45d94c97d13315dc171da7c90679c8d8b03" + "R/pipeline.R": "dd1612e1e4617529e25ffdac6314c48a21de7b1ad33c56cdaf03a2851aed442e", + "R/visualization.R": "971a73ad37b497a8b2f413d20eccc1963512f2224f66185bb31a4aaed092bee4", + "renv.lock": "58165c32219b20358c8ef580332c52dab840d7669df2b8ea5c9b8679b0cc4a3c", + "scripts/pipeline.R": "8875853301c18073af95add7841762f5491c0c6e80640f4b65527c51d02ba824" }, "files": { "latest.csv": "2c6ffdab5046a202dd66dbfc204e477360abeb7cee292eb74775b868ad059716", diff --git a/out/release/elo/index.md b/out/release/elo/index.md index 5807cc7..ba5a79b 100644 --- a/out/release/elo/index.md +++ b/out/release/elo/index.md @@ -10,6 +10,21 @@ Independent ratings of men's international teams. Results enter on their complet Most recent recorded result: 2026-10-24 + + +[Download recent-history SVG](odi.svg) + + +Full history by team + + + +[Download full-history SVG](odi_history.svg) + + + +### Current ratings + | Rank | Team | Rating | Rated matches | Last rated match | | ---: | --- | ---: | ---: | --- | | 1 | Pakistan | 1428 | 983 | 2026-10-20 | @@ -33,12 +48,25 @@ Most recent recorded result: 2026-10-24 | 19 | Canada | 719 | 114 | 2026-10-17 | | 20 | Oman | 611 | 76 | 2026-10-19 | - - ## T20I Most recent recorded result: 2026-10-24 + + +[Download recent-history SVG](t20i.svg) + + +Full history by team + + + +[Download full-history SVG](t20i_history.svg) + + + +### Current ratings + | Rank | Team | Rating | Rated matches | Last rated match | | ---: | --- | ---: | ---: | --- | | 1 | England | 1777 | 222 | 2026-09-19 | @@ -149,12 +177,25 @@ Most recent recorded result: 2026-10-24 | 106 | Serbia | 542 | 52 | 2026-07-14 | | 107 | Mongolia | 478 | 19 | 2026-10-14 | - - ## Test Most recent recorded result: 2026-10-22 + + +[Download recent-history SVG](test.svg) + + +Full history by team + + + +[Download full-history SVG](test_history.svg) + + + +### Current ratings + | Rank | Team | Rating | Rated matches | Last rated match | | ---: | --- | ---: | ---: | --- | | 1 | South Africa | 1324 | 481 | 2026-10-22 | @@ -169,5 +210,3 @@ Most recent recorded result: 2026-10-22 | 10 | Zimbabwe | 787 | 130 | 2026-06-30 | | 11 | Ireland | 761 | 13 | 2026-05-29 | | 12 | Afghanistan | 732 | 14 | 2026-10-13 | - - diff --git a/out/release/elo/manifest.json b/out/release/elo/manifest.json index b230b64..9a28ff2 100644 --- a/out/release/elo/manifest.json +++ b/out/release/elo/manifest.json @@ -28,9 +28,10 @@ "R/acquisition.R": "70a51080e845100a95fe9b96cdc70a5803a1f1ecc4b19872eafedd37a8abdf0e", "R/elo.R": "3bca27c1c77aa1f83d4b61ab5ac6b9e4b82ece4b31547806a4fdb2abaacf325e", "R/paths.R": "c267c8c657ffa7b4641f2d36e792d57fe50e95186ebb8ca1571e35855198cad1", - "R/pipeline.R": "72f5f88f8ca237ab7d4ba46b571a3cf618a50d9076ea0ccb82c930766bc127c0", - "renv.lock": "85f4824ac9844eeb077248a141de2d681998cd4d6a8bf5630ebf6633beeb3e2b", - "scripts/pipeline.R": "667412826aaf152f23a26f3d7bd2d45d94c97d13315dc171da7c90679c8d8b03" + "R/pipeline.R": "dd1612e1e4617529e25ffdac6314c48a21de7b1ad33c56cdaf03a2851aed442e", + "R/visualization.R": "971a73ad37b497a8b2f413d20eccc1963512f2224f66185bb31a4aaed092bee4", + "renv.lock": "58165c32219b20358c8ef580332c52dab840d7669df2b8ea5c9b8679b0cc4a3c", + "scripts/pipeline.R": "8875853301c18073af95add7841762f5491c0c6e80640f4b65527c51d02ba824" }, "files": { "latest.csv": "2c6ffdab5046a202dd66dbfc204e477360abeb7cee292eb74775b868ad059716", @@ -2116,42 +2117,63 @@ "R/acquisition.R": "70a51080e845100a95fe9b96cdc70a5803a1f1ecc4b19872eafedd37a8abdf0e", "R/elo.R": "3bca27c1c77aa1f83d4b61ab5ac6b9e4b82ece4b31547806a4fdb2abaacf325e", "R/paths.R": "c267c8c657ffa7b4641f2d36e792d57fe50e95186ebb8ca1571e35855198cad1", - "R/pipeline.R": "72f5f88f8ca237ab7d4ba46b571a3cf618a50d9076ea0ccb82c930766bc127c0", - "renv.lock": "85f4824ac9844eeb077248a141de2d681998cd4d6a8bf5630ebf6633beeb3e2b", - "scripts/pipeline.R": "667412826aaf152f23a26f3d7bd2d45d94c97d13315dc171da7c90679c8d8b03" + "R/pipeline.R": "dd1612e1e4617529e25ffdac6314c48a21de7b1ad33c56cdaf03a2851aed442e", + "R/visualization.R": "971a73ad37b497a8b2f413d20eccc1963512f2224f66185bb31a4aaed092bee4", + "renv.lock": "58165c32219b20358c8ef580332c52dab840d7669df2b8ea5c9b8679b0cc4a3c", + "scripts/pipeline.R": "8875853301c18073af95add7841762f5491c0c6e80640f4b65527c51d02ba824" } }, "visualization": { - "analysis_sha256": "6bf6d35a5e77cd9401fa0b9f7b86057f6b9220c44c811fe018b8f80cced232c2", + "analysis_sha256": "561af97fc8caf9c131b62de7fbe914864a4ae6cc2ae79f92895fce1403c45195", "code_sha256": { "R/acquisition.R": "70a51080e845100a95fe9b96cdc70a5803a1f1ecc4b19872eafedd37a8abdf0e", "R/elo.R": "3bca27c1c77aa1f83d4b61ab5ac6b9e4b82ece4b31547806a4fdb2abaacf325e", "R/paths.R": "c267c8c657ffa7b4641f2d36e792d57fe50e95186ebb8ca1571e35855198cad1", - "R/pipeline.R": "72f5f88f8ca237ab7d4ba46b571a3cf618a50d9076ea0ccb82c930766bc127c0", - "renv.lock": "85f4824ac9844eeb077248a141de2d681998cd4d6a8bf5630ebf6633beeb3e2b", - "scripts/pipeline.R": "667412826aaf152f23a26f3d7bd2d45d94c97d13315dc171da7c90679c8d8b03" + "R/pipeline.R": "dd1612e1e4617529e25ffdac6314c48a21de7b1ad33c56cdaf03a2851aed442e", + "R/visualization.R": "971a73ad37b497a8b2f413d20eccc1963512f2224f66185bb31a4aaed092bee4", + "renv.lock": "58165c32219b20358c8ef580332c52dab840d7669df2b8ea5c9b8679b0cc4a3c", + "scripts/pipeline.R": "8875853301c18073af95add7841762f5491c0c6e80640f4b65527c51d02ba824" }, "files": { - "odi.png": "fc17cbebad079ce089ba0aa9ad59bea67e9532e1d2a7154bf370b0b08ab60a37", - "t20i.png": "91f9c1bf289b7053c217e64ca4fb7ab20269d9d8f6996a2cac60c1607fb37b3f", - "test.png": "b22c14a5c6b125e8902c0e5612c69a7c329b3d685f1f8e9683327ba7f5f5a980" + "odi_history.png": "798a0eaa8a9e2a38efccfda958b6c51dd3d74f43dad5f536a84071e402f205f1", + "odi_history.svg": "92e23db6f1fd3617df43ab2782134aa56158c6dc881629c7e5a29451bba21b1c", + "odi.png": "699d04054efec0cca520b8be6ee727231448ff06e67a39b0c53c56a50c7ccd79", + "odi.svg": "41fbb664a1f4cc528cea0bc9f359922c2ad278a97183c262525831a6fa11dc0a", + "t20i_history.png": "2e2f14546f11f80184d669753768ff50e3133c914c7a6d0a1975fb769763ee6d", + "t20i_history.svg": "546b59d2d884e005263609a2a3b5a0a48793512cec4a24b804a7fe8049e8751a", + "t20i.png": "8752cf1914ed8939d263e4718e469f5eaa6407e09a2fae735e42af17b18255ed", + "t20i.svg": "0fc469f6b02a8911c28dd886a9b35e22407ebf35e0bffe363527afbbacf9af94", + "test_history.png": "b9b7a26ef8456b59a97183f5fe6d08b372b7cce3bd34b9526d781c3b0ec47e6a", + "test_history.svg": "fb1cff6f70badacf1cb02f9152ffef1c28edbf77a2d803a2ec5964dbbea8950c", + "test.png": "404e61eb3325ada6c8b114c9d5ba4ca3a344c3fc3301d19af1c27f8c9f8fecc9", + "test.svg": "702d2f68a3e9c76a497de4a3fbd020749e3a81cae7c852d7eca6c961700f232d" } }, "code_sha256": { "R/acquisition.R": "70a51080e845100a95fe9b96cdc70a5803a1f1ecc4b19872eafedd37a8abdf0e", "R/elo.R": "3bca27c1c77aa1f83d4b61ab5ac6b9e4b82ece4b31547806a4fdb2abaacf325e", "R/paths.R": "c267c8c657ffa7b4641f2d36e792d57fe50e95186ebb8ca1571e35855198cad1", - "R/pipeline.R": "72f5f88f8ca237ab7d4ba46b571a3cf618a50d9076ea0ccb82c930766bc127c0", - "renv.lock": "85f4824ac9844eeb077248a141de2d681998cd4d6a8bf5630ebf6633beeb3e2b", - "scripts/pipeline.R": "667412826aaf152f23a26f3d7bd2d45d94c97d13315dc171da7c90679c8d8b03" + "R/pipeline.R": "dd1612e1e4617529e25ffdac6314c48a21de7b1ad33c56cdaf03a2851aed442e", + "R/visualization.R": "971a73ad37b497a8b2f413d20eccc1963512f2224f66185bb31a4aaed092bee4", + "renv.lock": "58165c32219b20358c8ef580332c52dab840d7669df2b8ea5c9b8679b0cc4a3c", + "scripts/pipeline.R": "8875853301c18073af95add7841762f5491c0c6e80640f4b65527c51d02ba824" }, "files": { - "index.md": "1b93b5bafe62d6bef6c7f5b1beb16267ebda0830f5c5018bb6a624814a16ea82", + "index.md": "91e7c08c8e644428819863c1a793c0fa4d929ee7481cdc2a5c5b7eca638bd762", "latest.csv": "2c6ffdab5046a202dd66dbfc204e477360abeb7cee292eb74775b868ad059716", "monthly.csv": "5ce366d66a5d35e8efa49a60fd9ef099d8f600bb7794ad5f60a761790b60f964", - "odi.png": "fc17cbebad079ce089ba0aa9ad59bea67e9532e1d2a7154bf370b0b08ab60a37", - "t20i.png": "91f9c1bf289b7053c217e64ca4fb7ab20269d9d8f6996a2cac60c1607fb37b3f", - "test.png": "b22c14a5c6b125e8902c0e5612c69a7c329b3d685f1f8e9683327ba7f5f5a980", + "odi_history.png": "798a0eaa8a9e2a38efccfda958b6c51dd3d74f43dad5f536a84071e402f205f1", + "odi_history.svg": "92e23db6f1fd3617df43ab2782134aa56158c6dc881629c7e5a29451bba21b1c", + "odi.png": "699d04054efec0cca520b8be6ee727231448ff06e67a39b0c53c56a50c7ccd79", + "odi.svg": "41fbb664a1f4cc528cea0bc9f359922c2ad278a97183c262525831a6fa11dc0a", + "t20i_history.png": "2e2f14546f11f80184d669753768ff50e3133c914c7a6d0a1975fb769763ee6d", + "t20i_history.svg": "546b59d2d884e005263609a2a3b5a0a48793512cec4a24b804a7fe8049e8751a", + "t20i.png": "8752cf1914ed8939d263e4718e469f5eaa6407e09a2fae735e42af17b18255ed", + "t20i.svg": "0fc469f6b02a8911c28dd886a9b35e22407ebf35e0bffe363527afbbacf9af94", + "test_history.png": "b9b7a26ef8456b59a97183f5fe6d08b372b7cce3bd34b9526d781c3b0ec47e6a", + "test_history.svg": "fb1cff6f70badacf1cb02f9152ffef1c28edbf77a2d803a2ec5964dbbea8950c", + "test.png": "404e61eb3325ada6c8b114c9d5ba4ca3a344c3fc3301d19af1c27f8c9f8fecc9", + "test.svg": "702d2f68a3e9c76a497de4a3fbd020749e3a81cae7c852d7eca6c961700f232d", "updates.csv": "52e1bcd923f0f44a4f06bc02dde03c33237a91b4aa2a43f7407534c392175d2e" } } diff --git a/out/release/elo/odi.png b/out/release/elo/odi.png index 25b8578..5e45d19 100644 Binary files a/out/release/elo/odi.png and b/out/release/elo/odi.png differ diff --git a/out/release/elo/odi.svg b/out/release/elo/odi.svg new file mode 100644 index 0000000..ba25411 --- /dev/null +++ b/out/release/elo/odi.svg @@ -0,0 +1,938 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/out/release/elo/odi_history.png b/out/release/elo/odi_history.png new file mode 100644 index 0000000..a7d2e55 Binary files /dev/null and b/out/release/elo/odi_history.png differ diff --git a/out/release/elo/odi_history.svg b/out/release/elo/odi_history.svg new file mode 100644 index 0000000..a29008b --- /dev/null +++ b/out/release/elo/odi_history.svg @@ -0,0 +1,1593 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/out/release/elo/t20i.png b/out/release/elo/t20i.png index 0d30898..9c881a4 100644 Binary files a/out/release/elo/t20i.png and b/out/release/elo/t20i.png differ diff --git a/out/release/elo/t20i.svg b/out/release/elo/t20i.svg new file mode 100644 index 0000000..db94e27 --- /dev/null +++ b/out/release/elo/t20i.svg @@ -0,0 +1,943 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/out/release/elo/t20i_history.png b/out/release/elo/t20i_history.png new file mode 100644 index 0000000..7ecdd89 Binary files /dev/null and b/out/release/elo/t20i_history.png differ diff --git a/out/release/elo/t20i_history.svg b/out/release/elo/t20i_history.svg new file mode 100644 index 0000000..c2062b9 --- /dev/null +++ b/out/release/elo/t20i_history.svg @@ -0,0 +1,1493 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/out/release/elo/test.png b/out/release/elo/test.png index 7aa6b16..2490f83 100644 Binary files a/out/release/elo/test.png and b/out/release/elo/test.png differ diff --git a/out/release/elo/test.svg b/out/release/elo/test.svg new file mode 100644 index 0000000..82433f7 --- /dev/null +++ b/out/release/elo/test.svg @@ -0,0 +1,942 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/out/release/elo/test_history.png b/out/release/elo/test_history.png new file mode 100644 index 0000000..752951a Binary files /dev/null and b/out/release/elo/test_history.png differ diff --git a/out/release/elo/test_history.svg b/out/release/elo/test_history.svg new file mode 100644 index 0000000..a76c0d6 --- /dev/null +++ b/out/release/elo/test_history.svg @@ -0,0 +1,1385 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/renv.lock b/renv.lock index eadb00f..2098544 100644 --- a/renv.lock +++ b/renv.lock @@ -419,6 +419,27 @@ "Maintainer": "Jeroen Ooms ", "Repository": "CRAN" }, + "base64enc": { + "Package": "base64enc", + "Version": "0.1-6", + "Source": "Repository", + "Title": "Tools for 'base64' Encoding", + "Author": "Simon Urbanek [aut, cre, cph] (https://urbanek.nz, ORCID: )", + "Authors@R": "person(\"Simon\", \"Urbanek\", role=c(\"aut\",\"cre\",\"cph\"), email=\"Simon.Urbanek@r-project.org\", comment=c(\"https://urbanek.nz\", ORCID=\"0000-0003-2297-1732\"))", + "Maintainer": "Simon Urbanek ", + "Depends": [ + "R (>= 2.9.0)" + ], + "Enhances": [ + "png" + ], + "Description": "Tools for handling 'base64' encoding. It is more flexible than the orphaned 'base64' package.", + "License": "GPL-2 | GPL-3", + "URL": "https://www.rforge.net/base64enc", + "BugReports": "https://github.com/s-u/base64enc/issues", + "NeedsCompilation": "yes", + "Repository": "CRAN" + }, "bit": { "Package": "bit", "Version": "4.6.0", @@ -514,6 +535,93 @@ "Maintainer": "Gábor Csárdi ", "Repository": "CRAN" }, + "bslib": { + "Package": "bslib", + "Version": "0.12.0", + "Source": "Repository", + "Title": "Custom 'Bootstrap' 'Sass' Themes for 'shiny' and 'rmarkdown'", + "Authors@R": "c( person(\"Carson\", \"Sievert\", , \"carson@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Garrick\", \"Aden-Buie\", , \"garrick@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0002-7111-0077\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(, \"Bootstrap contributors\", role = \"ctb\", comment = \"Bootstrap library\"), person(, \"Twitter, Inc\", role = \"cph\", comment = \"Bootstrap library\"), person(\"Javi\", \"Aguilar\", role = c(\"ctb\", \"cph\"), comment = \"Bootstrap colorpicker library\"), person(\"Thomas\", \"Park\", role = c(\"ctb\", \"cph\"), comment = \"Bootswatch library\"), person(, \"PayPal\", role = c(\"ctb\", \"cph\"), comment = \"Bootstrap accessibility plugin\") )", + "Description": "Simplifies custom 'CSS' styling of both 'shiny' and 'rmarkdown' via 'Bootstrap' 'Sass'. Supports 'Bootstrap' 3, 4 and 5 as well as their various 'Bootswatch' themes. An interactive widget is also provided for previewing themes in real time.", + "License": "MIT + file LICENSE", + "URL": "https://rstudio.github.io/bslib/, https://github.com/rstudio/bslib", + "BugReports": "https://github.com/rstudio/bslib/issues", + "Depends": [ + "R (>= 2.10)" + ], + "Imports": [ + "base64enc", + "cachem", + "fastmap (>= 1.1.1)", + "grDevices", + "htmltools (>= 0.5.8)", + "jquerylib (>= 0.1.3)", + "jsonlite", + "lifecycle", + "memoise (>= 2.0.1)", + "mime", + "rlang", + "sass (>= 0.4.9)" + ], + "Suggests": [ + "brand.yml", + "bsicons", + "curl", + "fontawesome", + "future", + "ggplot2", + "knitr", + "lattice", + "magrittr", + "rappdirs", + "rmarkdown (>= 2.7)", + "shiny (>= 1.11.1.9000)", + "testthat", + "thematic", + "tools", + "utils", + "withr", + "yaml" + ], + "Config/Needs/deploy": "BH, chiflights22, colourpicker, commonmark, cpp11, cpsievert/chiflights22, cpsievert/histoslider, dplyr, DT, ggplot2, ggridges, gt, hexbin, histoslider, htmlwidgets, lattice, leaflet, lubridate, markdown, modelr, plotly, reactable, reshape2, rprojroot, rsconnect, rstudio/shiny, scales, styler, tibble", + "Config/Needs/routine": "chromote, desc, renv", + "Config/Needs/website": "brio, crosstalk, dplyr, DT, ggplot2, glue, htmlwidgets, leaflet, lorem, palmerpenguins, plotly, purrr, rprojroot, rstudio/htmltools, scales, stringr, tidyr, webshot2", + "Config/roxygen2/version": "8.0.0", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "true", + "Config/testthat/start-first": "zzzz-bs-sass, fonts, zzz-precompile, theme-*, rmd-*", + "Encoding": "UTF-8", + "Collate": "'accordion.R' 'breakpoints.R' 'bs-current-theme.R' 'bs-dependencies.R' 'bs-global.R' 'bs-remove.R' 'bs-theme-layers.R' 'bs-theme-preset-bootswatch.R' 'bs-theme-preset-brand.R' 'bs-theme-preset-builtin.R' 'bs-theme-preset.R' 'utils.R' 'bs-theme-preview.R' 'bs-theme-update.R' 'bs-theme.R' 'bslib-package.R' 'buttons.R' 'card.R' 'deprecated.R' 'files.R' 'fill.R' 'imports.R' 'input-code-editor.R' 'input-dark-mode.R' 'input-submit.R' 'input-switch.R' 'layout.R' 'nav-items.R' 'nav-update.R' 'navbar_options.R' 'navs-legacy.R' 'navs.R' 'offcanvas.R' 'onLoad.R' 'page.R' 'popover.R' 'precompiled.R' 'print.R' 'shiny-devmode.R' 'sidebar.R' 'staticimports.R' 'toast.R' 'toolbar.R' 'tooltip.R' 'utils-deps.R' 'utils-shiny.R' 'utils-tags.R' 'value-box.R' 'version-default.R' 'versions.R'", + "NeedsCompilation": "no", + "Author": "Carson Sievert [aut, cre] (ORCID: ), Joe Cheng [aut], Garrick Aden-Buie [aut] (ORCID: ), Posit Software, PBC [cph, fnd], Bootstrap contributors [ctb] (Bootstrap library), Twitter, Inc [cph] (Bootstrap library), Javi Aguilar [ctb, cph] (Bootstrap colorpicker library), Thomas Park [ctb, cph] (Bootswatch library), PayPal [ctb, cph] (Bootstrap accessibility plugin)", + "Maintainer": "Carson Sievert ", + "Repository": "CRAN" + }, + "cachem": { + "Package": "cachem", + "Version": "1.1.0", + "Source": "Repository", + "Title": "Cache R Objects with Automatic Pruning", + "Description": "Key-value stores with automatic pruning. Caches can limit either their total size or the age of the oldest object (or both), automatically pruning objects to maintain the constraints.", + "Authors@R": "c( person(\"Winston\", \"Chang\", , \"winston@posit.co\", c(\"aut\", \"cre\")), person(family = \"Posit Software, PBC\", role = c(\"cph\", \"fnd\")))", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "ByteCompile": "true", + "URL": "https://cachem.r-lib.org/, https://github.com/r-lib/cachem", + "Imports": [ + "rlang", + "fastmap (>= 1.2.0)" + ], + "Suggests": [ + "testthat" + ], + "RoxygenNote": "7.2.3", + "Config/Needs/routine": "lobstr", + "Config/Needs/website": "pkgdown", + "NeedsCompilation": "yes", + "Author": "Winston Chang [aut, cre], Posit Software, PBC [cph, fnd]", + "Maintainer": "Winston Chang ", + "Repository": "CRAN" + }, "callr": { "Package": "callr", "Version": "3.8.0", @@ -942,6 +1050,61 @@ "Maintainer": "Thomas Lin Pedersen ", "Repository": "CRAN" }, + "fastmap": { + "Package": "fastmap", + "Version": "1.2.0", + "Source": "Repository", + "Title": "Fast Data Structures", + "Authors@R": "c( person(\"Winston\", \"Chang\", email = \"winston@posit.co\", role = c(\"aut\", \"cre\")), person(given = \"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(given = \"Tessil\", role = \"cph\", comment = \"hopscotch_map library\") )", + "Description": "Fast implementation of data structures, including a key-value store, stack, and queue. Environments are commonly used as key-value stores in R, but every time a new key is used, it is added to R's global symbol table, causing a small amount of memory leakage. This can be problematic in cases where many different keys are used. Fastmap avoids this memory leak issue by implementing the map using data structures in C++.", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "RoxygenNote": "7.2.3", + "Suggests": [ + "testthat (>= 2.1.1)" + ], + "URL": "https://r-lib.github.io/fastmap/, https://github.com/r-lib/fastmap", + "BugReports": "https://github.com/r-lib/fastmap/issues", + "NeedsCompilation": "yes", + "Author": "Winston Chang [aut, cre], Posit Software, PBC [cph, fnd], Tessil [cph] (hopscotch_map library)", + "Maintainer": "Winston Chang ", + "Repository": "CRAN" + }, + "fontawesome": { + "Package": "fontawesome", + "Version": "0.5.3", + "Source": "Repository", + "Type": "Package", + "Title": "Easily Work with 'Font Awesome' Icons", + "Description": "Easily and flexibly insert 'Font Awesome' icons into 'R Markdown' documents and 'Shiny' apps. These icons can be inserted into HTML content through inline 'SVG' tags or 'i' tags. There is also a utility function for exporting 'Font Awesome' icons as 'PNG' images for those situations where raster graphics are needed.", + "Authors@R": "c( person(\"Richard\", \"Iannone\", , \"rich@posit.co\", c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-3925-190X\")), person(\"Christophe\", \"Dervieux\", , \"cderv@posit.co\", role = \"ctb\", comment = c(ORCID = \"0000-0003-4474-2498\")), person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = \"ctb\"), person(\"Dave\", \"Gandy\", role = c(\"ctb\", \"cph\"), comment = \"Font-Awesome font\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "License": "MIT + file LICENSE", + "URL": "https://github.com/rstudio/fontawesome, https://rstudio.github.io/fontawesome/", + "BugReports": "https://github.com/rstudio/fontawesome/issues", + "Encoding": "UTF-8", + "ByteCompile": "true", + "RoxygenNote": "7.3.2", + "Depends": [ + "R (>= 3.3.0)" + ], + "Imports": [ + "rlang (>= 1.0.6)", + "htmltools (>= 0.5.1.1)" + ], + "Suggests": [ + "covr", + "dplyr (>= 1.0.8)", + "gt (>= 0.9.0)", + "knitr (>= 1.31)", + "testthat (>= 3.0.0)", + "rsvg" + ], + "Config/testthat/edition": "3", + "NeedsCompilation": "no", + "Author": "Richard Iannone [aut, cre] (), Christophe Dervieux [ctb] (), Winston Chang [ctb], Dave Gandy [ctb, cph] (Font-Awesome font), Posit Software, PBC [cph, fnd]", + "Maintainer": "Richard Iannone ", + "Repository": "CRAN" + }, "fs": { "Package": "fs", "Version": "2.1.0", @@ -1057,6 +1220,59 @@ "Maintainer": "Thomas Lin Pedersen ", "Repository": "CRAN" }, + "ggrepel": { + "Package": "ggrepel", + "Version": "0.9.8", + "Source": "Repository", + "Authors@R": "c( person(\"Kamil\", \"Slowikowski\", email = \"kslowikowski@gmail.com\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-2843-6370\")), person(\"Teun\", \"van den Brand\", role = \"ctb\", comment = c(ORCID = \"0000-0002-9335-7468\")), person(\"Alicia\", \"Schep\", role = \"ctb\", comment = c(ORCID = \"0000-0002-3915-0618\")), person(\"Sean\", \"Hughes\", role = \"ctb\", comment = c(ORCID = \"0000-0002-9409-9405\")), person(\"Trung Kien\", \"Dang\", role = \"ctb\", comment = c(ORCID = \"0000-0001-7562-6495\")), person(\"Saulius\", \"Lukauskas\", role = \"ctb\"), person(\"Jean-Olivier\", \"Irisson\", role = \"ctb\", comment = c(ORCID = \"0000-0003-4920-3880\")), person(\"Zhian N\", \"Kamvar\", role = \"ctb\", comment = c(ORCID = \"0000-0003-1458-7108\")), person(\"Thompson\", \"Ryan\", role = \"ctb\", comment = c(ORCID = \"0000-0002-0450-8181\")), person(\"Dervieux\", \"Christophe\", role = \"ctb\", comment = c(ORCID = \"0000-0003-4474-2498\")), person(\"Yutani\", \"Hiroaki\", role = \"ctb\"), person(\"Pierre\", \"Gramme\", role = \"ctb\"), person(\"Amir Masoud\", \"Abdol\", role = \"ctb\"), person(\"Malcolm\", \"Barrett\", role = \"ctb\", comment = c(ORCID = \"0000-0003-0299-5825\")), person(\"Robrecht\", \"Cannoodt\", role = \"ctb\", comment = c(ORCID = \"0000-0003-3641-729X\")), person(\"Michał\", \"Krassowski\", role = \"ctb\", comment = c(ORCID = \"0000-0002-9638-7785\")), person(\"Michael\", \"Chirico\", role = \"ctb\", comment = c(ORCID = \"0000-0003-0787-087X\")), person(\"Pedro\", \"Aphalo\", role = \"ctb\", comment = c(ORCID = \"0000-0003-3385-972X\")), person(\"Francis\", \"Barton\", role = \"ctb\") )", + "Title": "Automatically Position Non-Overlapping Text Labels with 'ggplot2'", + "Description": "Provides text and label geoms for 'ggplot2' that help to avoid overlapping text labels. Labels repel away from each other and away from the data points.", + "Depends": [ + "R (>= 4.1.0)", + "ggplot2 (>= 3.5.2)" + ], + "Imports": [ + "grid", + "Rcpp", + "rlang (>= 1.1.6)", + "S7", + "scales (>= 1.4.0)", + "withr (>= 3.0.2)" + ], + "Suggests": [ + "knitr", + "rmarkdown", + "testthat", + "svglite", + "vdiffr", + "gridExtra", + "ggpp", + "patchwork", + "devtools", + "prettydoc", + "ggbeeswarm", + "dplyr", + "magrittr", + "readr", + "stringr", + "marquee", + "rsvg", + "sf" + ], + "VignetteBuilder": "knitr", + "License": "GPL-3 | file LICENSE", + "URL": "https://ggrepel.slowkow.com/, https://github.com/slowkow/ggrepel", + "BugReports": "https://github.com/slowkow/ggrepel/issues", + "RoxygenNote": "7.3.3", + "LinkingTo": [ + "Rcpp" + ], + "Encoding": "UTF-8", + "NeedsCompilation": "yes", + "Author": "Kamil Slowikowski [aut, cre] (ORCID: ), Teun van den Brand [ctb] (ORCID: ), Alicia Schep [ctb] (ORCID: ), Sean Hughes [ctb] (ORCID: ), Trung Kien Dang [ctb] (ORCID: ), Saulius Lukauskas [ctb], Jean-Olivier Irisson [ctb] (ORCID: ), Zhian N Kamvar [ctb] (ORCID: ), Thompson Ryan [ctb] (ORCID: ), Dervieux Christophe [ctb] (ORCID: ), Yutani Hiroaki [ctb], Pierre Gramme [ctb], Amir Masoud Abdol [ctb], Malcolm Barrett [ctb] (ORCID: ), Robrecht Cannoodt [ctb] (ORCID: ), Michał Krassowski [ctb] (ORCID: ), Michael Chirico [ctb] (ORCID: ), Pedro Aphalo [ctb] (ORCID: ), Francis Barton [ctb]", + "Maintainer": "Kamil Slowikowski ", + "Repository": "CRAN" + }, "glue": { "Package": "glue", "Version": "1.8.1", @@ -1202,6 +1418,49 @@ "Maintainer": "Kirill Müller ", "Repository": "CRAN" }, + "htmltools": { + "Package": "htmltools", + "Version": "0.5.9", + "Source": "Repository", + "Type": "Package", + "Title": "Tools for HTML", + "Authors@R": "c( person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Carson\", \"Sievert\", , \"carson@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Barret\", \"Schloerke\", , \"barret@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0001-9986-114X\")), person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0002-1576-2126\")), person(\"Yihui\", \"Xie\", , \"yihui@posit.co\", role = \"aut\"), person(\"Jeff\", \"Allen\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Tools for HTML generation and output.", + "License": "GPL (>= 2)", + "URL": "https://github.com/rstudio/htmltools, https://rstudio.github.io/htmltools/", + "BugReports": "https://github.com/rstudio/htmltools/issues", + "Depends": [ + "R (>= 2.14.1)" + ], + "Imports": [ + "base64enc", + "digest", + "fastmap (>= 1.1.0)", + "grDevices", + "rlang (>= 1.0.0)", + "utils" + ], + "Suggests": [ + "Cairo", + "markdown", + "ragg", + "shiny", + "testthat", + "withr" + ], + "Enhances": [ + "knitr" + ], + "Config/Needs/check": "knitr", + "Config/Needs/website": "rstudio/quillt, bench", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "Collate": "'colors.R' 'fill.R' 'html_dependency.R' 'html_escape.R' 'html_print.R' 'htmltools-package.R' 'images.R' 'known_tags.R' 'selector.R' 'staticimports.R' 'tag_query.R' 'utils.R' 'tags.R' 'template.R'", + "NeedsCompilation": "yes", + "Author": "Joe Cheng [aut], Carson Sievert [aut, cre] (ORCID: ), Barret Schloerke [aut] (ORCID: ), Winston Chang [aut] (ORCID: ), Yihui Xie [aut], Jeff Allen [aut], Posit Software, PBC [cph, fnd]", + "Maintainer": "Carson Sievert ", + "Repository": "CRAN" + }, "httr": { "Package": "httr", "Version": "1.4.8", @@ -1345,6 +1604,28 @@ "Maintainer": "Thomas Lin Pedersen ", "Repository": "CRAN" }, + "jquerylib": { + "Package": "jquerylib", + "Version": "0.1.4", + "Source": "Repository", + "Title": "Obtain 'jQuery' as an HTML Dependency Object", + "Authors@R": "c( person(\"Carson\", \"Sievert\", role = c(\"aut\", \"cre\"), email = \"carson@rstudio.com\", comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Joe\", \"Cheng\", role = \"aut\", email = \"joe@rstudio.com\"), person(family = \"RStudio\", role = \"cph\"), person(family = \"jQuery Foundation\", role = \"cph\", comment = \"jQuery library and jQuery UI library\"), person(family = \"jQuery contributors\", role = c(\"ctb\", \"cph\"), comment = \"jQuery library; authors listed in inst/lib/jquery-AUTHORS.txt\") )", + "Description": "Obtain any major version of 'jQuery' () and use it in any webpage generated by 'htmltools' (e.g. 'shiny', 'htmlwidgets', and 'rmarkdown'). Most R users don't need to use this package directly, but other R packages (e.g. 'shiny', 'rmarkdown', etc.) depend on this package to avoid bundling redundant copies of 'jQuery'.", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "Config/testthat/edition": "3", + "RoxygenNote": "7.0.2", + "Imports": [ + "htmltools" + ], + "Suggests": [ + "testthat" + ], + "NeedsCompilation": "no", + "Author": "Carson Sievert [aut, cre] (), Joe Cheng [aut], RStudio [cph], jQuery Foundation [cph] (jQuery library and jQuery UI library), jQuery contributors [ctb, cph] (jQuery library; authors listed in inst/lib/jquery-AUTHORS.txt)", + "Maintainer": "Carson Sievert ", + "Repository": "CRAN" + }, "jsonlite": { "Package": "jsonlite", "Version": "2.0.0", @@ -1623,6 +1904,36 @@ "Maintainer": "Lionel Henry ", "Repository": "CRAN" }, + "memoise": { + "Package": "memoise", + "Version": "2.0.1", + "Source": "Repository", + "Title": "'Memoisation' of Functions", + "Authors@R": "c(person(given = \"Hadley\", family = \"Wickham\", role = \"aut\", email = \"hadley@rstudio.com\"), person(given = \"Jim\", family = \"Hester\", role = \"aut\"), person(given = \"Winston\", family = \"Chang\", role = c(\"aut\", \"cre\"), email = \"winston@rstudio.com\"), person(given = \"Kirill\", family = \"Müller\", role = \"aut\", email = \"krlmlr+r@mailbox.org\"), person(given = \"Daniel\", family = \"Cook\", role = \"aut\", email = \"danielecook@gmail.com\"), person(given = \"Mark\", family = \"Edmondson\", role = \"ctb\", email = \"r@sunholo.com\"))", + "Description": "Cache the results of a function so that when you call it again with the same arguments it returns the previously computed value.", + "License": "MIT + file LICENSE", + "URL": "https://memoise.r-lib.org, https://github.com/r-lib/memoise", + "BugReports": "https://github.com/r-lib/memoise/issues", + "Imports": [ + "rlang (>= 0.4.10)", + "cachem" + ], + "Suggests": [ + "digest", + "aws.s3", + "covr", + "googleAuthR", + "googleCloudStorageR", + "httr", + "testthat" + ], + "Encoding": "UTF-8", + "RoxygenNote": "7.1.2", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut], Jim Hester [aut], Winston Chang [aut, cre], Kirill Müller [aut], Daniel Cook [aut], Mark Edmondson [ctb]", + "Maintainer": "Winston Chang ", + "Repository": "CRAN" + }, "mime": { "Package": "mime", "Version": "0.13", @@ -2122,6 +2433,37 @@ "Maintainer": "Hadley Wickham ", "Repository": "CRAN" }, + "rappdirs": { + "Package": "rappdirs", + "Version": "0.3.4", + "Source": "Repository", + "Type": "Package", + "Title": "Application Directories: Determine Where to Save Data, Caches, and Logs", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"trl\", \"cre\", \"cph\")), person(\"Sridhar\", \"Ratnakumar\", role = \"aut\"), person(\"Trent\", \"Mick\", role = \"aut\"), person(\"ActiveState\", role = \"cph\", comment = \"R/appdir.r, R/cache.r, R/data.r, R/log.r translated from appdirs\"), person(\"Eddy\", \"Petrisor\", role = \"ctb\"), person(\"Trevor\", \"Davis\", role = c(\"trl\", \"aut\"), comment = c(ORCID = \"0000-0001-6341-4639\")), person(\"Gabor\", \"Csardi\", role = \"ctb\"), person(\"Gregory\", \"Jefferis\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "An easy way to determine which directories on the users computer you should use to save data, caches and logs. A port of Python's 'Appdirs' () to R.", + "License": "MIT + file LICENSE", + "URL": "https://rappdirs.r-lib.org, https://github.com/r-lib/rappdirs", + "BugReports": "https://github.com/r-lib/rappdirs/issues", + "Depends": [ + "R (>= 4.1)" + ], + "Suggests": [ + "covr", + "roxygen2", + "testthat (>= 3.2.0)", + "withr" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/usethis/last-upkeep": "2025-05-05", + "Copyright": "Original python appdirs module copyright (c) 2010 ActiveState Software Inc. R port copyright Hadley Wickham, Posit, PBC. See file LICENSE for details.", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [trl, cre, cph], Sridhar Ratnakumar [aut], Trent Mick [aut], ActiveState [cph] (R/appdir.r, R/cache.r, R/data.r, R/log.r translated from appdirs), Eddy Petrisor [ctb], Trevor Davis [trl, aut] (ORCID: ), Gabor Csardi [ctb], Gregory Jefferis [ctb], Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" + }, "rbibutils": { "Package": "rbibutils", "Version": "2.4.1", @@ -2352,6 +2694,61 @@ "Maintainer": "Lionel Henry ", "Repository": "CRAN" }, + "rmarkdown": { + "Package": "rmarkdown", + "Version": "2.32", + "Source": "Repository", + "Type": "Package", + "Title": "Dynamic Documents for R", + "Authors@R": "c( person(\"JJ\", \"Allaire\", , \"jj@posit.co\", role = \"aut\"), person(\"Yihui\", \"Xie\", , \"xie@yihui.name\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-0645-5666\")), person(\"Christophe\", \"Dervieux\", , \"cderv@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-4474-2498\")), person(\"Jonathan\", \"McPherson\", , \"jonathan@posit.co\", role = \"aut\"), person(\"Javier\", \"Luraschi\", role = \"aut\"), person(\"Kevin\", \"Ushey\", , \"kevin@posit.co\", role = \"aut\"), person(\"Aron\", \"Atkins\", , \"aron@posit.co\", role = \"aut\"), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"), person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = \"aut\"), person(\"Richard\", \"Iannone\", , \"rich@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-3925-190X\")), person(\"Andrew\", \"Dunning\", role = \"ctb\", comment = c(ORCID = \"0000-0003-0464-5036\")), person(\"Atsushi\", \"Yasumoto\", role = c(\"ctb\", \"cph\"), comment = c(ORCID = \"0000-0002-8335-495X\", cph = \"Number sections Lua filter\")), person(\"Barret\", \"Schloerke\", role = \"ctb\"), person(\"Carson\", \"Sievert\", role = \"ctb\", comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Devon\", \"Ryan\", , \"dpryan79@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0002-8549-0971\")), person(\"Frederik\", \"Aust\", , \"frederik.aust@uni-koeln.de\", role = \"ctb\", comment = c(ORCID = \"0000-0003-4900-788X\")), person(\"Jeff\", \"Allen\", , \"jeff@posit.co\", role = \"ctb\"), person(\"JooYoung\", \"Seo\", role = \"ctb\", comment = c(ORCID = \"0000-0002-4064-6012\")), person(\"Malcolm\", \"Barrett\", role = \"ctb\"), person(\"Rob\", \"Hyndman\", , \"Rob.Hyndman@monash.edu\", role = \"ctb\"), person(\"Romain\", \"Lesur\", role = \"ctb\"), person(\"Roy\", \"Storey\", role = \"ctb\"), person(\"Ruben\", \"Arslan\", , \"ruben.arslan@uni-goettingen.de\", role = \"ctb\"), person(\"Sergio\", \"Oller\", role = \"ctb\"), person(given = \"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(, \"jQuery UI contributors\", role = c(\"ctb\", \"cph\"), comment = \"jQuery UI library; authors listed in inst/rmd/h/jqueryui/AUTHORS.txt\"), person(\"Mark\", \"Otto\", role = \"ctb\", comment = \"Bootstrap library\"), person(\"Jacob\", \"Thornton\", role = \"ctb\", comment = \"Bootstrap library\"), person(, \"Bootstrap contributors\", role = \"ctb\", comment = \"Bootstrap library\"), person(, \"Twitter, Inc\", role = \"cph\", comment = \"Bootstrap library\"), person(\"Alexander\", \"Farkas\", role = c(\"ctb\", \"cph\"), comment = \"html5shiv library\"), person(\"Scott\", \"Jehl\", role = c(\"ctb\", \"cph\"), comment = \"Respond.js library\"), person(\"Ivan\", \"Sagalaev\", role = c(\"ctb\", \"cph\"), comment = \"highlight.js library\"), person(\"Greg\", \"Franko\", role = c(\"ctb\", \"cph\"), comment = \"tocify library\"), person(\"John\", \"MacFarlane\", role = c(\"ctb\", \"cph\"), comment = \"Pandoc templates\"), person(, \"Google, Inc.\", role = c(\"ctb\", \"cph\"), comment = \"ioslides library\"), person(\"Dave\", \"Raggett\", role = \"ctb\", comment = \"slidy library\"), person(, \"W3C\", role = \"cph\", comment = \"slidy library\"), person(\"Dave\", \"Gandy\", role = c(\"ctb\", \"cph\"), comment = \"Font-Awesome\"), person(\"Ben\", \"Sperry\", role = \"ctb\", comment = \"Ionicons\"), person(, \"Drifty\", role = \"cph\", comment = \"Ionicons\"), person(\"Aidan\", \"Lister\", role = c(\"ctb\", \"cph\"), comment = \"jQuery StickyTabs\"), person(\"Benct Philip\", \"Jonsson\", role = c(\"ctb\", \"cph\"), comment = \"pagebreak Lua filter\"), person(\"Albert\", \"Krewinkel\", role = c(\"ctb\", \"cph\"), comment = \"pagebreak Lua filter\") )", + "Description": "Convert R Markdown documents into a variety of formats.", + "License": "MIT + file LICENSE", + "URL": "https://github.com/rstudio/rmarkdown, https://pkgs.rstudio.com/rmarkdown/", + "BugReports": "https://github.com/rstudio/rmarkdown/issues", + "Depends": [ + "R (>= 3.0)" + ], + "Imports": [ + "bslib (>= 0.2.5.1)", + "evaluate (>= 0.13)", + "fontawesome (>= 0.5.0)", + "htmltools (>= 0.5.1)", + "jquerylib", + "jsonlite", + "knitr (>= 1.50)", + "methods", + "tinytex (>= 0.31)", + "tools", + "utils", + "xfun (>= 0.36)", + "yaml (>= 2.1.19)" + ], + "Suggests": [ + "digest", + "dygraphs", + "fs", + "rsconnect", + "downlit (>= 0.4.0)", + "katex (>= 1.4.0)", + "sass (>= 0.4.0)", + "shiny (>= 1.6.0)", + "testthat (>= 3.0.3)", + "tibble", + "vctrs", + "cleanrmd", + "withr (>= 2.4.2)", + "xml2" + ], + "VignetteBuilder": "knitr", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "SystemRequirements": "pandoc (>= 2.8) - http://pandoc.org", + "Config/roxygen2/version": "8.1.0", + "NeedsCompilation": "no", + "Author": "JJ Allaire [aut], Yihui Xie [aut, cre] (ORCID: ), Christophe Dervieux [aut] (ORCID: ), Jonathan McPherson [aut], Javier Luraschi [aut], Kevin Ushey [aut], Aron Atkins [aut], Hadley Wickham [aut], Joe Cheng [aut], Winston Chang [aut], Richard Iannone [aut] (ORCID: ), Andrew Dunning [ctb] (ORCID: ), Atsushi Yasumoto [ctb, cph] (ORCID: , cph: Number sections Lua filter), Barret Schloerke [ctb], Carson Sievert [ctb] (ORCID: ), Devon Ryan [ctb] (ORCID: ), Frederik Aust [ctb] (ORCID: ), Jeff Allen [ctb], JooYoung Seo [ctb] (ORCID: ), Malcolm Barrett [ctb], Rob Hyndman [ctb], Romain Lesur [ctb], Roy Storey [ctb], Ruben Arslan [ctb], Sergio Oller [ctb], Posit Software, PBC [cph, fnd], jQuery UI contributors [ctb, cph] (jQuery UI library; authors listed in inst/rmd/h/jqueryui/AUTHORS.txt), Mark Otto [ctb] (Bootstrap library), Jacob Thornton [ctb] (Bootstrap library), Bootstrap contributors [ctb] (Bootstrap library), Twitter, Inc [cph] (Bootstrap library), Alexander Farkas [ctb, cph] (html5shiv library), Scott Jehl [ctb, cph] (Respond.js library), Ivan Sagalaev [ctb, cph] (highlight.js library), Greg Franko [ctb, cph] (tocify library), John MacFarlane [ctb, cph] (Pandoc templates), Google, Inc. [ctb, cph] (ioslides library), Dave Raggett [ctb] (slidy library), W3C [cph] (slidy library), Dave Gandy [ctb, cph] (Font-Awesome), Ben Sperry [ctb] (Ionicons), Drifty [cph] (Ionicons), Aidan Lister [ctb, cph] (jQuery StickyTabs), Benct Philip Jonsson [ctb, cph] (pagebreak Lua filter), Albert Krewinkel [ctb, cph] (pagebreak Lua filter)", + "Maintainer": "Yihui Xie ", + "Repository": "CRAN" + }, "rprojroot": { "Package": "rprojroot", "Version": "2.1.1", @@ -2437,6 +2834,42 @@ "Maintainer": "Hadley Wickham ", "Repository": "CRAN" }, + "sass": { + "Package": "sass", + "Version": "0.4.10", + "Source": "Repository", + "Type": "Package", + "Title": "Syntactically Awesome Style Sheets ('Sass')", + "Description": "An 'SCSS' compiler, powered by the 'LibSass' library. With this, R developers can use variables, inheritance, and functions to generate dynamic style sheets. The package uses the 'Sass CSS' extension language, which is stable, powerful, and CSS compatible.", + "Authors@R": "c( person(\"Joe\", \"Cheng\", , \"joe@rstudio.com\", \"aut\"), person(\"Timothy\", \"Mastny\", , \"tim.mastny@gmail.com\", \"aut\"), person(\"Richard\", \"Iannone\", , \"rich@rstudio.com\", \"aut\", comment = c(ORCID = \"0000-0003-3925-190X\")), person(\"Barret\", \"Schloerke\", , \"barret@rstudio.com\", \"aut\", comment = c(ORCID = \"0000-0001-9986-114X\")), person(\"Carson\", \"Sievert\", , \"carson@rstudio.com\", c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Christophe\", \"Dervieux\", , \"cderv@rstudio.com\", c(\"ctb\"), comment = c(ORCID = \"0000-0003-4474-2498\")), person(family = \"RStudio\", role = c(\"cph\", \"fnd\")), person(family = \"Sass Open Source Foundation\", role = c(\"ctb\", \"cph\"), comment = \"LibSass library\"), person(\"Greter\", \"Marcel\", role = c(\"ctb\", \"cph\"), comment = \"LibSass library\"), person(\"Mifsud\", \"Michael\", role = c(\"ctb\", \"cph\"), comment = \"LibSass library\"), person(\"Hampton\", \"Catlin\", role = c(\"ctb\", \"cph\"), comment = \"LibSass library\"), person(\"Natalie\", \"Weizenbaum\", role = c(\"ctb\", \"cph\"), comment = \"LibSass library\"), person(\"Chris\", \"Eppstein\", role = c(\"ctb\", \"cph\"), comment = \"LibSass library\"), person(\"Adams\", \"Joseph\", role = c(\"ctb\", \"cph\"), comment = \"json.cpp\"), person(\"Trifunovic\", \"Nemanja\", role = c(\"ctb\", \"cph\"), comment = \"utf8.h\") )", + "License": "MIT + file LICENSE", + "URL": "https://rstudio.github.io/sass/, https://github.com/rstudio/sass", + "BugReports": "https://github.com/rstudio/sass/issues", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "SystemRequirements": "GNU make", + "Imports": [ + "fs (>= 1.2.4)", + "rlang (>= 0.4.10)", + "htmltools (>= 0.5.1)", + "R6", + "rappdirs" + ], + "Suggests": [ + "testthat", + "knitr", + "rmarkdown", + "withr", + "shiny", + "curl" + ], + "VignetteBuilder": "knitr", + "Config/testthat/edition": "3", + "NeedsCompilation": "yes", + "Author": "Joe Cheng [aut], Timothy Mastny [aut], Richard Iannone [aut] (), Barret Schloerke [aut] (), Carson Sievert [aut, cre] (), Christophe Dervieux [ctb] (), RStudio [cph, fnd], Sass Open Source Foundation [ctb, cph] (LibSass library), Greter Marcel [ctb, cph] (LibSass library), Mifsud Michael [ctb, cph] (LibSass library), Hampton Catlin [ctb, cph] (LibSass library), Natalie Weizenbaum [ctb, cph] (LibSass library), Chris Eppstein [ctb, cph] (LibSass library), Adams Joseph [ctb, cph] (json.cpp), Trifunovic Nemanja [ctb, cph] (utf8.h)", + "Maintainer": "Carson Sievert ", + "Repository": "CRAN" + }, "scales": { "Package": "scales", "Version": "1.4.0", @@ -2815,6 +3248,31 @@ "Maintainer": "Lionel Henry ", "Repository": "CRAN" }, + "tinytex": { + "Package": "tinytex", + "Version": "0.61", + "Source": "Repository", + "Type": "Package", + "Title": "Helper Functions to Install and Maintain TeX Live, and Compile LaTeX Documents", + "Authors@R": "c( person(\"Yihui\", \"Xie\", role = c(\"aut\", \"cre\", \"cph\"), email = \"xie@yihui.name\", comment = c(ORCID = \"0000-0003-0645-5666\")), person(given = \"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(\"Christophe\", \"Dervieux\", role = \"ctb\", comment = c(ORCID = \"0000-0003-4474-2498\")), person(\"Devon\", \"Ryan\", role = \"ctb\", email = \"dpryan79@gmail.com\", comment = c(ORCID = \"0000-0002-8549-0971\")), person(\"Ethan\", \"Heinzen\", role = \"ctb\"), person(\"Fernando\", \"Cagua\", role = \"ctb\"), person() )", + "Description": "Helper functions to install and maintain the 'LaTeX' distribution named 'TinyTeX' (), a lightweight, cross-platform, portable, and easy-to-maintain version of 'TeX Live'. This package also contains helper functions to compile 'LaTeX' documents, and install missing 'LaTeX' packages automatically.", + "Imports": [ + "xfun (>= 0.48)" + ], + "Suggests": [ + "testit", + "rstudioapi" + ], + "License": "MIT + file LICENSE", + "URL": "https://github.com/rstudio/tinytex", + "BugReports": "https://github.com/rstudio/tinytex/issues", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Yihui Xie [aut, cre, cph] (ORCID: ), Posit Software, PBC [cph, fnd], Christophe Dervieux [ctb] (ORCID: ), Devon Ryan [ctb] (ORCID: ), Ethan Heinzen [ctb], Fernando Cagua [ctb]", + "Maintainer": "Yihui Xie ", + "Repository": "CRAN" + }, "tzdb": { "Package": "tzdb", "Version": "0.5.0", diff --git a/scripts/check.R b/scripts/check.R index 62ba6c9..f31ccdf 100644 --- a/scripts/check.R +++ b/scripts/check.R @@ -1,11 +1,12 @@ source("R/paths.R") source("R/acquisition.R") source("R/elo.R") +source("R/visualization.R") source("R/pipeline.R") files <- c( list.files("R", pattern = "\\.R$", full.names = TRUE), list.files("tests/testthat", pattern = "\\.R$", full.names = TRUE), - "scripts/pipeline.R", "scripts/prepare_matches.R", "scripts/check.R" + "scripts/pipeline.R", "scripts/prepare_matches.R", "scripts/check.R", "scripts/check_site.R" ) lints <- unlist(lapply(files, lintr::lint), recursive = FALSE) if (length(lints)) { diff --git a/scripts/check_site.R b/scripts/check_site.R new file mode 100644 index 0000000..a608773 --- /dev/null +++ b/scripts/check_site.R @@ -0,0 +1,6 @@ +source("R/site.R") +pages <- check_site("out/site") +publication <- read_publication("out/site/out/release/elo") +original <- read_publication("out/release/elo") +stopifnot(identical(publication$manifest, original$manifest)) +cat("Validated", pages, "pages and publication downloads through", publication$manifest$analysis$as_of, "\n") diff --git a/scripts/pipeline.R b/scripts/pipeline.R index 2891d4c..f261f10 100644 --- a/scripts/pipeline.R +++ b/scripts/pipeline.R @@ -16,6 +16,7 @@ if (is.na(as_of) || as_of >= today) stop("Cutoff must be a completed UTC calenda source("R/paths.R") source("R/acquisition.R") source("R/elo.R") +source("R/visualization.R") source("R/pipeline.R") if (command %in% c("fetch", "update")) fetch_sources(pipeline_paths$raw, as_of, refresh) if (command %in% c("prepare", "update")) { diff --git a/tests/testthat/helper-pipeline.R b/tests/testthat/helper-pipeline.R index c6a6c3d..db92145 100644 --- a/tests/testthat/helper-pipeline.R +++ b/tests/testthat/helper-pipeline.R @@ -1,7 +1,9 @@ root <- normalizePath("../..") source(file.path(root, "R/acquisition.R")) source(file.path(root, "R/elo.R")) +source(file.path(root, "R/visualization.R")) source(file.path(root, "R/pipeline.R")) +source(file.path(root, "R/site.R")) source(file.path(root, "scripts/prepare_matches.R")) fixture <- function(name) file.path(root, "tests/fixtures", name) fixture_matches <- function() { diff --git a/tests/testthat/test-pipeline.R b/tests/testthat/test-pipeline.R index ebe0bf2..9b8f78a 100644 --- a/tests/testthat/test-pipeline.R +++ b/tests/testthat/test-pipeline.R @@ -13,12 +13,16 @@ testthat::test_that("offline stages produce a coherent publication and reject ch visualize_data(analysis, figures) publish_data(prepared, analysis, figures, publication, require_fresh = FALSE) manifest <- jsonlite::read_json(file.path(publication, "manifest.json")) + published <- read_publication(publication) + testthat::expect_identical(published$manifest, manifest) + testthat::expect_equal(nrow(site_ratings(published, "Test")), 12) + testthat::expect_error(site_ratings(published, "ODI"), "Missing publication format") for (name in names(manifest$files)) { testthat::expect_identical(sha256(file.path(publication, name)), manifest$files[[name]]) } testthat::expect_equal(nrow(read_analysis(analysis)$latest), 100) data <- read_analysis(analysis) - test_history <- chart_data(data$latest, data$monthly, "Test") + test_history <- chart_data(data$latest, data$updates, "Test") testthat::expect_identical(unique(test_history$format), "Test") testthat::expect_false("Austria" %in% test_history$team) report <- readLines(file.path(publication, "index.md")) @@ -51,6 +55,8 @@ testthat::test_that("offline stages produce a coherent publication and reject ch testthat::expect_identical(sha256(file.path(publication, "latest.csv")), before) writeLines("changed", file.path(prepared, "matches.csv")) testthat::expect_error(analyze_data(prepared, analysis), "checksum") + writeLines("changed", file.path(publication, "latest.csv")) + testthat::expect_error(read_publication(publication), "checksum") }) testthat::test_that("failed stages cannot replace their previous outputs", { diff --git a/tests/testthat/test-site.R b/tests/testthat/test-site.R new file mode 100644 index 0000000..5cd8ce6 --- /dev/null +++ b/tests/testthat/test-site.R @@ -0,0 +1,18 @@ +testthat::test_that("site checks resolve project URLs and reject missing or escaping assets", { + directory <- withr::local_tempdir() + dir.create(file.path(directory, "docs")) + writeLines('Ratings', file.path(directory, "index.html")) + testthat::expect_error(check_site(directory), "Broken site link") + page <- file.path(directory, "docs/ratings.html") + writeLines('Home', page) + testthat::expect_error(check_site(directory), "chart.svg") + writeLines("", file.path(directory, "chart.svg")) + testthat::expect_equal(check_site(directory), 2) + writeLines('Wrong base', page) + testthat::expect_error(check_site(directory), "outside site base path") + outside <- tempfile(tmpdir = dirname(directory), fileext = ".html") + withr::defer(unlink(outside)) + writeLines("outside", outside) + writeLines(sprintf('Outside', basename(outside)), page) + testthat::expect_error(check_site(directory), "escapes site") +}) diff --git a/tests/testthat/test-visualization.R b/tests/testthat/test-visualization.R new file mode 100644 index 0000000..abf39ad --- /dev/null +++ b/tests/testthat/test-visualization.R @@ -0,0 +1,36 @@ +testthat::test_that("chart endpoints equal published ratings and window starts carry past ratings", { + matches <- subset(fixture_matches(), format == "Test") + result <- calculate_elo(matches, as.Date("2025-12-31")) + teams <- chart_teams(result$latest, "Test") + start <- as.Date("2025-06-30") + history <- chart_data(result$latest, result$updates, "Test", start) + ends <- history[!duplicated(history$team_id, fromLast = TRUE), ] + testthat::expect_equal(ends$rating, teams$rating[match(ends$team_id, teams$team_id)]) + testthat::expect_true(all(ends$date == as.Date("2025-12-31"))) + testthat::expect_equal(anyDuplicated(history[c("team_id", "date")]), 0L) + testthat::expect_true(all(history$date >= start)) + baseline <- history[history$date == start, ] + expected <- elo_snapshot(result$models$Test, start) + testthat::expect_equal(baseline$rating, expected$rating[match(baseline$team_id, expected$team_id)]) +}) + +testthat::test_that("plots preserve same-day update order and do not backdate new teams", { + matches <- subset(fixture_matches(), format == "Test")[1:3, ] + matches$match_id <- 1:3 + matches$start_date <- matches$end_date <- as.Date(c("2025-01-01", "2025-01-01", "2025-03-01")) + matches$team1_id <- c(1L, 2L, 3L) + matches$team2_id <- c(2L, 1L, 1L) + matches$team1 <- c("A", "B", "New team") + matches$team2 <- c("B", "A", "A") + matches$score <- 1 + result <- calculate_elo(matches, as.Date("2025-04-01")) + history <- chart_data(result$latest, result$updates, "Test") + first <- history[history$date == as.Date("2025-01-01"), ] + testthat::expect_equal(first$rating[first$team_id == 1L], 986) + testthat::expect_equal(first$rating[first$team_id == 2L], 1014) + cropped <- chart_data(result$latest, result$updates, "Test", as.Date("2025-02-01")) + testthat::expect_equal(min(cropped$date[cropped$team_id == 3L]), as.Date("2025-03-01")) + testthat::expect_equal(anyDuplicated(cropped[c("team_id", "date")]), 0L) + early <- chart_data(result$latest, result$updates, "Test", as.Date("2024-01-01")) + testthat::expect_equal(min(early$date), as.Date("2025-01-01")) +})
All ratings and histories →