diff --git a/.Rbuildignore b/.Rbuildignore index 423d7a1..4a171f5 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -14,3 +14,4 @@ ^cran-comments\.md$ ^CRAN-RELEASE$ ^\.httr-oauth$ +^codecov\.yml$ diff --git a/.github/.gitignore b/.github/.gitignore new file mode 100644 index 0000000..2d19fc7 --- /dev/null +++ b/.github/.gitignore @@ -0,0 +1 @@ +*.html diff --git a/.github/workflows/R-CMD-check.yaml b/.github/workflows/R-CMD-check.yaml new file mode 100644 index 0000000..201c9a2 --- /dev/null +++ b/.github/workflows/R-CMD-check.yaml @@ -0,0 +1,95 @@ +on: + push: + branches: + - master + pull_request: + branches: + - master + +name: R-CMD-check + +jobs: + R-CMD-check: + runs-on: ${{ matrix.config.os }} + + name: ${{ matrix.config.os }} (${{ matrix.config.r }}) + + strategy: + fail-fast: false + matrix: + config: + - {os: macOS-latest, r: 'devel'} + - {os: macOS-latest, r: 'release'} + - {os: windows-latest, r: 'release'} + - {os: ubuntu-16.04, r: 'release', rspm: "https://packagemanager.rstudio.com/cran/__linux__/xenial/latest"} + - {os: ubuntu-16.04, r: 'oldrel', rspm: "https://packagemanager.rstudio.com/cran/__linux__/xenial/latest"} + - {os: ubuntu-16.04, r: '3.5', rspm: "https://packagemanager.rstudio.com/cran/__linux__/xenial/latest"} + + env: + R_REMOTES_NO_ERRORS_FROM_WARNINGS: true + RSPM: ${{ matrix.config.rspm }} + GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} + + steps: + - uses: actions/checkout@v2 + + - uses: r-lib/actions/setup-r@master + with: + r-version: ${{ matrix.config.r }} + + - uses: r-lib/actions/setup-pandoc@master + + - name: Query dependencies + run: | + install.packages('remotes') + saveRDS(remotes::dev_package_deps(dependencies = TRUE), ".github/depends.Rds", version = 2) + writeLines(sprintf("R-%i.%i", getRversion()$major, getRversion()$minor), ".github/R-version") + shell: Rscript {0} + + - name: Cache R packages + if: runner.os != 'Windows' + uses: actions/cache@v1 + with: + path: ${{ env.R_LIBS_USER }} + key: ${{ runner.os }}-${{ hashFiles('.github/R-version') }}-1-${{ hashFiles('.github/depends.Rds') }} + restore-keys: ${{ runner.os }}-${{ hashFiles('.github/R-version') }}-1- + + - name: Install system dependencies + if: runner.os == 'Linux' + env: + RHUB_PLATFORM: linux-x86_64-ubuntu-gcc + run: | + Rscript -e "remotes::install_github('r-hub/sysreqs')" + sysreqs=$(Rscript -e "cat(sysreqs::sysreq_commands('DESCRIPTION'))") + sudo -s eval "$sysreqs" + + - name: Install dependencies + run: | + remotes::install_deps(dependencies = TRUE) + remotes::install_cran("rcmdcheck") + shell: Rscript {0} + + - name: Session info + run: | + options(width = 100) + pkgs <- installed.packages()[, "Package"] + sessioninfo::session_info(pkgs, include_base = TRUE) + shell: Rscript {0} + + - name: Check + env: + _R_CHECK_CRAN_INCOMING_: false + run: rcmdcheck::rcmdcheck(args = c("--no-manual", "--as-cran"), error_on = "warning", check_dir = "check") + shell: Rscript {0} + + - name: Show testthat output + if: always() + run: find check -name 'testthat.Rout*' -exec cat '{}' \; || true + shell: bash + + - name: Upload check results + if: failure() + uses: actions/upload-artifact@master + with: + name: ${{ runner.os }}-r${{ matrix.config.r }}-results + path: check diff --git a/.github/workflows/check_lintr.yaml b/.github/workflows/check_lintr.yaml new file mode 100644 index 0000000..051dc71 --- /dev/null +++ b/.github/workflows/check_lintr.yaml @@ -0,0 +1,10 @@ +on: [push] + +name: check-linters + +jobs: + check_linters: + runs-on: ubuntu-latest + name: Check for linters in the code + steps: + - uses: inbo/actions/lint_pkg@master diff --git a/.github/workflows/pkgdown.yaml b/.github/workflows/pkgdown.yaml new file mode 100644 index 0000000..2bf64e2 --- /dev/null +++ b/.github/workflows/pkgdown.yaml @@ -0,0 +1,45 @@ +on: + push: + branches: master + +name: pkgdown + +jobs: + pkgdown: + runs-on: macOS-latest + env: + GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} + steps: + - uses: actions/checkout@v2 + + - uses: r-lib/actions/setup-r@master + + - uses: r-lib/actions/setup-pandoc@master + + - name: Query dependencies + run: | + install.packages('remotes') + saveRDS(remotes::dev_package_deps(dependencies = TRUE), ".github/depends.Rds", version = 2) + writeLines(sprintf("R-%i.%i", getRversion()$major, getRversion()$minor), ".github/R-version") + shell: Rscript {0} + + - name: Cache R packages + uses: actions/cache@v1 + with: + path: ${{ env.R_LIBS_USER }} + key: ${{ runner.os }}-${{ hashFiles('.github/R-version') }}-1-${{ hashFiles('.github/depends.Rds') }} + restore-keys: ${{ runner.os }}-${{ hashFiles('.github/R-version') }}-1- + + - name: Install dependencies + run: | + install.packages("remotes") + remotes::install_deps(dependencies = TRUE) + remotes::install_dev("pkgdown") + shell: Rscript {0} + + - name: Install package + run: R CMD INSTALL . + + - name: Deploy package + run: pkgdown::deploy_to_branch(new_process = FALSE) + shell: Rscript {0} diff --git a/.github/workflows/pr-commands.yaml b/.github/workflows/pr-commands.yaml new file mode 100644 index 0000000..0d3cb71 --- /dev/null +++ b/.github/workflows/pr-commands.yaml @@ -0,0 +1,51 @@ +on: + issue_comment: + types: [created] +name: Commands +jobs: + document: + if: startsWith(github.event.comment.body, '/document') + name: document + runs-on: macOS-latest + env: + GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} + steps: + - uses: actions/checkout@v2 + - uses: r-lib/actions/pr-fetch@master + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + - uses: r-lib/actions/setup-r@master + - name: Install dependencies + run: Rscript -e 'install.packages(c("remotes", "roxygen2"))' -e 'remotes::install_deps(dependencies = TRUE)' + - name: Document + run: Rscript -e 'roxygen2::roxygenise()' + - name: commit + run: | + git add man/\* NAMESPACE + git commit -m 'Document' + - uses: r-lib/actions/pr-push@master + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + style: + if: startsWith(github.event.comment.body, '/style') + name: style + runs-on: macOS-latest + env: + GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} + steps: + - uses: actions/checkout@v2 + - uses: r-lib/actions/pr-fetch@master + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + - uses: r-lib/actions/setup-r@master + - name: Install dependencies + run: Rscript -e 'install.packages("styler")' + - name: Style + run: Rscript -e 'styler::style_pkg()' + - name: commit + run: | + git add \*.R + git commit -m 'Style' + - uses: r-lib/actions/pr-push@master + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/test-coverage.yaml b/.github/workflows/test-coverage.yaml new file mode 100644 index 0000000..3058d03 --- /dev/null +++ b/.github/workflows/test-coverage.yaml @@ -0,0 +1,46 @@ +on: + push: + branches: + - master + pull_request: + branches: + - master + +name: test-coverage + +jobs: + test-coverage: + runs-on: macOS-latest + env: + GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} + steps: + - uses: actions/checkout@v2 + + - uses: r-lib/actions/setup-r@master + + - uses: r-lib/actions/setup-pandoc@master + + - name: Query dependencies + run: | + install.packages('remotes') + saveRDS(remotes::dev_package_deps(dependencies = TRUE), ".github/depends.Rds", version = 2) + writeLines(sprintf("R-%i.%i", getRversion()$major, getRversion()$minor), ".github/R-version") + shell: Rscript {0} + + - name: Cache R packages + uses: actions/cache@v1 + with: + path: ${{ env.R_LIBS_USER }} + key: ${{ runner.os }}-${{ hashFiles('.github/R-version') }}-1-${{ hashFiles('.github/depends.Rds') }} + restore-keys: ${{ runner.os }}-${{ hashFiles('.github/R-version') }}-1- + + - name: Install dependencies + run: | + install.packages(c("remotes")) + remotes::install_deps(dependencies = TRUE) + remotes::install_cran("covr") + shell: Rscript {0} + + - name: Test coverage + run: covr::codecov() + shell: Rscript {0} diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 7284610..0000000 --- a/.travis.yml +++ /dev/null @@ -1,71 +0,0 @@ -# R for travis: see documentation at https://docs.travis-ci.com/user/languages/r -# Default configuration for use with tic package -# Usually you shouldn't need to change the first part of the file - -# DO NOT CHANGE THE CODE BELOW -before_install: R -q -e 'install.packages(c("remotes", "curl")); remotes::install_github("ropenscilabs/tic"); tic::prepare_all_stages(); tic::before_install()' -install: R -q -e 'tic::install()' -after_install: R -q -e 'tic::after_install()' -before_script: R -q -e 'tic::before_script()' -script: R -q -e 'tic::script()' -after_success: R -q -e 'tic::after_success()' -after_failure: R -q -e 'tic::after_failure()' -before_deploy: R -q -e 'tic::before_deploy()' -deploy: - provider: script - script: R -q -e 'tic::deploy()' - on: - branch: master - dist: xenial - condition: - - $TRAVIS_PULL_REQUEST = false - - $TRAVIS_EVENT_TYPE != cron - - $TRAVIS_R_VERSION_STRING = release -after_deploy: R -q -e 'tic::after_deploy()' -after_script: R -q -e 'tic::after_script()' -# DO NOT CHANGE THE CODE ABOVE - -# Custom parts: - -# Header -language: r -latex: false -matrix: - include: - - dist: trusty - r: oldrel - addons: - apt: - packages: - - libgit2-dev - - dist: xenial - r: release - addons: - apt: - packages: - - libgit2-dev - - dist: xenial - r: devel - addons: - apt: - packages: - - libgit2-dev - - os: osx - r: release - brew_packages: openssl -sudo: false -cache: packages - -#env -env: - global: - - _R_CHECK_FORCE_SUGGESTS_=false - - MAKEFLAGS="-j 2" - -notifications: - email: - on_success: change - on_failure: change - -#services -services: diff --git a/DESCRIPTION b/DESCRIPTION index 6167c9a..5b7cd70 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,47 +1,58 @@ Package: git2rdata Title: Store and Retrieve Data.frames in a Git Repository -Version: 0.2.1 -Authors@R: c( - person( - "Thierry", "Onkelinx", role = c("aut", "cre"), - email = "thierry.onkelinx@inbo.be", - comment = c(ORCID = "0000-0001-8804-4216")), - person( - "Floris", "Vanderhaeghe", role = "ctb", - email = "floris.vanderhaeghe@inbo.be", - comment = c(ORCID = "0000-0002-6378-6229")), - person( - "Peter", "Desmet", role = "ctb", - email = "peter.desmet@inbo.be", - comment = c(ORCID = "0000-0002-8442-8025")), - person( - "Els", "Lommelen", role = "ctb", - email = "els.lommelen@inbo.be", - comment = c(ORCID = "0000-0002-3481-5684")), - person( - "Research Institute for Nature and Forest", - role = c("cph", "fnd"), email = "info@inbo.be")) -Description: Make versioning of data.frame easy and efficient using git repositories. -Depends: R (>= 3.5.0) +Version: 0.2.1.9000 +Authors@R: + c(person(given = "Thierry", + family = "Onkelinx", + role = c("aut", "cre"), + email = "thierry.onkelinx@inbo.be", + comment = c(ORCID = "0000-0001-8804-4216")), + person(given = "Floris", + family = "Vanderhaeghe", + role = "ctb", + email = "floris.vanderhaeghe@inbo.be", + comment = c(ORCID = "0000-0002-6378-6229")), + person(given = "Peter", + family = "Desmet", + role = "ctb", + email = "peter.desmet@inbo.be", + comment = c(ORCID = "0000-0002-8442-8025")), + person(given = "Els", + family = "Lommelen", + role = "ctb", + email = "els.lommelen@inbo.be", + comment = c(ORCID = "0000-0002-3481-5684")), + person(given = "Research Institute for Nature and Forest", + role = c("cph", "fnd"), + email = "info@inbo.be")) +Description: Make versioning of data.frame easy and efficient + using git repositories. +License: GPL-3 +URL: https://github.com/ropensci/git2rdata, + https://doi.org/10.5281/zenodo.1485309 +BugReports: https://github.com/ropensci/git2rdata/issues +Depends: + R (>= 3.5.0) Imports: - assertthat, - git2r (>= 0.23.0), - methods, - yaml + assertthat, + git2r (>= 0.23.0), + methods, + yaml Suggests: - spelling, - ggplot2, - knitr, - microbenchmark, - rmarkdown, - testthat -License: GPL-3 + covr, + ggplot2, + knitr, + microbenchmark, + rmarkdown, + spelling, + testthat +VignetteBuilder: + knitr Encoding: UTF-8 +Language: en-GB LazyData: true Roxygen: list(markdown = TRUE) -RoxygenNote: 6.1.1 -URL: https://github.com/ropensci/git2rdata, https://doi.org/10.5281/zenodo.1485309 -BugReports: https://github.com/ropensci/git2rdata/issues +RoxygenNote: 7.1.0 Collate: 'clean_data_path.R' 'datahash.R' @@ -58,5 +69,3 @@ Collate: 'relabel.R' 'upgrade_data.R' 'utils.R' -VignetteBuilder: knitr -Language: en-GB diff --git a/NEWS.md b/NEWS.md index 453c8e6..27753a5 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -git2rdata 0.2.1 (2020-02-03) +git2rdata 0.2.1 (2020-03-02) ================================= ### Bugfixes diff --git a/R/utils.R b/R/utils.R index bc4b7e1..b93e3a5 100644 --- a/R/utils.R +++ b/R/utils.R @@ -2,6 +2,6 @@ # gramr is avaible from https://github.com/ropenscilabs/gramr release_questions <- function() { # nocov start c( - 'Did you ran `gramr::check_project(exclude_chunks = TRUE)`' + "Did you ran `gramr::check_project(exclude_chunks = TRUE)`" ) } # nocov end diff --git a/README.md b/README.md index 019b1a9..6585616 100644 --- a/README.md +++ b/README.md @@ -9,13 +9,12 @@ [![Licence](https://img.shields.io/badge/licence-GPL--3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0.en.html) [![minimal R version](https://img.shields.io/badge/R%3E%3D-3.5.0-6666ff.svg)](https://cran.r-project.org/) [![DOI](https://zenodo.org/badge/147685405.svg)](https://zenodo.org/badge/latestdoi/147685405) -[![Travis-CI Build Status](https://travis-ci.org/ropensci/git2rdata.svg?branch=master)](https://travis-ci.org/ropensci/git2rdata) -[![AppVeyor Build status](https://ci.appveyor.com/api/projects/status/cfbjb835fqb3dc7m/branch/master?svg=true)](https://ci.appveyor.com/project/ThierryO/git2rdata-n60yg/branch/master) -[![codecov](https://codecov.io/gh/ropensci/git2rdata/branch/master/graph/badge.svg)](https://codecov.io/gh/ropensci/git2rdata) ![GitHub forks](https://img.shields.io/github/forks/ropensci/git2rdata.svg?style=social) ![GitHub stars](https://img.shields.io/github/stars/ropensci/git2rdata.svg?style=social) ![GitHub code size in bytes](https://img.shields.io/github/languages/code-size/ropensci/git2rdata.svg) ![GitHub repo size](https://img.shields.io/github/repo-size/ropensci/git2rdata.svg) +[![Codecov test coverage](https://codecov.io/gh/ropensci/git2rdata/branch/master/graph/badge.svg)](https://codecov.io/gh/ropensci/git2rdata?branch=master) +[![R build status](https://github.com/ropensci/git2rdata/workflows/R-CMD-check/badge.svg)](https://github.com/ropensci/git2rdata/actions)
diff --git a/appveyor.yml b/appveyor.yml deleted file mode 100644 index 45d9160..0000000 --- a/appveyor.yml +++ /dev/null @@ -1,55 +0,0 @@ -# DO NOT CHANGE the "init" and "install" sections below - -# branches to build -branches: - # blacklist - except: - - gh-pages - -# Download script file from GitHub -init: - ps: | - $ErrorActionPreference = "Stop" - Invoke-WebRequest http://raw.github.com/krlmlr/r-appveyor/master/scripts/appveyor-tool.ps1 -OutFile "..\appveyor-tool.ps1" - Import-Module '..\appveyor-tool.ps1' -install: - ps: Bootstrap - -cache: - - C:\RLibrary - -# Adapt as necessary starting from here - -build_script: - - travis-tool.sh install_deps - -test_script: - - travis-tool.sh run_tests - -on_failure: - - 7z a failure.zip *.Rcheck\* - - appveyor PushArtifact failure.zip - -environment: - GITHUB_PAT: - secure: VXO22OHLkl4YhVIomSMwCZyOTx03Xf2WICaVng9xH7gISlAg8a+qrt1DtFtk8sK5 - PKGTYPE: 'win.binary' - -artifacts: - - path: '*.Rcheck\**\*.log' - name: Logs - - - path: '*.Rcheck\**\*.out' - name: Logs - - - path: '*.Rcheck\**\*.fail' - name: Logs - - - path: '*.Rcheck\**\*.Rout' - name: Logs - - - path: '\*_*.tar.gz' - name: Bits - - - path: '\*_*.zip' - name: Bits diff --git a/codecov.yml b/codecov.yml new file mode 100644 index 0000000..04c5585 --- /dev/null +++ b/codecov.yml @@ -0,0 +1,14 @@ +comment: false + +coverage: + status: + project: + default: + target: auto + threshold: 1% + informational: true + patch: + default: + target: auto + threshold: 1% + informational: true diff --git a/man-roxygen/example-prune.R b/man-roxygen/example-prune.R index d8fcba8..8046fc7 100644 --- a/man-roxygen/example-prune.R +++ b/man-roxygen/example-prune.R @@ -72,4 +72,3 @@ #' rev(list.files(repo_path, full.names = TRUE, recursive = TRUE, #' include.dirs = TRUE, all.files = TRUE)), #' repo_path) - diff --git a/man/commit.Rd b/man/commit.Rd index 55f2914..92e152c 100644 --- a/man/commit.Rd +++ b/man/commit.Rd @@ -7,8 +7,11 @@ See \code{\link[git2r]{commit}} in \code{git2r}. } \seealso{ -Other version_control: \code{\link{pull}}, - \code{\link{push}}, \code{\link{recent_commit}}, - \code{\link{repository}}, \code{\link{status}} +Other version_control: +\code{\link{pull}()}, +\code{\link{push}()}, +\code{\link{recent_commit}()}, +\code{\link{repository}()}, +\code{\link{status}()} } \concept{version_control} diff --git a/man/git2rdata-package.Rd b/man/git2rdata-package.Rd index 91ae826..f1dc2b7 100644 --- a/man/git2rdata-package.Rd +++ b/man/git2rdata-package.Rd @@ -18,13 +18,13 @@ Useful links: } \author{ -\strong{Maintainer}: Thierry Onkelinx \email{thierry.onkelinx@inbo.be} (0000-0001-8804-4216) +\strong{Maintainer}: Thierry Onkelinx \email{thierry.onkelinx@inbo.be} (\href{https://orcid.org/0000-0001-8804-4216}{ORCID}) Other contributors: \itemize{ - \item Floris Vanderhaeghe \email{floris.vanderhaeghe@inbo.be} (0000-0002-6378-6229) [contributor] - \item Peter Desmet \email{peter.desmet@inbo.be} (0000-0002-8442-8025) [contributor] - \item Els Lommelen \email{els.lommelen@inbo.be} (0000-0002-3481-5684) [contributor] + \item Floris Vanderhaeghe \email{floris.vanderhaeghe@inbo.be} (\href{https://orcid.org/0000-0002-6378-6229}{ORCID}) [contributor] + \item Peter Desmet \email{peter.desmet@inbo.be} (\href{https://orcid.org/0000-0002-8442-8025}{ORCID}) [contributor] + \item Els Lommelen \email{els.lommelen@inbo.be} (\href{https://orcid.org/0000-0002-3481-5684}{ORCID}) [contributor] \item Research Institute for Nature and Forest \email{info@inbo.be} [copyright holder, funder] } diff --git a/man/is_git2rdata.Rd b/man/is_git2rdata.Rd index 31cd867..86bdf6b 100644 --- a/man/is_git2rdata.Rd +++ b/man/is_git2rdata.Rd @@ -55,7 +55,9 @@ is_git2rdata("iris", root) junk <- file.remove(list.files(root, full.names = TRUE), root) } \seealso{ -Other internal: \code{\link{is_git2rmeta}}, - \code{\link{meta}}, \code{\link{upgrade_data}} +Other internal: +\code{\link{is_git2rmeta}()}, +\code{\link{meta}()}, +\code{\link{upgrade_data}()} } \concept{internal} diff --git a/man/is_git2rmeta.Rd b/man/is_git2rmeta.Rd index b86ab4a..e5e085c 100644 --- a/man/is_git2rmeta.Rd +++ b/man/is_git2rmeta.Rd @@ -58,7 +58,9 @@ is_git2rdata("iris", root) junk <- file.remove(list.files(root, full.names = TRUE), root) } \seealso{ -Other internal: \code{\link{is_git2rdata}}, - \code{\link{meta}}, \code{\link{upgrade_data}} +Other internal: +\code{\link{is_git2rdata}()}, +\code{\link{meta}()}, +\code{\link{upgrade_data}()} } \concept{internal} diff --git a/man/list_data.Rd b/man/list_data.Rd index b5105c0..96953a3 100644 --- a/man/list_data.Rd +++ b/man/list_data.Rd @@ -34,7 +34,7 @@ dir.create(root) # screen output junk <- write_vc(iris[1:6, ], "iris", root, sorting = "Sepal.Length") # write a standard tab separate file (non git2rdata object) -write.table(iris, file = file.path(root, "standard.tsv"), sep = "\\t") +write.table(iris, file = file.path(root, "standard.tsv"), sep = "\t") # write a YAML file yml <- list( authors = list( @@ -99,8 +99,11 @@ junk <- file.remove( repo_path) } \seealso{ -Other storage: \code{\link{prune_meta}}, - \code{\link{read_vc}}, \code{\link{relabel}}, - \code{\link{rm_data}}, \code{\link{write_vc}} +Other storage: +\code{\link{prune_meta}()}, +\code{\link{read_vc}()}, +\code{\link{relabel}()}, +\code{\link{rm_data}()}, +\code{\link{write_vc}()} } \concept{storage} diff --git a/man/meta.Rd b/man/meta.Rd index 2b83b2c..d1f617b 100644 --- a/man/meta.Rd +++ b/man/meta.Rd @@ -15,8 +15,7 @@ meta(x, ...) \method{meta}{character}(x, na = "NA", ...) -\method{meta}{factor}(x, optimize = TRUE, na = "NA", index, - strict = TRUE, ...) +\method{meta}{factor}(x, optimize = TRUE, na = "NA", index, strict = TRUE, ...) \method{meta}{logical}(x, optimize = TRUE, ...) @@ -24,8 +23,7 @@ meta(x, ...) \method{meta}{Date}(x, optimize = TRUE, ...) -\method{meta}{data.frame}(x, optimize = TRUE, na = "NA", sorting, - strict = TRUE, ...) +\method{meta}{data.frame}(x, optimize = TRUE, na = "NA", sorting, strict = TRUE, ...) } \arguments{ \item{x}{the vector.} @@ -80,7 +78,7 @@ The same code on a different locale might result in a different sorting. Add \code{strict = FALSE} to enforce the new order of factor levels. } \examples{ -meta(c(NA, "'NA'", '"NA"', "abc\\tdef", "abc\\ndef")) +meta(c(NA, "'NA'", '"NA"', "abc\tdef", "abc\ndef")) meta(1:3) meta(seq(1, 3, length = 4)) meta(factor(c("b", NA, "NA"), levels = c("NA", "b", "c"))) @@ -99,7 +97,9 @@ meta(as.Date("2019-02-01")) meta(as.Date("2019-02-01"), optimize = FALSE) } \seealso{ -Other internal: \code{\link{is_git2rdata}}, - \code{\link{is_git2rmeta}}, \code{\link{upgrade_data}} +Other internal: +\code{\link{is_git2rdata}()}, +\code{\link{is_git2rmeta}()}, +\code{\link{upgrade_data}()} } \concept{internal} diff --git a/man/prune_meta.Rd b/man/prune_meta.Rd index 677ad4f..9a0b6fd 100644 --- a/man/prune_meta.Rd +++ b/man/prune_meta.Rd @@ -7,8 +7,7 @@ \usage{ prune_meta(root = ".", path = NULL, recursive = TRUE, ...) -\method{prune_meta}{git_repository}(root, path = NULL, - recursive = TRUE, ..., stage = FALSE) +\method{prune_meta}{git_repository}(root, path = NULL, recursive = TRUE, ..., stage = FALSE) } \arguments{ \item{root}{The root of a project. Can be a file path or a \code{git-repository}. @@ -49,7 +48,7 @@ dir.create(root) # screen output junk <- write_vc(iris[1:6, ], "iris", root, sorting = "Sepal.Length") # write a standard tab separate file (non git2rdata object) -write.table(iris, file = file.path(root, "standard.tsv"), sep = "\\t") +write.table(iris, file = file.path(root, "standard.tsv"), sep = "\t") # write a YAML file yml <- list( authors = list( @@ -114,8 +113,11 @@ junk <- file.remove( repo_path) } \seealso{ -Other storage: \code{\link{list_data}}, - \code{\link{read_vc}}, \code{\link{relabel}}, - \code{\link{rm_data}}, \code{\link{write_vc}} +Other storage: +\code{\link{list_data}()}, +\code{\link{read_vc}()}, +\code{\link{relabel}()}, +\code{\link{rm_data}()}, +\code{\link{write_vc}()} } \concept{storage} diff --git a/man/pull.Rd b/man/pull.Rd index 78ba631..77b7f3a 100644 --- a/man/pull.Rd +++ b/man/pull.Rd @@ -7,8 +7,11 @@ See \code{\link[git2r]{pull}} in \code{git2r}. } \seealso{ -Other version_control: \code{\link{commit}}, - \code{\link{push}}, \code{\link{recent_commit}}, - \code{\link{repository}}, \code{\link{status}} +Other version_control: +\code{\link{commit}()}, +\code{\link{push}()}, +\code{\link{recent_commit}()}, +\code{\link{repository}()}, +\code{\link{status}()} } \concept{version_control} diff --git a/man/push.Rd b/man/push.Rd index 5d4c426..e352621 100644 --- a/man/push.Rd +++ b/man/push.Rd @@ -7,8 +7,11 @@ See \code{\link[git2r]{push}} in \code{git2r}. } \seealso{ -Other version_control: \code{\link{commit}}, - \code{\link{pull}}, \code{\link{recent_commit}}, - \code{\link{repository}}, \code{\link{status}} +Other version_control: +\code{\link{commit}()}, +\code{\link{pull}()}, +\code{\link{recent_commit}()}, +\code{\link{repository}()}, +\code{\link{status}()} } \concept{version_control} diff --git a/man/read_vc.Rd b/man/read_vc.Rd index 5241730..f2431e5 100644 --- a/man/read_vc.Rd +++ b/man/read_vc.Rd @@ -96,8 +96,11 @@ junk <- file.remove( repo_path) } \seealso{ -Other storage: \code{\link{list_data}}, - \code{\link{prune_meta}}, \code{\link{relabel}}, - \code{\link{rm_data}}, \code{\link{write_vc}} +Other storage: +\code{\link{list_data}()}, +\code{\link{prune_meta}()}, +\code{\link{relabel}()}, +\code{\link{rm_data}()}, +\code{\link{write_vc}()} } \concept{storage} diff --git a/man/recent_commit.Rd b/man/recent_commit.Rd index a3705b6..2204c9c 100644 --- a/man/recent_commit.Rd +++ b/man/recent_commit.Rd @@ -90,8 +90,11 @@ junk <- file.remove( repo_path) } \seealso{ -Other version_control: \code{\link{commit}}, - \code{\link{pull}}, \code{\link{push}}, - \code{\link{repository}}, \code{\link{status}} +Other version_control: +\code{\link{commit}()}, +\code{\link{pull}()}, +\code{\link{push}()}, +\code{\link{repository}()}, +\code{\link{status}()} } \concept{version_control} diff --git a/man/relabel.Rd b/man/relabel.Rd index 80db7c4..0a08c79 100644 --- a/man/relabel.Rd +++ b/man/relabel.Rd @@ -87,8 +87,11 @@ junk <- file.remove( repo_path) } \seealso{ -Other storage: \code{\link{list_data}}, - \code{\link{prune_meta}}, \code{\link{read_vc}}, - \code{\link{rm_data}}, \code{\link{write_vc}} +Other storage: +\code{\link{list_data}()}, +\code{\link{prune_meta}()}, +\code{\link{read_vc}()}, +\code{\link{rm_data}()}, +\code{\link{write_vc}()} } \concept{storage} diff --git a/man/repository.Rd b/man/repository.Rd index a6e8cad..b8e39e4 100644 --- a/man/repository.Rd +++ b/man/repository.Rd @@ -7,8 +7,11 @@ See \code{\link[git2r]{repository}} in \code{git2r}. } \seealso{ -Other version_control: \code{\link{commit}}, - \code{\link{pull}}, \code{\link{push}}, - \code{\link{recent_commit}}, \code{\link{status}} +Other version_control: +\code{\link{commit}()}, +\code{\link{pull}()}, +\code{\link{push}()}, +\code{\link{recent_commit}()}, +\code{\link{status}()} } \concept{version_control} diff --git a/man/rm_data.Rd b/man/rm_data.Rd index ab9069e..6478e66 100644 --- a/man/rm_data.Rd +++ b/man/rm_data.Rd @@ -7,9 +7,14 @@ \usage{ rm_data(root = ".", path = NULL, recursive = TRUE, ...) -\method{rm_data}{git_repository}(root, path = NULL, recursive = TRUE, - ..., stage = FALSE, type = c("unmodified", "modified", "ignored", - "all")) +\method{rm_data}{git_repository}( + root, + path = NULL, + recursive = TRUE, + ..., + stage = FALSE, + type = c("unmodified", "modified", "ignored", "all") +) } \arguments{ \item{root}{The root of a project. Can be a file path or a \code{git-repository}. @@ -59,7 +64,7 @@ dir.create(root) # screen output junk <- write_vc(iris[1:6, ], "iris", root, sorting = "Sepal.Length") # write a standard tab separate file (non git2rdata object) -write.table(iris, file = file.path(root, "standard.tsv"), sep = "\\t") +write.table(iris, file = file.path(root, "standard.tsv"), sep = "\t") # write a YAML file yml <- list( authors = list( @@ -124,8 +129,11 @@ junk <- file.remove( repo_path) } \seealso{ -Other storage: \code{\link{list_data}}, - \code{\link{prune_meta}}, \code{\link{read_vc}}, - \code{\link{relabel}}, \code{\link{write_vc}} +Other storage: +\code{\link{list_data}()}, +\code{\link{prune_meta}()}, +\code{\link{read_vc}()}, +\code{\link{relabel}()}, +\code{\link{write_vc}()} } \concept{storage} diff --git a/man/status.Rd b/man/status.Rd index 372a51d..8751eac 100644 --- a/man/status.Rd +++ b/man/status.Rd @@ -7,8 +7,11 @@ See \code{\link[git2r]{status}} in \code{git2r}. } \seealso{ -Other version_control: \code{\link{commit}}, - \code{\link{pull}}, \code{\link{push}}, - \code{\link{recent_commit}}, \code{\link{repository}} +Other version_control: +\code{\link{commit}()}, +\code{\link{pull}()}, +\code{\link{push}()}, +\code{\link{recent_commit}()}, +\code{\link{repository}()} } \concept{version_control} diff --git a/man/upgrade_data.Rd b/man/upgrade_data.Rd index 1d34204..d8e54d4 100644 --- a/man/upgrade_data.Rd +++ b/man/upgrade_data.Rd @@ -7,8 +7,15 @@ \usage{ upgrade_data(file, root = ".", verbose, ..., path) -\method{upgrade_data}{git_repository}(file, root = ".", verbose = TRUE, - ..., path, stage = FALSE, force = FALSE) +\method{upgrade_data}{git_repository}( + file, + root = ".", + verbose = TRUE, + ..., + path, + stage = FALSE, + force = FALSE +) } \arguments{ \item{file}{the name of the git2rdata object. Git2rdata objects cannot @@ -59,7 +66,9 @@ upgrade_data(path = ".", root = root) junk <- file.remove(list.files(root, full.names = TRUE), root) } \seealso{ -Other internal: \code{\link{is_git2rdata}}, - \code{\link{is_git2rmeta}}, \code{\link{meta}} +Other internal: +\code{\link{is_git2rdata}()}, +\code{\link{is_git2rmeta}()}, +\code{\link{meta}()} } \concept{internal} diff --git a/man/write_vc.Rd b/man/write_vc.Rd index 2b85132..1385b35 100644 --- a/man/write_vc.Rd +++ b/man/write_vc.Rd @@ -5,11 +5,29 @@ \alias{write_vc.git_repository} \title{Store a Data.Frame as a Git2rdata Object on Disk} \usage{ -write_vc(x, file, root = ".", sorting, strict = TRUE, - optimize = TRUE, na = "NA", ...) +write_vc( + x, + file, + root = ".", + sorting, + strict = TRUE, + optimize = TRUE, + na = "NA", + ... +) -\method{write_vc}{git_repository}(x, file, root, sorting, strict = TRUE, - optimize = TRUE, na = "NA", ..., stage = FALSE, force = FALSE) +\method{write_vc}{git_repository}( + x, + file, + root, + sorting, + strict = TRUE, + optimize = TRUE, + na = "NA", + ..., + stage = FALSE, + force = FALSE +) } \arguments{ \item{x}{the \code{data.frame}.} @@ -130,8 +148,11 @@ junk <- file.remove( repo_path) } \seealso{ -Other storage: \code{\link{list_data}}, - \code{\link{prune_meta}}, \code{\link{read_vc}}, - \code{\link{relabel}}, \code{\link{rm_data}} +Other storage: +\code{\link{list_data}()}, +\code{\link{prune_meta}()}, +\code{\link{read_vc}()}, +\code{\link{relabel}()}, +\code{\link{rm_data}()} } \concept{storage} diff --git a/tic.R b/tic.R index 9c703ec..caa2ebb 100644 --- a/tic.R +++ b/tic.R @@ -1,4 +1,4 @@ -add_package_checks() +do_package_checks() if (Sys.getenv("id_rsa") != "" && inherits(ci(), "TravisCI")) { # pkgdown documentation can be built optionally. Other example criteria: diff --git a/vignettes/efficiency.Rmd b/vignettes/efficiency.Rmd index 56380af..7f9cb62 100644 --- a/vignettes/efficiency.Rmd +++ b/vignettes/efficiency.Rmd @@ -21,32 +21,27 @@ opts_chunk$set( comment = "#>" ) library(ggplot2) -inbo_colours <- c("#959B38", "#729BB7", "#E87837", "#BDDDD7", "#E4E517", +inbo_colours <- c("#959B38", "#729BB7", "#E87837", "#BDDDD7", "#E4E517", "#843860", "#C04384", "#C2C444", "#685457") theme_inbo <- function(base_size = 12, base_family = "") { - rect.bg <- "white" - legend.bg <- "white" - panel.bg <- "#F3F3F3" - panel.grid <- "white" - plot.bg <- "white" half_line <- base_size / 2 theme( - line = element_line(colour = "black", size = 0.5, linetype = 1, + line = element_line(colour = "black", size = 0.5, linetype = 1, lineend = "butt"), - rect = element_rect(fill = rect.bg, colour = "black", size = 0.5, + rect = element_rect(fill = "white", colour = "black", size = 0.5, linetype = 1), - text = element_text(family = base_family, face = "plain", - colour = "#843860", size = base_size, hjust = 0.5, - vjust = 0.5, angle = 0, lineheight = 0.9, + text = element_text(family = base_family, face = "plain", + colour = "#843860", size = base_size, hjust = 0.5, + vjust = 0.5, angle = 0, lineheight = 0.9, margin = margin(), debug = FALSE), axis.line = element_blank(), axis.line.x = element_blank(), axis.line.y = element_blank(), axis.text = element_text(size = rel(0.8)), - axis.text.x = element_text(margin = margin(t = 0.8 * half_line / 2), + axis.text.x = element_text(margin = margin(t = 0.8 * half_line / 2), vjust = 1), axis.text.x.top = NULL, - axis.text.y = element_text(margin = margin(r = 0.8 * half_line / 2), + axis.text.y = element_text(margin = margin(r = 0.8 * half_line / 2), hjust = 1), axis.text.y.right = NULL, axis.ticks = element_line(), @@ -61,8 +56,8 @@ theme_inbo <- function(base_size = 12, base_family = "") { angle = 90 ), axis.title.y.right = NULL, - legend.background = element_rect(colour = NA, fill = legend.bg), - legend.key = element_rect(fill = panel.bg, colour = NA), + legend.background = element_rect(colour = NA, fill = "white"), + legend.key = element_rect(fill = "#F3F3F3", colour = NA), legend.key.size = unit(1.2, "lines"), legend.key.height = NULL, legend.key.width = NULL, @@ -72,21 +67,21 @@ theme_inbo <- function(base_size = 12, base_family = "") { legend.spacing.y = NULL, legend.text = element_text(size = rel(0.8)), legend.text.align = NULL, - legend.title = element_text(size = rel(0.8), face = "bold", hjust = 0, + legend.title = element_text(size = rel(0.8), face = "bold", hjust = 0, colour = "black"), legend.title.align = NULL, legend.position = "right", legend.direction = NULL, legend.justification = "center", legend.box = NULL, - legend.box.margin = margin(t = half_line, r = half_line, b = half_line, + legend.box.margin = margin(t = half_line, r = half_line, b = half_line, l = half_line), - legend.box.background = element_rect(colour = NA, fill = legend.bg), + legend.box.background = element_rect(colour = NA, fill = "white"), legend.box.spacing = unit(0.2, "cm"), - panel.background = element_rect(fill = panel.bg, colour = NA), + panel.background = element_rect(fill = "#F3F3F3", colour = NA), panel.border = element_blank(), - panel.grid = element_line(colour = panel.grid), - panel.grid.minor = element_line(colour = panel.grid, size = 0.25), + panel.grid = element_line(colour = "white"), + panel.grid.minor = element_line(colour = "white", size = 0.25), panel.spacing = unit(half_line, "pt"), panel.spacing.x = NULL, panel.spacing.y = NULL, @@ -99,14 +94,14 @@ theme_inbo <- function(base_size = 12, base_family = "") { strip.switch.pad.grid = unit(0.1, "cm"), strip.switch.pad.wrap = unit(0.1, "cm"), strip.placement = "outside", - plot.background = element_rect(colour = NA, fill = plot.bg), - plot.title = element_text(size = rel(1.2), + plot.background = element_rect(colour = NA, fill = "white"), + plot.title = element_text(size = rel(1.2), margin = margin(0, 0, half_line, 0)), plot.subtitle = element_text(size = rel(1), margin = margin(0, 0, half_line, 0)), plot.caption = element_text(size = rel(0.6), margin = margin(0, 0, half_line, 0)), - plot.margin = margin(t = half_line, r = half_line, b = half_line, + plot.margin = margin(t = half_line, r = half_line, b = half_line, l = half_line), plot.tag = element_text(size = rel(1.2), hjust = 0.5, vjust = 0.5), plot.tag.position = "topleft", @@ -186,12 +181,15 @@ This results in more compact files. ```{r table_file_size, echo = FALSE} kable( data.frame( - method = c("saveRDS()", "write_vc(), optimized", "write_vc(), verbose", + method = c("saveRDS()", "write_vc(), optimized", "write_vc(), verbose", "write.table()"), file_size = c(rds_size, optim_size, verbose_size, base_size) / 2 ^ 10, relative = c(rds_size, optim_size, verbose_size, base_size) / base_size ), - caption = "Resulting file sizes (in kB) and file sizes relative to the size of write.table().", + caption = paste( + "Resulting file sizes (in kB) and file sizes relative to the size of", + "write.table()." + ), digits = 2 ) ``` @@ -240,7 +238,7 @@ ggplot(f_ratio, aes(x = label_length, y = ratio, colour = levels)) + geom_hline(yintercept = 1, linetype = 2) + geom_line() + scale_x_continuous("label length (characters)") + - scale_y_continuous("optimized bytes / verbose bytes", + scale_y_continuous("optimized bytes / verbose bytes", breaks = seq(0, 1.25, by = 0.25)) + scale_colour_manual("number of \nlevels", values = inbo_colours) ``` @@ -276,7 +274,7 @@ ggplot(f_ratio, aes(x = observations, y = ratio, colour = levels)) + geom_hline(yintercept = 1, linetype = 2) + geom_line() + scale_x_log10() + - scale_y_continuous("optimized bytes / verbose bytes", + scale_y_continuous("optimized bytes / verbose bytes", breaks = seq(0, 1.25, by = 0.25)) + scale_colour_manual("number of \nlevels", values = inbo_colours) ``` @@ -295,15 +293,15 @@ library(git2r) tmp_repo <- function() { root <- tempfile("git2rdata-efficient-git") dir.create(root) - repo <- init(root) - config(repo, user.name = "me", user.email = "me@me.com") + repo <- init(root) # nolint + config(repo, user.name = "me", user.email = "me@me.com") # nolint return(repo) } commit_and_size <- function(repo, filename) { add(repo, filename) commit(repo, "test", session = TRUE) git_size <- system( - sprintf("cd %s\ngit gc\ngit count-objects -v", dirname(repo$path)), + sprintf("cd %s\ngit gc\ngit count-objects -v", dirname(repo$path)), intern = TRUE ) git_size <- git_size[grep("size-pack", git_size)] @@ -320,7 +318,7 @@ repo_size <- replicate( 100, { observed_subset <- rbinom(nrow(airbag), size = 1, prob = 0.9) == 1 this <- airbag[ - sample(which(observed_subset)), + sample(which(observed_subset)), sample(ncol(airbag)) ] this_sorted <- airbag[observed_subset, ] @@ -337,8 +335,8 @@ repo_size <- replicate( c( write.table = commit_and_size(repo_wt, fn_wt), write.table.sorted = commit_and_size(repo_wts, fn_wts), - saveRDS = commit_and_size(repo_rds, fn_rds), - write_vc.optimized = commit_and_size(repo_wvco, fn_wvco), + saveRDS = commit_and_size(repo_rds, fn_rds), + write_vc.optimized = commit_and_size(repo_wvco, fn_wvco), write_vc.verbose = commit_and_size(repo_wvcv, fn_wvcv) ) }) @@ -369,28 +367,31 @@ rs <- lapply( function(x) { if (x == "saveRDS") { fun <- "saveRDS" - optimized = "yes" + optimized <- "yes" } else if (x == "write_vc.optimized") { fun <- "write_vc" - optimized = "yes" + optimized <- "yes" } else if (x == "write_vc.verbose") { fun <- "write_vc" - optimized = "no" + optimized <- "no" } else if (x == "write.table") { fun <- "write.table" - optimized = "no" + optimized <- "no" } else if (x == "write.table.sorted") { fun <- "write.table" - optimized = "yes" + optimized <- "yes" } - data.frame(commit = seq_along(repo_size[x, ]), size = repo_size[x, ], + data.frame(commit = seq_along(repo_size[x, ]), size = repo_size[x, ], rel_size = repo_size[x, ] / repo_size["write.table.sorted", ], fun = fun, optimized = optimized, stringsAsFactors = FALSE) } ) rs <- do.call(rbind, rs) rs$optimized <- factor(rs$optimized, levels = c("yes", "no")) -ggplot(rs, aes(x = commit, y = size / 2^10, colour = fun, linetype = optimized)) + +ggplot( + rs, + aes(x = commit, y = size / 2^10, colour = fun, linetype = optimized) +) + geom_line() + scale_y_continuous("repo size (in MiB)") + scale_colour_manual("function", values = inbo_colours) @@ -399,7 +400,7 @@ ggplot(rs, aes(x = commit, y = size / 2^10, colour = fun, linetype = optimized)) ```{r plot_rel_git_size, echo = FALSE, fig.cap = "Relative size of the git repository when compared to write.table()."} ggplot(rs, aes(x = commit, y = rel_size, colour = fun, linetype = optimized)) + geom_line() + - scale_y_continuous("size relative to sorted write.table()", breaks = 0:10) + + scale_y_continuous("size relative to sorted write.table()", breaks = 0:10) + scale_colour_manual("function", values = inbo_colours) ``` @@ -415,14 +416,16 @@ mb <- microbenchmark( write.table = write.table(airbag, file.path(root, "base_R.tsv"), sep = "\t"), saveRDS = saveRDS(airbag, file.path(root, "base_R.rds")), write_vc.optim = write_vc(airbag, "airbag_optimize", root, sorting = "X"), - write_vc.verbose = write_vc(airbag, "airbag_verbose", root, sorting = "X", + write_vc.verbose = write_vc(airbag, "airbag_verbose", root, sorting = "X", optimize = FALSE) ) mb$time <- mb$time / 1e6 ``` ```{r store_file_timings, echo = FALSE} -if (system.file("efficiency", "file_timings.rds", package = "git2rdata") == "") { +if ( + system.file("efficiency", "file_timings.rds", package = "git2rdata") == "" +) { saveRDS(mb, file.path("..", "inst", "efficiency", "file_timings.rds")) } else { mb <- readRDS( @@ -433,7 +436,7 @@ if (system.file("efficiency", "file_timings.rds", package = "git2rdata") == "") ```{r median_write, echo = FALSE} median_time <- aggregate(time ~ expr, data = mb, FUN = median) -write_ratio <- 100 * median_time$time / +write_ratio <- 100 * median_time$time / median_time$time[median_time$expr == "write.table"] names(write_ratio) <- median_time$expr ``` @@ -456,7 +459,7 @@ ggplot(mb, aes(x = expr, y = time)) + ```{r get_read_timings, eval = system.file("efficiency", "read_timings.rds", package = "git2rdata") == ""} mb <- microbenchmark( - read.table = read.table(file.path(root, "base_R.tsv"), header = TRUE, + read.table = read.table(file.path(root, "base_R.tsv"), header = TRUE, sep = "\t"), readRDS = readRDS(file.path(root, "base_R.rds")), read_vc.optim = read_vc("airbag_optimize", root), @@ -466,7 +469,9 @@ mb$time <- mb$time / 1e6 ``` ```{r store_read_timings, echo = FALSE} -if (system.file("efficiency", "read_timings.rds", package = "git2rdata") == "") { +if ( + system.file("efficiency", "read_timings.rds", package = "git2rdata") == "" +) { saveRDS(mb, file.path("..", "inst", "efficiency", "read_timings.rds")) } else { mb <- readRDS( @@ -477,7 +482,7 @@ if (system.file("efficiency", "read_timings.rds", package = "git2rdata") == "") ```{r median_read, echo = FALSE} median_time <- aggregate(time ~ expr, data = mb, FUN = median) -read_ratio <- 100 * median_time$time / +read_ratio <- 100 * median_time$time / median_time$time[median_time$expr == "read.table"] names(read_ratio) <- median_time$expr ``` @@ -486,7 +491,7 @@ The timings on reading the data is another story. Reading the binary format take ```{r plot_read_timings, echo = FALSE, fig.cap = "Boxplots for the read timings for the different methods."} mb$expr <- factor( - mb$expr, + mb$expr, levels = c("readRDS", "read.table", "read_vc.optim", "read_vc.verbose") ) levels(mb$expr) <- gsub("read_vc\\.", "read_vc\n", levels(mb$expr)) diff --git a/zenodo.json b/zenodo.json new file mode 100644 index 0000000..a75dfce --- /dev/null +++ b/zenodo.json @@ -0,0 +1,36 @@ +{ + "title": "git2rdata: Store and Retrieve Data.frames in a Git Repository.", + "description": "Make versioning of data.frame easy and efficient using git repositories.", + "creators": [ + { + "affiliation": "Research Institute for Nature and Forest (INBO)", + "name": "Thierry Onkelinx", + "orcid": "0000-0001-8804-4216" + }, + { + "affiliation": "Research Institute for Nature and Forest (INBO)", + "name": "Floris Vanderhaeghe", + "orcid": "0000-0002-6378-6229" + }, + { + "affiliation": "Research Institute for Nature and Forest (INBO)", + "name": "Peter Desmet", + "orcid": "0000-0002-8442-8025" + }, + { + "affiliation": "Research Institute for Nature and Forest (INBO)", + "name": "Els Lommelen", + "orcid": "0000-0002-3481-5684" + } + ], + "upload_type": "software", + "license": "GPL-3", + "access_right": "open", + "keywords": [ + "data-management", + "cyberinfrastructure", + "clowder", + "open-data", + "open-science" + ] +}