{
  "_id": "6ac95abbde46216d5edda787",
  "Package": "toolero",
  "Title": "A Toolkit for Research Workflows",
  "Version": "0.6.0",
  "Authors@R": "person(\"Erwin\", \"Lares\", , \"erwin.lares@wisc.edu\", role = c(\"aut\", \"cre\"),\ncomment = c(ORCID = \"0000-0002-3284-828X\"))",
  "Description": "Provides utility functions to help researchers implement\nbest practices for their coding projects. Includes tools for\nreading and cleaning data files, initializing R projects with a\nstandard folder structure and optional YAML configuration,\nrecording the resolved structure in a project configuration\nfile that downstream tools can read, recording the outputs an\nanalysis produces and the commit that produced them, creating\n'Quarto' documents from reproducible templates with optional\nsample data and custom styling, detecting the execution context\nacross interactive, 'Quarto', and script-based workflows,\nsplitting data frames into group-level output files, applying\nanalysis functions to each group with optional parallel\nexecution, and rendering syntactic tree diagrams as standalone\nPNG images via 'Typst'.",
  "License": "MIT + file LICENSE",
  "Encoding": "UTF-8",
  "Language": "en-US",
  "Roxygen": "list(markdown = TRUE)",
  "Config/testthat/edition": "3",
  "URL": "https://github.com/erwinlares/toolero,\nhttps://erwinlares.github.io/toolero/",
  "BugReports": "https://github.com/erwinlares/toolero/issues",
  "VignetteBuilder": "knitr",
  "Config/roxygen2/version": "8.0.0",
  "Config/pak/sysreqs": "cmake git make libgit2-dev libicu-dev libuv1-dev\nlibxml2-dev libssl-dev libx11-dev",
  "Repository": "https://erwinlares.r-universe.dev",
  "Date/Publication": "2026-10-09 18:03:56 UTC",
  "RemoteUrl": "https://github.com/erwinlares/toolero",
  "RemoteRef": "HEAD",
  "RemoteSha": "36d604d95a8047cb8a4806b96f7c15450b22ece6",
  "NeedsCompilation": "no",
  "Packaged": {
    "Date": "2026-10-09 21:13:32 UTC",
    "User": "root"
  },
  "Author": "Erwin Lares [aut, cre] (ORCID: <https://orcid.org/0000-0002-3284-828X>)",
  "Maintainer": "Erwin Lares <erwin.lares@wisc.edu>",
  "_user": "erwinlares",
  "_type": "src",
  "_file": "toolero_0.6.0.tar.gz",
  "_fileid": "https://r2.ropensci.org/a4c012f3bbe390b4f3b1d41be449959745a50f7bd34954a7f786ac56a165e5a2",
  "_filesize": 5324020,
  "_sha256": "a4c012f3bbe390b4f3b1d41be449959745a50f7bd34954a7f786ac56a165e5a2",
  "_expires": "2027-01-17T21:20:57.000Z",
  "_created": "2026-10-09T21:13:32.000Z",
  "_published": "2026-10-09T21:20:59.727Z",
  "_buildurl": "https://github.com/r-universe/erwinlares/actions/runs/37991671138",
  "_status": "success",
  "_host": "GitHub-Actions",
  "_jobs": [
    {
      "job": 114028862099,
      "time": 156,
      "config": "linux-devel-x86_64",
      "r": "4.7.0",
      "check": "OK",
      "artifact": "11645428191"
    },
    {
      "job": 114028862062,
      "time": 198,
      "config": "linux-release-x86_64",
      "r": "4.6.1",
      "check": "OK",
      "artifact": "11646020963"
    },
    {
      "job": 114028862047,
      "time": 153,
      "config": "macos-oldrel-arm64",
      "r": "4.5.3",
      "check": "OK",
      "artifact": "11646230324"
    },
    {
      "job": 114028862002,
      "time": 133,
      "config": "macos-release-arm64",
      "r": "4.6.1",
      "check": "OK",
      "artifact": "11645568487"
    },
    {
      "job": 114027274346,
      "time": 259,
      "config": "source",
      "r": "4.6.1",
      "check": "OK",
      "artifact": "11645985470"
    },
    {
      "job": 114028862199,
      "time": 108,
      "config": "wasm-release",
      "r": "4.6.0",
      "check": "OK",
      "artifact": "11645915787"
    },
    {
      "job": 114028862189,
      "time": 179,
      "config": "windows-devel-x86_64",
      "r": "4.7.0",
      "check": "OK",
      "artifact": "11645557959"
    },
    {
      "job": 114028862078,
      "time": 167,
      "config": "windows-oldrel-x86_64",
      "r": "4.5.3",
      "check": "OK",
      "artifact": "11645253654"
    },
    {
      "job": 114028862143,
      "time": 153,
      "config": "windows-release-x86_64",
      "r": "4.6.1",
      "check": "OK",
      "artifact": "11646135021"
    }
  ],
  "_upstream": "https://github.com/erwinlares/toolero",
  "_commit": {
    "id": "36d604d95a8047cb8a4806b96f7c15450b22ece6",
    "author": "Erwin Lares <erwin.lares@wisc.edu>",
    "committer": "Erwin Lares <erwin.lares@wisc.edu>",
    "message": "Write purled scripts flat; mirror under R/ only for websites and books\n\nThe post-render purl hook mirrored each document's path under R/, so\nreports/analysis.qmd purled to R/reports/analysis.R. That suits a Quarto\nwebsite, where posts/<slug>/index.qmd documents share a filename, but not\nan ordinary project. The hook now chooses the layout from the project\ntype in _quarto.yml.\n\nLayout\n- Ordinary projects write R/<name>.R. Websites and books\n  (project: type: website or book) mirror the document's path under R/.\n- Manuscript, default, no type, no _quarto.yml, and an unparseable\n  _quarto.yml are all flat. _quarto.yaml is read too.\n\nMarker and overwrite guard\n- Every purled script starts with a \"Generated from <doc> by R/purl.R\"\n  line naming its source document.\n- In the flat layout the hook never overwrites an R/<name>.R that lacks\n  a matching marker. It warns and skips that document, and still purls\n  the others. This protects hand-written scripts and a second document\n  with the same filename.\n- A script whose named document no longer exists (moved or deleted) is\n  replaced, with a message.\n- Mirrored output has no guard, since scripts written by earlier\n  versions carry no marker.\n\ncheck_project()\n- The expected script path now depends on the project type.\n- If the script is missing but sits at the other layout's path, the row\n  warns that R/purl.R is probably an older copy and gives the\n  file.copy() call that refreshes it from the installed template.\n- A new row warns when the script at the expected path names a\n  different document that still exists. A script naming a document that\n  has gone is not reported.\n- New internal helpers: .purl_layout(), .purl_source_of(),\n  .purl_claimed_by_other(). .purl_output_path() takes a layout argument.\n\nDocs and tests\n- Updated roxygen for create_qmd() and check_project(), the guard\n  warning text in create_qmd(), the README, the vignette, and NEWS\n  (Breaking changes). NEWS also covers refreshing R/purl.R in existing\n  pro",
    "time": 1791569036
  },
  "_maintainer": {
    "name": "Erwin Lares",
    "email": "erwin.lares@wisc.edu",
    "orcid": "0000-0002-3284-828X"
  },
  "_distro": "resolute",
  "_registered": true,
  "_dependencies": [
    {
      "package": "R",
      "version": ">= 4.2.0",
      "role": "Depends"
    },
    {
      "package": "cli",
      "role": "Imports"
    },
    {
      "package": "fs",
      "role": "Imports"
    },
    {
      "package": "glue",
      "role": "Imports"
    },
    {
      "package": "here",
      "version": ">= 1.0.0",
      "role": "Imports"
    },
    {
      "package": "janitor",
      "role": "Imports"
    },
    {
      "package": "jsonlite",
      "role": "Imports"
    },
    {
      "package": "lifecycle",
      "role": "Imports"
    },
    {
      "package": "parallelly",
      "role": "Imports"
    },
    {
      "package": "purrr",
      "role": "Imports"
    },
    {
      "package": "readr",
      "role": "Imports"
    },
    {
      "package": "renv",
      "version": ">= 1.0.0",
      "role": "Imports"
    },
    {
      "package": "rlang",
      "role": "Imports"
    },
    {
      "package": "rprojroot",
      "version": ">= 2.0.0",
      "role": "Imports"
    },
    {
      "package": "rvest",
      "role": "Imports"
    },
    {
      "package": "tibble",
      "role": "Imports"
    },
    {
      "package": "tidyr",
      "role": "Imports"
    },
    {
      "package": "usethis",
      "role": "Imports"
    },
    {
      "package": "utils",
      "role": "Imports"
    },
    {
      "package": "withr",
      "role": "Imports"
    },
    {
      "package": "xml2",
      "role": "Imports"
    },
    {
      "package": "yaml",
      "role": "Imports"
    },
    {
      "package": "dplyr",
      "role": "Suggests"
    },
    {
      "package": "furrr",
      "role": "Suggests"
    },
    {
      "package": "future",
      "role": "Suggests"
    },
    {
      "package": "knitr",
      "role": "Suggests"
    },
    {
      "package": "pdftools",
      "role": "Suggests"
    },
    {
      "package": "rmarkdown",
      "role": "Suggests"
    },
    {
      "package": "spelling",
      "role": "Suggests"
    },
    {
      "package": "quarto",
      "role": "Suggests"
    },
    {
      "package": "testthat",
      "version": ">= 3.2.0",
      "role": "Suggests"
    }
  ],
  "_owner": "erwinlares",
  "_selfowned": true,
  "_usedby": 0,
  "_updates": [
    {
      "week": "2026-15",
      "n": 17
    },
    {
      "week": "2026-17",
      "n": 19
    },
    {
      "week": "2026-18",
      "n": 4
    },
    {
      "week": "2026-19",
      "n": 1
    },
    {
      "week": "2026-20",
      "n": 7
    },
    {
      "week": "2026-21",
      "n": 2
    },
    {
      "week": "2026-23",
      "n": 1
    },
    {
      "week": "2026-24",
      "n": 3
    },
    {
      "week": "2026-25",
      "n": 2
    },
    {
      "week": "2026-29",
      "n": 5
    },
    {
      "week": "2026-35",
      "n": 4
    },
    {
      "week": "2026-36",
      "n": 2
    },
    {
      "week": "2026-37",
      "n": 11
    },
    {
      "week": "2026-38",
      "n": 15
    },
    {
      "week": "2026-39",
      "n": 6
    },
    {
      "week": "2026-40",
      "n": 10
    },
    {
      "week": "2026-41",
      "n": 4
    }
  ],
  "_tags": [
    {
      "name": "v0.1.0",
      "date": "2026-04-07"
    },
    {
      "name": "v0.3.0",
      "date": "2026-04-26"
    },
    {
      "name": "v0.4.0",
      "date": "2026-07-16"
    }
  ],
  "_stars": 2,
  "_userbio": {
    "uuid": 80365372,
    "type": "user",
    "name": "Erwin Lares",
    "followers": 7,
    "description": "Linguist, data science enthusiast, dog dad, humanist, coffee fan, aikidoist and hobby potter.\r\n"
  },
  "_downloads": {
    "count": 291,
    "source": "https://cranlogs.r-pkg.org/downloads/total/last-month/toolero"
  },
  "_devurl": "https://github.com/erwinlares/toolero",
  "_pkgdown": "https://erwinlares.github.io/toolero/",
  "_searchresults": 20,
  "_rbuild": "4.6.1",
  "_assets": [
    "extra/citation.cff",
    "extra/citation.html",
    "extra/citation.json",
    "extra/citation.txt",
    "extra/contents.json",
    "extra/manual.pdf",
    "extra/NEWS.html",
    "extra/NEWS.txt",
    "extra/readme.html",
    "extra/readme.md",
    "extra/toolero.html",
    "LICENSE"
  ],
  "_homeurl": "https://github.com/erwinlares/toolero",
  "_realowner": "erwinlares",
  "_cranurl": true,
  "_releases": [
    {
      "version": "0.2.0",
      "date": "2026-04-24"
    },
    {
      "version": "0.3.0",
      "date": "2026-04-27"
    },
    {
      "version": "0.4.0",
      "date": "2026-07-16"
    }
  ],
  "_exports": [
    "arborize",
    "check_project",
    "create_qmd",
    "detect_execution_context",
    "generate_citation",
    "generate_data_doc",
    "generate_kb_xml",
    "generate_license",
    "generate_manifest",
    "generate_profile",
    "generate_project_config",
    "init_project",
    "qmd_to_r",
    "read_clean_csv",
    "read_output_records",
    "resolve_input_path",
    "run_by_group",
    "save_output",
    "write_by_group",
    "write_clean_csv"
  ],
  "_help": [
    {
      "page": "arborize",
      "title": "Render a syntactic tree as a PNG image",
      "topics": [
        "arborize"
      ]
    },
    {
      "page": "check_project",
      "title": "Check a project for toolero conventions",
      "topics": [
        "check_project"
      ]
    },
    {
      "page": "create_qmd",
      "title": "Create a new Quarto document from a template",
      "topics": [
        "create_qmd"
      ]
    },
    {
      "page": "detect_execution_context",
      "title": "Detect the current execution context",
      "topics": [
        "detect_execution_context"
      ]
    },
    {
      "page": "generate_citation",
      "title": "Generate a CITATION.cff file",
      "topics": [
        "generate_citation"
      ]
    },
    {
      "page": "generate_data_doc",
      "title": "Generate a data documentation stub",
      "topics": [
        "generate_data_doc"
      ]
    },
    {
      "page": "generate_kb_xml",
      "title": "Generate a KB-importable XML file from a Quarto document",
      "topics": [
        "generate_kb_xml"
      ]
    },
    {
      "page": "generate_license",
      "title": "Generate a LICENSE file",
      "topics": [
        "generate_license"
      ]
    },
    {
      "page": "generate_manifest",
      "title": "Write the output record",
      "topics": [
        "generate_manifest"
      ]
    },
    {
      "page": "generate_profile",
      "title": "Generate a personal defaults file for create_qmd()",
      "topics": [
        "generate_profile"
      ]
    },
    {
      "page": "generate_project_config",
      "title": "Generate a project configuration file",
      "topics": [
        "generate_project_config"
      ]
    },
    {
      "page": "init_project",
      "title": "Initialize a new R project with a standard folder structure",
      "topics": [
        "init_project"
      ]
    },
    {
      "page": "qmd_to_r",
      "title": "Extract R code from a Quarto document",
      "topics": [
        "qmd_to_r"
      ]
    },
    {
      "page": "read_clean_csv",
      "title": "Read and clean a CSV file",
      "topics": [
        "read_clean_csv"
      ]
    },
    {
      "page": "read_output_records",
      "title": "Read one or more output records",
      "topics": [
        "read_output_records"
      ]
    },
    {
      "page": "resolve_input_path",
      "title": "Resolve the input data path for the current execution context",
      "topics": [
        "resolve_input_path"
      ]
    },
    {
      "page": "run_by_group",
      "title": "Apply a function to each group in a job manifest or named list",
      "topics": [
        "run_by_group"
      ]
    },
    {
      "page": "save_output",
      "title": "Save an object and record it in the project accumulator",
      "topics": [
        "save_output"
      ]
    },
    {
      "page": "write_by_group",
      "title": "Split a data frame by one or more grouping columns and write each group to a CSV file",
      "topics": [
        "write_by_group"
      ]
    },
    {
      "page": "write_clean_csv",
      "title": "Write a cleaned data frame to a CSV file",
      "topics": [
        "write_clean_csv"
      ]
    }
  ],
  "_pkglogo": "https://github.com/erwinlares/toolero/raw/HEAD/man/figures/logo.png",
  "_readme": "https://github.com/erwinlares/toolero/raw/HEAD/README.md",
  "_rundeps": [
    "askpass",
    "bit",
    "bit64",
    "cli",
    "clipr",
    "cpp11",
    "crayon",
    "credentials",
    "curl",
    "desc",
    "dplyr",
    "fs",
    "generics",
    "gert",
    "gitcreds",
    "glue",
    "here",
    "hms",
    "httr",
    "httr2",
    "ini",
    "janitor",
    "jsonlite",
    "lifecycle",
    "lubridate",
    "magrittr",
    "mime",
    "openssl",
    "pak",
    "parallelly",
    "pillar",
    "pkgconfig",
    "prettyunits",
    "progress",
    "purrr",
    "R6",
    "rappdirs",
    "readr",
    "renv",
    "rlang",
    "rprojroot",
    "rstudioapi",
    "rvest",
    "selectr",
    "snakecase",
    "stringi",
    "stringr",
    "sys",
    "tibble",
    "tidyr",
    "tidyselect",
    "timechange",
    "tzdb",
    "usethis",
    "utf8",
    "vctrs",
    "vroom",
    "whisker",
    "withr",
    "xml2",
    "yaml",
    "zip"
  ],
  "_vignettes": [
    {
      "source": "toolero-intro.Rmd",
      "filename": "toolero-intro.html",
      "title": "Getting started with toolero",
      "author": "Erwin Lares",
      "engine": "knitr::rmarkdown",
      "headings": [
        "Background and motivation",
        "Who is this for?",
        "Installation",
        "Project setup: init_project() and create_qmd()",
        "Starting with init_project()",
        "Adding a Quarto document with create_qmd()",
        "With examples (the default)",
        "Without examples",
        "Custom styling",
        "The purl hook",
        "Pre-populating the YAML header",
        "Summary of what gets created",
        "Working with data",
        "Reading and writing clean data: read_clean_csv() and write_clean_csv()",
        "Splitting and applying: write_by_group() and run_by_group()",
        "Recording what an analysis produced: save_output() and generate_manifest()",
        "Reading output records back: read_output_records()",
        "Auditing a project: check_project()",
        "Execution context: detect_execution_context() and resolve_input_path()",
        "Knowledge Base export: generate_kb_xml()",
        "Citation metadata: generate_citation()",
        "Syntactic trees: arborize()",
        "Quick reference",
        "Citation"
      ],
      "created": "2026-04-07 22:20:25",
      "modified": "2026-10-09 18:03:56",
      "commits": 16
    },
    {
      "source": "arborize.Rmd",
      "filename": "arborize.html",
      "title": "Rendering Syntactic Trees with arborize()",
      "engine": "knitr::rmarkdown",
      "headings": [
        "The problem",
        "How arborize() solves it",
        "A note on first use",
        "Two rendering backends",
        "tree_notation = \"simple\" -- bracket notation",
        "tree_notation = \"structured\" -- lingotree notation",
        "Getting the crop right: papersize and margin",
        "Choosing a papersize",
        "Choosing a margin",
        "The general workflow",
        "Examples",
        "A simple NP",
        "A clausal tree",
        "Aspectual classes",
        "Print-quality output",
        "Tight crop with a narrow margin",
        "Structured notation with lingotree",
        "Suppressing the provenance file",
        "Working with provenance files",
        "Embedding trees in documents",
        "Argument reference",
        "References"
      ],
      "created": "2026-05-02 05:07:08",
      "modified": "2026-09-30 20:04:52",
      "commits": 5
    },
    {
      "source": "detect-execution-context.Rmd",
      "filename": "detect-execution-context.html",
      "title": "Writing context-aware R code with detect_execution_context()",
      "engine": "knitr::rmarkdown",
      "headings": [
        "The problem",
        "The three contexts",
        "The solution",
        "A worked example",
        "Connecting to create_qmd() and qmd_to_r()",
        "Summary"
      ],
      "created": "2026-05-12 14:55:49",
      "modified": "2026-09-29 20:38:06",
      "commits": 4
    }
  ],
  "_score": 6.008600171761918,
  "_indexed": true,
  "_nocasepkg": "toolero",
  "_universes": [
    "erwinlares"
  ],
  "_binaries": [
    {
      "r": "4.7.0",
      "os": "linux",
      "version": "0.6.0",
      "date": "2026-10-09T21:15:45.000Z",
      "distro": "resolute",
      "commit": "36d604d95a8047cb8a4806b96f7c15450b22ece6",
      "fileid": "https://r2.ropensci.org/a9ec433e6c6fff1dc4f484d045ba8291710a810edda1673ae21869f6951f06c0",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/erwinlares/actions/runs/37991671138"
    },
    {
      "r": "4.6.1",
      "os": "linux",
      "version": "0.6.0",
      "date": "2026-10-09T21:16:00.000Z",
      "distro": "resolute",
      "commit": "36d604d95a8047cb8a4806b96f7c15450b22ece6",
      "fileid": "https://r2.ropensci.org/efd316d1d79462d8ef1e69465aa79677cd83626a583ee242299d9a699d8b3474",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/erwinlares/actions/runs/37991671138"
    },
    {
      "r": "4.5.3",
      "os": "mac",
      "version": "0.6.0",
      "date": "2026-10-09T21:19:43.000Z",
      "commit": "36d604d95a8047cb8a4806b96f7c15450b22ece6",
      "fileid": "https://r2.ropensci.org/fcc4de7695bc23a82025325c19e61f0ffd1eda112363407f516ff4ce3dd202c1",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/erwinlares/actions/runs/37991671138"
    },
    {
      "r": "4.6.1",
      "os": "mac",
      "version": "0.6.0",
      "date": "2026-10-09T21:19:40.000Z",
      "commit": "36d604d95a8047cb8a4806b96f7c15450b22ece6",
      "fileid": "https://r2.ropensci.org/4c5b40ac5b3a6dc76155d963cee03e4cd4259d0e3ac05907c7988ca3fbcfa2c7",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/erwinlares/actions/runs/37991671138"
    },
    {
      "r": "4.6.0",
      "os": "wasm",
      "version": "0.6.0",
      "date": "2026-10-09T21:15:46.000Z",
      "commit": "36d604d95a8047cb8a4806b96f7c15450b22ece6",
      "fileid": "https://r2.ropensci.org/40dcd506af1398bc89f8f6902511660154bc80d98eda81ad9eeda0382753f6ee",
      "status": "success",
      "buildurl": "https://github.com/r-universe/erwinlares/actions/runs/37991671138"
    },
    {
      "r": "4.7.0",
      "os": "win",
      "version": "0.6.0",
      "date": "2026-10-09T21:15:11.000Z",
      "commit": "36d604d95a8047cb8a4806b96f7c15450b22ece6",
      "fileid": "https://r2.ropensci.org/80383161044b4371793f2dbf6416c55ba81cd70420d93248ed86fab382d90479",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/erwinlares/actions/runs/37991671138"
    },
    {
      "r": "4.5.3",
      "os": "win",
      "version": "0.6.0",
      "date": "2026-10-09T21:14:58.000Z",
      "commit": "36d604d95a8047cb8a4806b96f7c15450b22ece6",
      "fileid": "https://r2.ropensci.org/72756fcb5ae000b5f953ec8450fd6015cca2c867256a05cda15269f26ab19dcb",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/erwinlares/actions/runs/37991671138"
    },
    {
      "r": "4.6.1",
      "os": "win",
      "version": "0.6.0",
      "date": "2026-10-09T21:15:04.000Z",
      "commit": "36d604d95a8047cb8a4806b96f7c15450b22ece6",
      "fileid": "https://r2.ropensci.org/8533f2f6b1a24634117c5f705b823d433166c28fb248e2f820068449b2f95588",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/erwinlares/actions/runs/37991671138"
    }
  ]
}