{
  "_id": "6a104a77acfb0bcc41c9fb13",
  "Package": "interfacer",
  "Title": "Define and Enforce Contracts for Dataframes as Function\nParameters",
  "Version": "0.4.0",
  "Authors@R": "person(\"Robert\", \"Challen\", , \"rob.challen@bristol.ac.uk\", role = c(\"aut\", \"cre\", \"cph\"),\ncomment = c(ORCID = \"0000-0002-5504-7768\"))",
  "Description": "A dataframe validation framework for package builders who\nuse dataframes as function parameters. It performs checks on\ncolumn names, coerces data-types, and checks grouping to make\nsure user inputs conform to a specification provided by the\npackage author. It provides a mechanism for package authors to\nautomatically document supported dataframe inputs and\nselectively dispatch to functions depending on the format of a\ndataframe much like S3 does for classes. It also contains some\ndeveloper tools to make working with and documenting dataframe\nspecifications easier. It helps package developers to improve\ntheir documentation and simplifies parameter validation where\ndataframes are used as function parameters.",
  "License": "MIT + file LICENSE",
  "Encoding": "UTF-8",
  "Roxygen": "list(markdown = TRUE)",
  "RoxygenNote": "7.3.3.9007",
  "Language": "en-GB",
  "VignetteBuilder": "knitr",
  "Config/testthat/edition": "3",
  "Config/Needs/build": "robchallen/roxygen2",
  "URL": "https://ai4ci.github.io/interfacer/,\nhttps://github.com/ai4ci/interfacer",
  "BugReports": "https://github.com/ai4ci/interfacer/issues",
  "Config/pak/sysreqs": "cmake make libicu-dev libuv1-dev libxml2-dev",
  "Repository": "https://ai4ci.r-universe.dev",
  "Date/Publication": "2025-12-10 15:36:52 UTC",
  "RemoteUrl": "https://github.com/ai4ci/interfacer",
  "RemoteRef": "0.4.0",
  "RemoteSha": "c746b4ede894516be313436bd2876c716a89710b",
  "NeedsCompilation": "no",
  "Packaged": {
    "Date": "2026-05-10 08:15:29 UTC",
    "User": "root"
  },
  "Author": "Robert Challen [aut, cre, cph] (ORCID:\n<https://orcid.org/0000-0002-5504-7768>)",
  "Maintainer": "Robert Challen <rob.challen@bristol.ac.uk>",
  "MD5sum": "4cb6e80e2f58246dd968e59e28a935b4",
  "_user": "ai4ci",
  "_type": "src",
  "_file": "interfacer_0.4.0.tar.gz",
  "_fileid": "ec7c05b437cd8206c62ffb9c0fde14496dbb53ea6702bd0aaf9dd69e82280509",
  "_filesize": 330726,
  "_sha256": "ec7c05b437cd8206c62ffb9c0fde14496dbb53ea6702bd0aaf9dd69e82280509",
  "_created": "2026-05-10T08:15:29.000Z",
  "_published": "2026-05-22T12:22:15.576Z",
  "_distro": "noble",
  "_jobs": [
    {
      "job": 77378341190,
      "time": 154,
      "config": "linux-devel-x86_64",
      "r": "4.7.0",
      "check": "OK",
      "artifact": "6902243854"
    },
    {
      "job": 77378341371,
      "time": 152,
      "config": "linux-release-x86_64",
      "r": "4.6.0",
      "check": "OK",
      "artifact": "6902243666"
    },
    {
      "job": 77378341821,
      "time": 88,
      "config": "macos-oldrel-arm64",
      "r": "4.5.3",
      "check": "OK",
      "artifact": "6902269078"
    },
    {
      "job": 77378341218,
      "time": 96,
      "config": "macos-release-arm64",
      "r": "4.6.0",
      "check": "OK",
      "artifact": "6902284622"
    },
    {
      "job": 77378340844,
      "time": 214,
      "config": "source",
      "r": "4.6.0",
      "check": "OK",
      "artifact": "6902228791"
    },
    {
      "job": 77378340873,
      "time": 127,
      "config": "wasm-release",
      "r": "4.6.0",
      "check": "OK",
      "artifact": "7160351204"
    },
    {
      "job": 77378341752,
      "time": 97,
      "config": "windows-devel",
      "r": "4.7.0",
      "check": "OK",
      "artifact": "6902238339"
    },
    {
      "job": 77378341948,
      "time": 139,
      "config": "windows-oldrel",
      "r": "4.5.3",
      "check": "OK",
      "artifact": "6902242391"
    },
    {
      "job": 77378341774,
      "time": 107,
      "config": "windows-release",
      "r": "4.6.0",
      "check": "OK",
      "artifact": "6902239299"
    }
  ],
  "_buildurl": "https://github.com/r-universe/ai4ci/actions/runs/25623737194",
  "_status": "success",
  "_host": "GitHub-Actions",
  "_upstream": "https://github.com/ai4ci/interfacer",
  "_commit": {
    "id": "c746b4ede894516be313436bd2876c716a89710b",
    "author": "robchallen <rob@terminological.co.uk>",
    "committer": "robchallen <rob@terminological.co.uk>",
    "message": "0.4.0 candidate - temp disable mac\n",
    "time": 1765381012
  },
  "_maintainer": {
    "name": "Robert Challen",
    "email": "rob.challen@bristol.ac.uk",
    "login": "robchallen",
    "orcid": "0000-0002-5504-7768",
    "uuid": 16591648
  },
  "_registered": true,
  "_dependencies": [
    {
      "package": "R",
      "version": ">= 2.10",
      "role": "Depends"
    },
    {
      "package": "dplyr",
      "role": "Imports"
    },
    {
      "package": "glue",
      "role": "Imports"
    },
    {
      "package": "magrittr",
      "role": "Imports"
    },
    {
      "package": "purrr",
      "role": "Imports"
    },
    {
      "package": "rlang",
      "role": "Imports"
    },
    {
      "package": "tibble",
      "role": "Imports"
    },
    {
      "package": "tidyselect",
      "role": "Imports"
    },
    {
      "package": "stringr",
      "role": "Imports"
    },
    {
      "package": "forcats",
      "role": "Imports"
    },
    {
      "package": "knitr",
      "role": "Imports"
    },
    {
      "package": "lobstr",
      "role": "Imports"
    },
    {
      "package": "roxygen2",
      "role": "Imports"
    },
    {
      "package": "lifecycle",
      "role": "Imports"
    },
    {
      "package": "rmarkdown",
      "role": "Suggests"
    },
    {
      "package": "devtools",
      "role": "Suggests"
    },
    {
      "package": "ggplot2",
      "role": "Suggests"
    },
    {
      "package": "testthat",
      "version": ">= 3.0.0",
      "role": "Suggests"
    },
    {
      "package": "fs",
      "role": "Suggests"
    },
    {
      "package": "readr",
      "role": "Suggests"
    },
    {
      "package": "usethis",
      "role": "Suggests"
    },
    {
      "package": "whisker",
      "role": "Suggests"
    },
    {
      "package": "clipr",
      "role": "Suggests"
    },
    {
      "package": "tidyr",
      "role": "Suggests"
    },
    {
      "package": "binom",
      "role": "Suggests"
    },
    {
      "package": "spelling",
      "role": "Suggests"
    }
  ],
  "_owner": "ai4ci",
  "_selfowned": true,
  "_usedby": 3,
  "_updates": [
    {
      "week": "2025-26",
      "n": 5
    },
    {
      "week": "2025-30",
      "n": 3
    },
    {
      "week": "2025-31",
      "n": 1
    },
    {
      "week": "2025-49",
      "n": 3
    },
    {
      "week": "2025-50",
      "n": 6
    }
  ],
  "_tags": [
    {
      "name": "0.3.4",
      "date": "2025-06-23"
    },
    {
      "name": "0.3.5",
      "date": "2025-06-24"
    },
    {
      "name": "0.3.7",
      "date": "2025-07-31"
    },
    {
      "name": "0.4.0",
      "date": "2025-12-10"
    }
  ],
  "_stars": 2,
  "_contributors": [
    {
      "user": "robchallen",
      "count": 68,
      "uuid": 16591648
    }
  ],
  "_userbio": {
    "uuid": 153937059,
    "type": "organization",
    "name": "AI for Collective Intelligence (AI4CI) ",
    "description": "A UKRI AI Research Hub"
  },
  "_downloads": {
    "count": 249,
    "source": "https://cranlogs.r-pkg.org/downloads/total/last-month/interfacer"
  },
  "_devurl": "https://github.com/ai4ci/interfacer",
  "_pkgdown": "https://ai4ci.github.io/interfacer/",
  "_searchresults": 21,
  "_rbuild": "4.6.0",
  "_assets": [
    "extra/citation.cff",
    "extra/citation.html",
    "extra/citation.json",
    "extra/citation.txt",
    "extra/contents.json",
    "extra/interfacer.html",
    "extra/NEWS.html",
    "extra/NEWS.txt",
    "extra/readme.html",
    "extra/readme.md",
    "manual.pdf"
  ],
  "_homeurl": "https://github.com/ai4ci/interfacer",
  "_realowner": "ai4ci",
  "_cranurl": true,
  "_releases": [
    {
      "version": "0.2.3",
      "date": "2024-08-01"
    },
    {
      "version": "0.3.2",
      "date": "2024-11-14"
    },
    {
      "version": "0.3.3",
      "date": "2025-02-03"
    },
    {
      "version": "0.4.0",
      "date": "2025-12-15"
    }
  ],
  "_exports": [
    "%>%",
    "check_character",
    "check_consistent",
    "check_date",
    "check_integer",
    "check_logical",
    "check_numeric",
    "check_single",
    "demo_idispatch",
    "get_iface",
    "iclip",
    "iconvert",
    "idispatch",
    "idocument",
    "if_col_present",
    "iface",
    "igroup_process",
    "imapper",
    "imissing",
    "iproto",
    "ireturn",
    "is_col_present",
    "is.iface",
    "itest",
    "ivalidate",
    "recycle",
    "resolve_missing",
    "switch_pipeline",
    "type.anything",
    "type.character",
    "type.complete",
    "type.date",
    "type.default",
    "type.double",
    "type.enum",
    "type.factor",
    "type.finite",
    "type.group_unique",
    "type.in_range",
    "type.integer",
    "type.logical",
    "type.not_missing",
    "type.numeric",
    "type.of_type",
    "type.positive_double",
    "type.positive_integer",
    "type.proportion",
    "type.unique_id",
    "use_dataframe",
    "use_iface"
  ],
  "_help": [
    {
      "page": "as.list.iface",
      "title": "Cast an 'iface' to a plain list.",
      "topics": [
        "as.list.iface"
      ]
    },
    {
      "page": "check_character",
      "title": "Checks a set of variables can be coerced to a character and coerces them",
      "concept": [
        "parameter_checks"
      ],
      "topics": [
        "check_character"
      ]
    },
    {
      "page": "check_consistent",
      "title": "Check function parameters conform to a set of rules",
      "concept": [
        "parameter_checks"
      ],
      "topics": [
        "check_consistent"
      ]
    },
    {
      "page": "check_date",
      "title": "Checks a set of variables can be coerced to a date and coerces them",
      "concept": [
        "parameter_checks"
      ],
      "topics": [
        "check_date"
      ]
    },
    {
      "page": "check_integer",
      "title": "Checks a set of variables can be coerced to integer and coerces them",
      "concept": [
        "parameter_checks"
      ],
      "topics": [
        "check_integer"
      ]
    },
    {
      "page": "check_logical",
      "title": "Checks a set of variables can be coerced to a logical and coerces them",
      "concept": [
        "parameter_checks"
      ],
      "topics": [
        "check_logical"
      ]
    },
    {
      "page": "check_numeric",
      "title": "Checks a set of variables can be coerced to numeric and coerces them",
      "concept": [
        "parameter_checks"
      ],
      "topics": [
        "check_numeric"
      ]
    },
    {
      "page": "check_single",
      "title": "Checks a set of variables are all of length one",
      "concept": [
        "parameter_checks"
      ],
      "topics": [
        "check_single"
      ]
    },
    {
      "page": "format.iface",
      "title": "Format an 'iface' specification for printing",
      "topics": [
        "format.iface"
      ]
    },
    {
      "page": "get_iface",
      "title": "Extract the 'interfacer' specification for a function",
      "topics": [
        "get_iface"
      ]
    },
    {
      "page": "iclip",
      "title": "Create an 'iface' specification from an example dataframe",
      "concept": [
        "document"
      ],
      "topics": [
        "iclip"
      ]
    },
    {
      "page": "iconvert",
      "title": "Convert a dataframe to a format compatible with an interface specification",
      "concept": [
        "interface"
      ],
      "topics": [
        "iconvert"
      ]
    },
    {
      "page": "idispatch",
      "title": "Dispatch to a named function based on the characteristics of a dataframe",
      "concept": [
        "interface"
      ],
      "topics": [
        "idispatch"
      ]
    },
    {
      "page": "idocument",
      "title": "Document an interface contract for inserting into 'roxygen2'",
      "concept": [
        "document"
      ],
      "topics": [
        "idocument"
      ]
    },
    {
      "page": "if_col_present",
      "title": "Execute a function or return a value if a column in present in a dataframe",
      "topics": [
        "if_col_present"
      ]
    },
    {
      "page": "iface",
      "title": "Construct an interface specification",
      "concept": [
        "interface"
      ],
      "topics": [
        "iface"
      ]
    },
    {
      "page": "igroup_process",
      "title": "Handle unexpected additional grouping structure",
      "concept": [
        "interface"
      ],
      "topics": [
        "igroup_process"
      ]
    },
    {
      "page": "imapper",
      "title": "Specify mappings that can make dataframes compatible with an 'iface' specification",
      "concept": [
        "interface"
      ],
      "topics": [
        "imapper"
      ]
    },
    {
      "page": "imissing",
      "title": "Test if an 'iface' parameter was supplied to a function",
      "topics": [
        "imissing"
      ]
    },
    {
      "page": "iproto",
      "title": "Generate a zero length dataframe conforming to an 'iface' specification",
      "concept": [
        "interface"
      ],
      "topics": [
        "iproto"
      ]
    },
    {
      "page": "ireturn",
      "title": "Validate and return a value from a function",
      "concept": [
        "interface"
      ],
      "topics": [
        "ireturn"
      ]
    },
    {
      "page": "is_col_present",
      "title": "Check for existence of a set of columns in a dataframe",
      "topics": [
        "is_col_present"
      ]
    },
    {
      "page": "is.iface",
      "title": "Check if an object is an interface specification",
      "concept": [
        "interface"
      ],
      "topics": [
        "is.iface"
      ]
    },
    {
      "page": "itest",
      "title": "Test dataframe conformance to an interface specification.",
      "concept": [
        "interface"
      ],
      "topics": [
        "itest"
      ]
    },
    {
      "page": "ivalidate",
      "title": "Perform interface checks on dataframe inputs using enclosing function formal parameter definitions",
      "concept": [
        "interface"
      ],
      "topics": [
        "ivalidate"
      ]
    },
    {
      "page": "knit_print.iface",
      "title": "Format an 'iface' specification for printing",
      "topics": [
        "knit_print.iface"
      ]
    },
    {
      "page": "print.iface",
      "title": "Format an 'iface' specification for printing",
      "topics": [
        "print.iface"
      ]
    },
    {
      "page": "recycle",
      "title": "Strictly recycle function parameters",
      "concept": [
        "parameter_checks"
      ],
      "topics": [
        "recycle"
      ]
    },
    {
      "page": "resolve_missing",
      "title": "Resolve missing values in function parameters and check consistency",
      "concept": [
        "parameter_checks"
      ],
      "topics": [
        "resolve_missing"
      ]
    },
    {
      "page": "roxy_tag_parse.roxy_tag_iparam",
      "title": "Parser for @iparam tags",
      "concept": [
        "document"
      ],
      "topics": [
        "roxy_tag_parse.roxy_tag_iparam"
      ]
    },
    {
      "page": "roxy_tag_parse.roxy_tag_ireturn",
      "title": "Parser for @ireturn tags",
      "concept": [
        "document"
      ],
      "topics": [
        "roxy_tag_parse.roxy_tag_ireturn"
      ]
    },
    {
      "page": "roxy_tag_rd.roxy_tag_iparam",
      "title": "Support for @iparam tags",
      "concept": [
        "document"
      ],
      "topics": [
        "roxy_tag_rd.roxy_tag_iparam"
      ]
    },
    {
      "page": "roxy_tag_rd.roxy_tag_ireturn",
      "title": "Support for @ireturn tags",
      "concept": [
        "document"
      ],
      "topics": [
        "roxy_tag_rd.roxy_tag_ireturn"
      ]
    },
    {
      "page": "switch_pipeline",
      "title": "Branch a 'dplyr' pipeline based on a set of conditions",
      "topics": [
        "switch_pipeline"
      ]
    },
    {
      "page": "type.anything",
      "title": "Coerce to an unspecified type",
      "concept": [
        "rules"
      ],
      "topics": [
        "type.anything"
      ]
    },
    {
      "page": "type.character",
      "title": "Coerce to a character.",
      "concept": [
        "rules"
      ],
      "topics": [
        "type.character"
      ]
    },
    {
      "page": "type.complete",
      "title": "Coerce to a complete set of values.",
      "concept": [
        "rules"
      ],
      "topics": [
        "type.complete"
      ]
    },
    {
      "page": "type.date",
      "title": "Coerce to a Date.",
      "concept": [
        "rules"
      ],
      "topics": [
        "type.date"
      ]
    },
    {
      "page": "type.default",
      "title": "Set a default value for a column",
      "concept": [
        "rules"
      ],
      "topics": [
        "type.default"
      ]
    },
    {
      "page": "type.double",
      "title": "Coerce to a double.",
      "concept": [
        "rules"
      ],
      "topics": [
        "type.double"
      ]
    },
    {
      "page": "type.enum",
      "title": "Define a conformance rule to match a factor with specific levels.",
      "concept": [
        "rules"
      ],
      "topics": [
        "type.enum"
      ]
    },
    {
      "page": "type.factor",
      "title": "Coerce to a factor.",
      "concept": [
        "rules"
      ],
      "topics": [
        "type.factor"
      ]
    },
    {
      "page": "type.finite",
      "title": "Check for non-finite values",
      "concept": [
        "rules"
      ],
      "topics": [
        "type.finite"
      ]
    },
    {
      "page": "type.group_unique",
      "title": "Coerce to a unique value within the current grouping structure.",
      "concept": [
        "rules"
      ],
      "topics": [
        "type.group_unique"
      ]
    },
    {
      "page": "type.in_range",
      "title": "Define a conformance rule to confirm that a numeric is in a set range",
      "concept": [
        "rules"
      ],
      "topics": [
        "type.in_range"
      ]
    },
    {
      "page": "type.integer",
      "title": "Coerce to integer",
      "concept": [
        "rules"
      ],
      "topics": [
        "type.integer"
      ]
    },
    {
      "page": "type.logical",
      "title": "Coerce to a logical",
      "concept": [
        "rules"
      ],
      "topics": [
        "type.logical"
      ]
    },
    {
      "page": "type.not_missing",
      "title": "Check for missing values",
      "concept": [
        "rules"
      ],
      "topics": [
        "type.not_missing"
      ]
    },
    {
      "page": "type.numeric",
      "title": "Coerce to a numeric.",
      "concept": [
        "rules"
      ],
      "topics": [
        "type.numeric"
      ]
    },
    {
      "page": "type.of_type",
      "title": "Check for a given class",
      "concept": [
        "rules"
      ],
      "topics": [
        "type.of_type"
      ]
    },
    {
      "page": "type.positive_double",
      "title": "Coerce to a positive double.",
      "concept": [
        "rules"
      ],
      "topics": [
        "type.positive_double"
      ]
    },
    {
      "page": "type.positive_integer",
      "title": "Coerce to a positive integer.",
      "concept": [
        "rules"
      ],
      "topics": [
        "type.positive_integer"
      ]
    },
    {
      "page": "type.proportion",
      "title": "Coerce to a number between 0 and 1",
      "concept": [
        "rules"
      ],
      "topics": [
        "type.proportion"
      ]
    },
    {
      "page": "type.unique_id",
      "title": "A globally unique ids.",
      "concept": [
        "rules"
      ],
      "topics": [
        "type.unique_id"
      ]
    },
    {
      "page": "use_dataframe",
      "title": "Use a dataframe in a package including structure based documentation",
      "concept": [
        "document"
      ],
      "topics": [
        "use_dataframe"
      ]
    },
    {
      "page": "use_iface",
      "title": "Generate interfacer code for a dataframe",
      "concept": [
        "document"
      ],
      "topics": [
        "use_iface"
      ]
    }
  ],
  "_pkglogo": "https://github.com/ai4ci/interfacer/raw/0.4.0/man/figures/logo.svg",
  "_readme": "https://github.com/ai4ci/interfacer/raw/0.4.0/README.md",
  "_rundeps": [
    "brew",
    "callr",
    "cli",
    "commonmark",
    "cpp11",
    "crayon",
    "desc",
    "dplyr",
    "evaluate",
    "forcats",
    "fs",
    "generics",
    "glue",
    "highr",
    "knitr",
    "lifecycle",
    "lobstr",
    "magrittr",
    "pillar",
    "pkgbuild",
    "pkgconfig",
    "pkgload",
    "prettyunits",
    "processx",
    "ps",
    "purrr",
    "R6",
    "rlang",
    "roxygen2",
    "rprojroot",
    "stringi",
    "stringr",
    "tibble",
    "tidyselect",
    "utf8",
    "vctrs",
    "withr",
    "xfun",
    "xml2",
    "yaml"
  ],
  "_vignettes": [
    {
      "source": "interfacer.Rmd",
      "filename": "interfacer.html",
      "title": "Dataframe validation",
      "engine": "knitr::rmarkdown",
      "headings": [
        "Rationale",
        "Defining an interface",
        "Extension and composition",
        "Grouping",
        "Documentation",
        "Type coercion",
        "More complex type constraints",
        "Default dataframe values",
        "Conclusion"
      ],
      "created": "2023-07-18 17:02:46",
      "modified": "2025-06-24 16:48:13",
      "commits": 14
    },
    {
      "source": "dispatch.Rmd",
      "filename": "dispatch.html",
      "title": "Multiple dispatch based on dataframes",
      "engine": "knitr::rmarkdown",
      "headings": [
        "Rationale",
        "Dispatch",
        "Grouping based dispatch"
      ],
      "created": "2024-07-24 16:10:01",
      "modified": "2025-07-31 11:24:51",
      "commits": 6
    },
    {
      "source": "nesting.Rmd",
      "filename": "nesting.html",
      "title": "Nested dataframes and purrr style list columns",
      "engine": "knitr::rmarkdown",
      "headings": [
        "Nesting & list columns",
        "Conclusion"
      ],
      "created": "2024-07-24 16:10:01",
      "modified": "2024-07-24 16:10:01",
      "commits": 1
    },
    {
      "source": "consistency.Rmd",
      "filename": "consistency.html",
      "title": "Parameter consistency checking with interfacer",
      "engine": "knitr::rmarkdown",
      "headings": [
        "Toy example"
      ],
      "created": "2024-11-07 23:09:27",
      "modified": "2024-11-07 23:09:27",
      "commits": 1
    },
    {
      "source": "devtools.Rmd",
      "filename": "devtools.html",
      "title": "Tools to work with interfacer",
      "engine": "knitr::rmarkdown",
      "headings": [
        "Automating iface specifications",
        "Dataframe documentation",
        "roxygen2 documentation"
      ],
      "created": "2024-07-24 16:10:01",
      "modified": "2025-06-24 16:48:13",
      "commits": 5
    }
  ],
  "_score": 6.674401812845281,
  "_indexed": true,
  "_nocasepkg": "interfacer",
  "_universes": [
    "ai4ci",
    "robchallen"
  ],
  "_binaries": [
    {
      "r": "4.7.0",
      "os": "linux",
      "version": "0.4.0",
      "date": "2026-05-10T08:17:53.000Z",
      "distro": "noble",
      "commit": "c746b4ede894516be313436bd2876c716a89710b",
      "fileid": "c0539a6a6e352df09dd540db4ca7fe4f9998fa82d32a8d66e1c6f161a3cc1e23",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/ai4ci/actions/runs/25623737194"
    },
    {
      "r": "4.6.0",
      "os": "linux",
      "version": "0.4.0",
      "date": "2026-05-10T08:17:51.000Z",
      "distro": "noble",
      "commit": "c746b4ede894516be313436bd2876c716a89710b",
      "fileid": "876e0aeeb6d3e5932e8c7b012c442e24fb0bcf28ff13ec8268909e7f57a11790",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/ai4ci/actions/runs/25623737194"
    },
    {
      "r": "4.5.3",
      "os": "mac",
      "version": "0.4.0",
      "date": "2026-05-10T08:22:25.000Z",
      "commit": "c746b4ede894516be313436bd2876c716a89710b",
      "fileid": "1089e28e6a142dd8adb0003e9c8c70ef5e9915f5c4b550b7cab72e7ae6c38e2a",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/ai4ci/actions/runs/25623737194"
    },
    {
      "r": "4.6.0",
      "os": "mac",
      "version": "0.4.0",
      "date": "2026-05-10T08:25:11.000Z",
      "commit": "c746b4ede894516be313436bd2876c716a89710b",
      "fileid": "f30eba5960b8ac51a3710be457a0198218fd6a7001c3307575a2380818e67cd5",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/ai4ci/actions/runs/25623737194"
    },
    {
      "r": "4.7.0",
      "os": "win",
      "version": "0.4.0",
      "date": "2026-05-10T08:16:48.000Z",
      "commit": "c746b4ede894516be313436bd2876c716a89710b",
      "fileid": "29c9e3eb2005f38d604cde245080ffc777340c6e04b9cb0977648b0154e4a93e",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/ai4ci/actions/runs/25623737194"
    },
    {
      "r": "4.5.3",
      "os": "win",
      "version": "0.4.0",
      "date": "2026-05-10T08:17:29.000Z",
      "commit": "c746b4ede894516be313436bd2876c716a89710b",
      "fileid": "a0ed1335203e1ab556dfa359836c4c0c8b0fe8088bfa7877c134657811bc1b24",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/ai4ci/actions/runs/25623737194"
    },
    {
      "r": "4.6.0",
      "os": "win",
      "version": "0.4.0",
      "date": "2026-05-10T08:16:54.000Z",
      "commit": "c746b4ede894516be313436bd2876c716a89710b",
      "fileid": "fb76f7d972afba4f823d387b8f403962628caa5d9685779d01cd10a8e582a91e",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/ai4ci/actions/runs/25623737194"
    },
    {
      "r": "4.6.0",
      "os": "wasm",
      "version": "0.4.0",
      "date": "2026-05-22T12:22:01.000Z",
      "commit": "c746b4ede894516be313436bd2876c716a89710b",
      "fileid": "daf57089d0b9e4a7bdc315853690823be041b6cb1823180b46983ffce96a4bf9",
      "status": "success",
      "buildurl": "https://github.com/r-universe/ai4ci/actions/runs/25623737194"
    }
  ]
}