From c7dcc3d7259301e50fb7e0cbf8720b1ba9839d8d Mon Sep 17 00:00:00 2001 From: Noam Ross Date: Thu, 9 Nov 2023 10:43:14 -0500 Subject: [PATCH] Change name from gitty to relic --- .Rbuildignore | 5 +- .github/CONTRIBUTING.md | 55 +++++- .github/workflows/update-docs-and-meta.yaml | 48 ++++++ DESCRIPTION | 30 ++-- LICENSE | 2 +- LICENSE.md | 2 +- NAMESPACE | 8 +- NEWS.md | 3 + R/relic-package.R | 7 + codemeta.json | 159 +++++++++++++++--- inst/CITATION | 17 +- inst/WORDLIST | 9 + inst/paper.bib | 0 gitty.Rproj => relic.Rproj | 2 +- vignettes/figures/eha-footer.png | Bin 0 -> 44991 bytes ...{intro-to-gitty.Rmd => intro-to-relic.Rmd} | 6 +- vignettes/relic-history.Rmd | 22 +++ vignettes/targets.Rmd | 39 +++++ 18 files changed, 357 insertions(+), 57 deletions(-) create mode 100644 .github/workflows/update-docs-and-meta.yaml create mode 100644 NEWS.md create mode 100644 R/relic-package.R create mode 100644 inst/WORDLIST create mode 100644 inst/paper.bib rename gitty.Rproj => relic.Rproj (86%) create mode 100644 vignettes/figures/eha-footer.png rename vignettes/{intro-to-gitty.Rmd => intro-to-relic.Rmd} (74%) create mode 100644 vignettes/relic-history.Rmd create mode 100644 vignettes/targets.Rmd diff --git a/.Rbuildignore b/.Rbuildignore index ef029c9..bbafaf0 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -1,6 +1,9 @@ -^gitty\.Rproj$ +^relic\.Rproj$ ^\.Rproj\.user$ ^README\.Rmd$ ^\.github$ ^CODE_OF_CONDUCT\.md$ ^LICENSE\.md$ +^man/install_minio\.Rd$ +^man/sys_tempdir\.Rd$ +^man/sys_tempfile\.Rd$ diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 63fc3ba..8a9e6ff 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -1,6 +1,51 @@ -# Contributing to gitty - -This outlines how to propose a change to gitty. +# Contributing to `relic` + +This outlines how to propose a change to `relic`. + +## General design considerations + +- `relic` is a high-level interface designed for working with git repositories + of data science workflows. It is not intended to be a general-purpose client + for git. +- `relic`'s primary features are for extracting and comparing files and data + from git history and running code within and across git history. Functions + in the package are generally _read-only_ and do not commit or modify history. +- `relic` aims to have relatively few dependencies for its core functions (`git2r` + and low-level packages such as `fs` and `rlang`). For extended functionality, + other packages may be used, but these should live under `Suggests:` and + make use of `rlang::check_installed()`. + + Alternatively, using another package in a vignette may be a good way to + demonstrate how `relic` can be used with other packages rather than extending + `relic` itself. +- `relic` has specific support for workflows using + [`targets`](https://books.ropensci.org/targets/). Similar functionality + for other workflow managers may be considered in the future, as may high-level + interfaces for dealing with other versioned data such as S3 buckets. +- `relic` uses `git2r` to interface with git/libgit2. In general `relic` functions + should not call `libgit2` directly nor call `git` via the command line. If + `git2r` does not expose needed functionality in `libgit2`, consider making + a contribution to `git2r`. +- In general `relic` only deals with the local git repository. It does not + interface with remote repositories, nor interact with the APIs of services like + GitLab, GitHub, or gitea. + +## Testing + +Tests for `relic` require some considerable bootstrapping outlined in the +[testing README](tests/README.md). Notably, for testing workflows that interact +with S3 cloud storage, a MinIO server is run in the background to serve as an +S3 API endpoint. You will need the `minio` command line tool installed as well +as the `mc` MinIO client. + +## Lifecycle Statement + +`relic` is a new package and its API is still under development. + +`relic` developed to support internal projects at EcoHealth Alliance. We strive +to be good contributors to the open-source ecosystem and for this to be a +general-purpose tool, but internal needs will drive prioritization of development +and design decisions. ## Fixing typos @@ -17,7 +62,7 @@ See our guide on [how to create a great issue](https://code-review.tidyverse.org ### Pull request process -* Fork the package and clone onto your computer. If you haven't done this before, we recommend using `usethis::create_from_github("noamross/gitty", fork = TRUE)`. +* Fork the package and clone onto your computer. If you haven't done this before, we recommend using `usethis::create_from_github("noamross/relic", fork = TRUE)`. * Install all development dependencies with `devtools::install_dev_deps()`, and then make sure the package passes R CMD check by running `devtools::check()`. If R CMD check doesn't pass cleanly, it's a good idea to ask for help before continuing. @@ -41,6 +86,6 @@ See our guide on [how to create a great issue](https://code-review.tidyverse.org ## Code of Conduct -Please note that the gitty project is released with a +Please note that the relic project is released with a [Contributor Code of Conduct](CODE_OF_CONDUCT.md). By contributing to this project you agree to abide by its terms. diff --git a/.github/workflows/update-docs-and-meta.yaml b/.github/workflows/update-docs-and-meta.yaml new file mode 100644 index 0000000..b046a5e --- /dev/null +++ b/.github/workflows/update-docs-and-meta.yaml @@ -0,0 +1,48 @@ +# Workflow derived from https://github.com/r-lib/actions/tree/master/examples +# The action runs when: +# - A new release is published +# - Changes to the main branch +on: + release: + types: [published] + push: + branches: [master, main] + workflow_dispatch: + +name: Update Docs and Metadata + +jobs: + update-docs-and-meta: + runs-on: macos-latest + env: + GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} + steps: + - uses: actions/checkout@v3 + - uses: r-lib/actions/setup-r@v2 + - uses: r-lib/actions/setup-r-dependencies@v2 + with: + extra-packages: | + any::cffr + any::codemeta + any::rmarkdown + any::devtools + + - name: Update package metadata and docs + run: | + devtools::document() + cffr::cff_write(keys = list()) + codemeta::write_codemeta() + rmarkdown::render('README.Rmd', output_options = list(html_preview = FALSE)) + + shell: Rscript {0} + + - name: Commit results + run: | + git config --local user.name "github-actions[bot]" + git config --local user.email "41898282+github-actions[bot]@users.noreply.github.com" + git add CITATION.cff codemeta.json README.md NAMESPACE man/** + git commit -m 'Update package metadata and documentation' || echo "No changes to commit" + git push origin || echo "No changes to commit" + + + diff --git a/DESCRIPTION b/DESCRIPTION index 35fc57b..d593870 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,13 +1,15 @@ -Package: gitty -Title: Tools for working with version-controlled data science workflows +Package: relic +Title: Objects from History Version: 0.0.0.9000 -Authors@R: +Authors@R: c( person("Noam", "Ross", , "ross@ecohealthalliance.org", role = c("aut", "cre"), - comment = c(ORCID = "0000-0002-2136-0000")) -Description: Tools for working with version-controlled data science workflows + comment = c(ORCID = "0000-0002-2136-0000")), + person("EcoHealth Alliance", role = c("cph", "fnd")) + ) +Description: Tools working with the history of version-controlled projects, License: MIT + file LICENSE Encoding: UTF-8 -Language: es +Language: en-US Roxygen: list(markdown = TRUE, roclets = c("collate", "rd", "namespace", "devtag::dev_roclet")) RoxygenNote: 7.2.3 Imports: @@ -21,12 +23,18 @@ Suggests: testthat (>= 3.0.0), devtag, pkgcheck, - lintr + lintr, + processx, + paws, + httr, + autotest, + callr, + spelling Remotes: - ropensci/git2r - moodymudskipper/devtag + ropensci/git2r, + moodymudskipper/devtag, ropensci-review-tools/pkgcheck Config/testthat/edition: 3 -URL: https://noamross.github.io/gitty, https://noamross.r-universe.dev/gitty -BugReports: https://github.com/noamross/gitty/issues +URL: https://noamross.github.io/relic, https://noamross.r-universe.dev/relic +BugReports: https://github.com/noamross/relic/issues VignetteBuilder: knitr diff --git a/LICENSE b/LICENSE index 2891f1b..3a6c3c0 100644 --- a/LICENSE +++ b/LICENSE @@ -1,2 +1,2 @@ YEAR: 2023 -COPYRIGHT HOLDER: gitty authors +COPYRIGHT HOLDER: relic authors diff --git a/LICENSE.md b/LICENSE.md index 3d3edab..a1a5fd9 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,6 +1,6 @@ # MIT License -Copyright (c) 2023 gitty authors +Copyright (c) 2023 relic authors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/NAMESPACE b/NAMESPACE index 0bdc25a..a07c805 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -1,4 +1,10 @@ # Generated by roxygen2: do not edit by hand +export(commits_between) +export(file_copy_versions) +export(graph_from_commits) +export(graph_from_git_repository) export(tar_load_version) -export(tar_read_version) +export(tar_read_versions) +import(fs) +import(git2r) diff --git a/NEWS.md b/NEWS.md new file mode 100644 index 0000000..5b06b6a --- /dev/null +++ b/NEWS.md @@ -0,0 +1,3 @@ +# relic (development version) + +* Initial proof of concept diff --git a/R/relic-package.R b/R/relic-package.R new file mode 100644 index 0000000..e02140e --- /dev/null +++ b/R/relic-package.R @@ -0,0 +1,7 @@ +#' @keywords internal +"_PACKAGE" + +## usethis namespace: start +#' @import fs git2r +## usethis namespace: end +NULL diff --git a/codemeta.json b/codemeta.json index 4bec181..58bcf05 100644 --- a/codemeta.json +++ b/codemeta.json @@ -1,11 +1,12 @@ { "@context": "https://doi.org/10.5063/schema/codemeta-2.0", "@type": "SoftwareSourceCode", - "identifier": "gitty", - "description": "Tools for working with version-controlled data science workflows", - "name": "gitty: Tools for working with version-controlled data science workflows", - "codeRepository": "https://github.com/noamross/gitty", - "issueTracker": "https://github.com/noamross/gitty/issues", + "identifier": "relic", + "description": "Tools working with the history of version-controlled projects, ", + "name": "relic: Objects from History", + "relatedLink": "https://noamross.r-universe.dev/relic", + "codeRepository": "https://noamross.github.io/relic", + "issueTracker": "https://github.com/noamross/relic/issues", "license": "https://spdx.org/licenses/MIT", "version": "0.0.0.9000", "programmingLanguage": { @@ -14,24 +15,6 @@ "url": "https://r-project.org" }, "runtimePlatform": "R version 4.3.1 (2023-06-16)", - "author": [ - { - "@type": "Person", - "givenName": "Noam", - "familyName": "Ross", - "email": "ross@ecohealthalliance.org", - "@id": "https://orcid.org/0000-0002-2136-0000" - } - ], - "maintainer": [ - { - "@type": "Person", - "givenName": "Noam", - "familyName": "Ross", - "email": "ross@ecohealthalliance.org", - "@id": "https://orcid.org/0000-0002-2136-0000" - } - ], "softwareSuggestions": [ { "@type": "SoftwareApplication", @@ -45,6 +28,30 @@ }, "sameAs": "https://CRAN.R-project.org/package=igraph" }, + { + "@type": "SoftwareApplication", + "identifier": "knitr", + "name": "knitr", + "provider": { + "@id": "https://cran.r-project.org", + "@type": "Organization", + "name": "Comprehensive R Archive Network (CRAN)", + "url": "https://cran.r-project.org" + }, + "sameAs": "https://CRAN.R-project.org/package=knitr" + }, + { + "@type": "SoftwareApplication", + "identifier": "rmarkdown", + "name": "rmarkdown", + "provider": { + "@id": "https://cran.r-project.org", + "@type": "Organization", + "name": "Comprehensive R Archive Network (CRAN)", + "url": "https://cran.r-project.org" + }, + "sameAs": "https://CRAN.R-project.org/package=rmarkdown" + }, { "@type": "SoftwareApplication", "identifier": "targets", @@ -69,6 +76,95 @@ "url": "https://cran.r-project.org" }, "sameAs": "https://CRAN.R-project.org/package=testthat" + }, + { + "@type": "SoftwareApplication", + "identifier": "devtag", + "name": "devtag", + "sameAs": "https://github.com/moodymudskipper/devtag" + }, + { + "@type": "SoftwareApplication", + "identifier": "pkgcheck", + "name": "pkgcheck", + "sameAs": "https://github.com/ropensci-review-tools/pkgcheck" + }, + { + "@type": "SoftwareApplication", + "identifier": "lintr", + "name": "lintr", + "provider": { + "@id": "https://cran.r-project.org", + "@type": "Organization", + "name": "Comprehensive R Archive Network (CRAN)", + "url": "https://cran.r-project.org" + }, + "sameAs": "https://CRAN.R-project.org/package=lintr" + }, + { + "@type": "SoftwareApplication", + "identifier": "processx", + "name": "processx", + "provider": { + "@id": "https://cran.r-project.org", + "@type": "Organization", + "name": "Comprehensive R Archive Network (CRAN)", + "url": "https://cran.r-project.org" + }, + "sameAs": "https://CRAN.R-project.org/package=processx" + }, + { + "@type": "SoftwareApplication", + "identifier": "paws", + "name": "paws", + "provider": { + "@id": "https://cran.r-project.org", + "@type": "Organization", + "name": "Comprehensive R Archive Network (CRAN)", + "url": "https://cran.r-project.org" + }, + "sameAs": "https://CRAN.R-project.org/package=paws" + }, + { + "@type": "SoftwareApplication", + "identifier": "httr", + "name": "httr", + "provider": { + "@id": "https://cran.r-project.org", + "@type": "Organization", + "name": "Comprehensive R Archive Network (CRAN)", + "url": "https://cran.r-project.org" + }, + "sameAs": "https://CRAN.R-project.org/package=httr" + }, + { + "@type": "SoftwareApplication", + "identifier": "autotest", + "name": "autotest" + }, + { + "@type": "SoftwareApplication", + "identifier": "callr", + "name": "callr", + "provider": { + "@id": "https://cran.r-project.org", + "@type": "Organization", + "name": "Comprehensive R Archive Network (CRAN)", + "url": "https://cran.r-project.org" + }, + "sameAs": "https://CRAN.R-project.org/package=callr" + }, + { + "@type": "SoftwareApplication", + "identifier": "spelling", + "name": "spelling", + "provider": { + "@id": "https://cran.r-project.org", + "@type": "Organization", + "name": "Comprehensive R Archive Network (CRAN)", + "url": "https://cran.r-project.org" + }, + "sameAs": "https://CRAN.R-project.org/package=spelling" } ], "softwareRequirements": { @@ -98,5 +194,20 @@ }, "SystemRequirements": null }, - "fileSize": "4.793KB" + "fileSize": "104.273KB", + "citation": [ + { + "@type": "SoftwareSourceCode", + "datePublished": "2024", + "author": [ + { + "@type": "Person", + "givenName": "Noam", + "familyName": "Ross" + } + ], + "name": "relic: Tools for working with version-controlled data science workflows", + "url": "https://github.com/noamross/relic" + } + ] } diff --git a/inst/CITATION b/inst/CITATION index 6be1611..eb920ba 100644 --- a/inst/CITATION +++ b/inst/CITATION @@ -1,11 +1,10 @@ +citHeader("To cite relic in publications use:") + bibentry( - bibtype = "Article", - title = , - author = , - journal = , - year = , - volume = , - number = , - pages = , - doi = + bibtype = "Manual", + title = "relic: Tools for working with version-controlled data science workflows", + year = "2024", + author = "Noam Ross", + edition = "0.1.0", + url = "https://github.com/noamross/relic" ) diff --git a/inst/WORDLIST b/inst/WORDLIST new file mode 100644 index 0000000..86c5eb8 --- /dev/null +++ b/inst/WORDLIST @@ -0,0 +1,9 @@ +CMD +ORCID +SHA +codecov +https +pkgcheck +retarting +revwalk +scm diff --git a/inst/paper.bib b/inst/paper.bib new file mode 100644 index 0000000..e69de29 diff --git a/gitty.Rproj b/relic.Rproj similarity index 86% rename from gitty.Rproj rename to relic.Rproj index ab7355d..69fafd4 100644 --- a/gitty.Rproj +++ b/relic.Rproj @@ -19,4 +19,4 @@ LineEndingConversion: Posix BuildType: Package PackageUseDevtools: Yes PackageInstallArgs: --no-multiarch --with-keep.source -PackageRoxygenize: rd,collate,namespace,devtag::dev_roclet +PackageRoxygenize: rd,collate,namespace diff --git a/vignettes/figures/eha-footer.png b/vignettes/figures/eha-footer.png new file mode 100644 index 0000000000000000000000000000000000000000..9a5ee2203158c1c6a51014466bf3f1ec9720798f GIT binary patch literal 44991 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 - %\VignetteIndexEntry{intro-to-gitty} + %\VignetteIndexEntry{intro-to-relic} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- @@ -15,5 +15,5 @@ knitr::opts_chunk$set( ``` ```{r setup} -library(gitty) +library(relic) ``` diff --git a/vignettes/relic-history.Rmd b/vignettes/relic-history.Rmd new file mode 100644 index 0000000..b530f1b --- /dev/null +++ b/vignettes/relic-history.Rmd @@ -0,0 +1,22 @@ +--- +title: "Analyzing relic Git History with relic" +output: rmarkdown::html_vignette +vignette: > + %\VignetteIndexEntry{relic-history} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} +--- + +```{r, include = FALSE} +knitr::opts_chunk$set( + collapse = TRUE, + comment = "#>" +) +``` + +```{r setup} +library(relic) +library(igraph) +``` + + diff --git a/vignettes/targets.Rmd b/vignettes/targets.Rmd new file mode 100644 index 0000000..b2cbdb7 --- /dev/null +++ b/vignettes/targets.Rmd @@ -0,0 +1,39 @@ +--- +title: "Using `relic` with `targets`" +output: rmarkdown::html_vignette +vignette: > + %\VignetteIndexEntry{targets} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} +--- + +```{r, include = FALSE} +knitr::opts_chunk$set( + collapse = TRUE, + comment = "#>" +) +``` + +```{r setup} +library(relic) +``` + +`relic` is _most_ useful with `targets` when you are version-controlling your +targets objects and data. This means committing your target objects and files +directly to your git repository, using git LFS to store target objects, and/or +using [versioned cloud storage](https://books.ropensci.org/targets/cloud-storage.html) +to store target objects. For all of these cases, you generally want to commit +your `_targets/meta/meta` file to your git repository. This file contains +information th state of the pipeline. + +Even if you are not version-controlling your targets objects and data, you can +still make use of `relic` to inspect your pipeline history and also re-build +targets from previous versions. This vignette shows you how. + +# Targets and cloud storage + +## Setup + +If you want to follow along with this part of the tutorial, you'll need to install the MinIO server and client programs. These are used to set up a local server that emulates cloud storage. + +