Skip to content
Merged

Dev #289

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
98 commits
Select commit Hold shift + click to select a range
611849d
Update node_metadata.csv
DimEvil Jun 20, 2025
de0bcc8
Update node_config.csv
DimEvil Jun 20, 2025
14b3d0e
Merge pull request #270 from DimEvil/patch-4
mjwestgate Jun 25, 2025
0d75e14
Merge pull request #269 from DimEvil/patch-3
mjwestgate Jun 25, 2025
3d69120
Attempt to fix broken test coverage on CI
mjwestgate Jun 26, 2025
265cd37
First pass at supporting Kew Data Portal APIs (#271)
mjwestgate Jul 4, 2025
c6edf7c
Support updated taxonomic queries for GBIF (#272)
mjwestgate Jul 7, 2025
dcf891f
light restructure ahead of GBIF predicates revision
mjwestgate Jul 8, 2025
aef3a8d
First pass at getting Flanders APIs running (#256)
mjwestgate Jul 10, 2025
4417255
First pass at converting `dplyr::filter()` statements directly into p…
mjwestgate Jul 15, 2025
8653cb4
First pass at adding `coalesce()` and `as_query()` #278
mjwestgate Jul 30, 2025
64b61a3
Start integrating predicates to GBIF workflows #272
mjwestgate Jul 30, 2025
739810b
rename `parse_` functions to `collapse_` for greater clarity and cons…
mjwestgate Aug 4, 2025
aff474a
Fix bugs from recent refactoring (#278)
mjwestgate Aug 4, 2025
71c5603
Switch to predicates search for GBIF counts (#272)
mjwestgate Aug 6, 2025
3613a45
Support `group_by()` with `count()` for GBIF (#272)
mjwestgate Aug 7, 2025
8ca899f
Support `group_by()` with `count()` for > 1 fields in GBIF queries (#…
mjwestgate Aug 12, 2025
024dc77
Clean up code as per R style guide
mjwestgate Aug 12, 2025
514ee31
More effectively document and link new constructors and object classe…
mjwestgate Aug 14, 2025
10bad4e
Fix bugs identified using `test()`
mjwestgate Sep 3, 2025
f8996c0
Clean up code as per R style guide, commit 2
mjwestgate Sep 5, 2025
ece18ea
Add basisOfRecord to "basic" group in `galah_select()`
mjwestgate Sep 5, 2025
3fd5f58
Ensure loading message correctly describes selected atlas
mjwestgate Sep 5, 2025
393f7b7
First pass implementing `select()` for lists #266
mjwestgate Sep 12, 2025
f59ea40
Update as_query-unnest() to support added fields #266
mjwestgate Sep 12, 2025
e31e906
Ensure adding arguments like `thumbnail` are parsed in `as_query()` #278
mjwestgate Sep 12, 2025
a83356c
Swap to API for GBIF field descriptions #272
mjwestgate Sep 12, 2025
8c14acd
New version of API availability plot
mjwestgate Sep 15, 2025
e73e554
clean up code as per R style guide, commit 3
mjwestgate Sep 15, 2025
7a34395
Implement caching for all metadata types #282
mjwestgate Sep 16, 2025
a261e84
Move to testthat edition 3 - commit 1
mjwestgate Sep 26, 2025
2ca234c
test extending `everything()` to other metadata functions (#266)
mjwestgate Sep 26, 2025
f9fe109
First pass at supporting `select()` for metadata functions
mjwestgate Oct 7, 2025
62a3bf6
Ensure `select()` works for all metadata functions (#266)
mjwestgate Oct 16, 2025
6478a71
Extend `all_fields` argument to all metadata types (#266)
mjwestgate Oct 20, 2025
5e995f5
Update printing
mjwestgate Oct 20, 2025
d30e39d
Update `atlas_media()` to support `all_fields()` (#266)
mjwestgate Oct 20, 2025
b07dbf7
update onload to use `packageStartupMessage()` instead of `cli::cli_i…
mjwestgate Oct 22, 2025
6d0734b
Miscellaneous bug fixes detected using `test()`
mjwestgate Oct 24, 2025
7d93f5e
First pass at supporting authentication via JWT (#189)
mjwestgate Oct 28, 2025
faeb1cd
Add vignette on sensitive data (#189)
mjwestgate Oct 29, 2025
3156838
Minor bug fixes for authentication (#189)
mjwestgate Oct 29, 2025
13271c6
First pass at revised authentication architecture (#189)
mjwestgate Nov 4, 2025
f080488
Fix bug with query handling preventing execution of API calls
mjwestgate Nov 4, 2025
0618902
Ensure authentication pipeline works for occurrences (#189)
mjwestgate Nov 6, 2025
eabc741
Updates to messages
mjwestgate Nov 6, 2025
ec18152
Restructure /R directory to group `dplyr` extentions
mjwestgate Nov 7, 2025
cbccf60
Fix minor bugs in lists and select functions, associated tests
mjwestgate Nov 9, 2025
8dc6c19
Support supplying field names to `count.data_request()` (#284)
mjwestgate Nov 10, 2025
4602c58
initial commit for `summarize()` function
mjwestgate Dec 9, 2025
19c4f3b
Update NEWS.md with changes made so far for v2.2.0
mjwestgate Dec 9, 2025
7dc222e
Simplify authentication to only use `galah_config()` (#189)
mjwestgate Dec 12, 2025
1742154
Reformat `arrange()` to natively support `dplyr::desc()` (#284)
mjwestgate Dec 12, 2025
608bee6
caching recent changes ahead of laptop swap
mjwestgate Dec 15, 2025
1a61f80
First pass supporting `distinct()` #284
mjwestgate Dec 19, 2025
1dbbe77
change `update_request_object()` to add slots in the order provided (…
mjwestgate Jan 5, 2026
197be60
Append `request` object to `query` to ensure all info available for l…
mjwestgate Jan 5, 2026
5009b8f
More progress implementing `distinct()` (#284)
mjwestgate Jan 6, 2026
d656445
Misc bug fixes
mjwestgate Jan 7, 2026
585530a
remove deprecated functions and superfluous `lifecycle` badges
mjwestgate Jan 7, 2026
419f52b
Start updating documentation for version 2.2.0
mjwestgate Jan 8, 2026
4eafab8
make `galah_call()` synonymous with `request_data()`
mjwestgate Jan 8, 2026
3dd0c3b
Consolidate OOP vignette into Quick Start Guide
mjwestgate Jan 8, 2026
efd7230
update tests
mjwestgate Jan 9, 2026
8a722f1
Fix bugs in `distinct()` parsing
mjwestgate Jan 13, 2026
6fedf59
Fix bugs in authentication pipeline
mjwestgate Jan 13, 2026
eea7cce
swap `as_query()` for `capture()`, add new class `prequery()`
mjwestgate Jan 13, 2026
ac9a235
rename files and internal functions from `as_query_` prefix to `captu…
mjwestgate Jan 13, 2026
5005da0
Ensure DOI queries parsed correctly; minor bux fixes re: as_query()
mjwestgate Jan 14, 2026
804672c
Fix link to package reference in README
mjwestgate Jan 28, 2026
dc57368
Fix bugs in passing `mint_doi` between functions
mjwestgate Feb 2, 2026
6ef3a87
Fix bugs in `atlas_media()`
mjwestgate Feb 2, 2026
2bf7997
update authorship statement
mjwestgate Feb 2, 2026
82e92bc
Clean up `distinct()` workflow (#275, #267)
mjwestgate Feb 3, 2026
eb343e6
Fix various bugs
mjwestgate Feb 3, 2026
7d77409
Update GBIF predicates support in `filter()`
mjwestgate Feb 4, 2026
44a067c
Support `dplyr::glimpse()` for occurrence queries
mjwestgate Feb 5, 2026
a604a1b
Fix bug where GBIF facet queries failing without a reason being given
mjwestgate Feb 6, 2026
e4f9f66
rename `coalesce()` as `compound()` to avoid confusion and conflicts …
mjwestgate Feb 6, 2026
88df77a
Fix `show_values()` for lists
daxkellie Feb 6, 2026
911c3f8
First set of changes identified by `check()`
mjwestgate Feb 6, 2026
4fb2ec6
Merge pull request #287 from AtlasOfLivingAustralia/dev-mw-6Feb2026
mjwestgate Feb 6, 2026
3c445bc
edit vignette to reflect gbif doi changes
daxkellie Feb 6, 2026
2236b10
minor improvements to cli messages
daxkellie Feb 6, 2026
bfb4827
some edits to docs
daxkellie Feb 6, 2026
997d550
More bug fixes (inc for those from previous commit)
mjwestgate Feb 6, 2026
60adb6c
make `galah_call()` workflow clearer in docs
daxkellie Feb 9, 2026
99f3bdc
Edit NEWS prior to release
daxkellie Feb 9, 2026
fbc48c1
Fix errors shown by GBIF tests
mjwestgate Feb 9, 2026
06d8be4
Fix bugs identified in `check()`
mjwestgate Feb 9, 2026
7199498
Merge pull request #288 from AtlasOfLivingAustralia/dk-edits
mjwestgate Feb 9, 2026
355104a
Minor updates to help files and QSG
mjwestgate Feb 9, 2026
6200391
Fix bugs identified by `test()`
mjwestgate Feb 10, 2026
b6bdaae
pdate `galah_config()` so that `download_reason_id` can be set withou…
mjwestgate Feb 10, 2026
d45ad3c
support passing DOI to `filter()` for GBIF (#272)
mjwestgate Feb 10, 2026
b30df28
Support `glimpse()` for GBIF
mjwestgate Feb 11, 2026
f3e5735
Update `print()` tests, add examples for `glimpse()`, `authenticate()`
mjwestgate Feb 11, 2026
97e2a45
update vignettes, news, pkgdown site
mjwestgate Feb 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 20 additions & 8 deletions .github/workflows/test-coverage.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,10 @@ on:
push:
branches: [main, master]
pull_request:
branches: [main, master]

name: test-coverage
name: test-coverage.yaml

permissions: read-all

jobs:
test-coverage:
Expand All @@ -15,36 +16,47 @@ jobs:
GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }}

steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4

- uses: r-lib/actions/setup-r@v2
with:
use-public-rspm: true

- uses: r-lib/actions/setup-r-dependencies@v2
with:
extra-packages: any::covr
extra-packages: any::covr, any::xml2
needs: coverage

- name: Test coverage
run: |
covr::codecov(
cov <- covr::package_coverage(
quiet = FALSE,
clean = FALSE,
install_path = file.path(normalizePath(Sys.getenv("RUNNER_TEMP"), winslash = "/"), "package")
)
print(cov)
covr::to_cobertura(cov)
shell: Rscript {0}

- uses: codecov/codecov-action@v5
with:
# Fail if error if not on PR, or if on PR and token is given
fail_ci_if_error: ${{ github.event_name != 'pull_request' || secrets.CODECOV_TOKEN }}
files: ./cobertura.xml
plugins: noop
disable_search: true
token: ${{ secrets.CODECOV_TOKEN }}

- name: Show testthat output
if: always()
run: |
## --------------------------------------------------------------------
find ${{ runner.temp }}/package -name 'testthat.Rout*' -exec cat '{}' \; || true
find '${{ runner.temp }}/package' -name 'testthat.Rout*' -exec cat '{}' \; || true
shell: bash

- name: Upload test results
if: failure()
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: coverage-test-failures
path: ${{ runner.temp }}/package
path: ${{ runner.temp }}/package
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,5 @@ docs/*
/Meta/
docs
SECRETS.txt
.secure-credentials
/TEST-SENSITIVE-DATA
15 changes: 8 additions & 7 deletions DESCRIPTION
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
Package: galah
Type: Package
Title: Biodiversity Data from the GBIF Node Network
Version: 2.1.2
Version: 2.2.0
Authors@R:
c(person(given = "Martin",
family = "Westgate",
Expand All @@ -11,13 +11,13 @@ Authors@R:
family = "Kellie",
email = "dax.kellie@csiro.au",
role = "aut"),
person(given = "Shandiya",
family = "Balasubramaniam",
email = "shandiya.balasubramaniam@csiro.au",
role = "ctb"),
person(given = "Matilda",
family = "Stevenson",
role = "aut"),
person(given = "Peggy",
family = "Newman",
email = "peggy.newman@csiro.au",
role = "aut"))
role = "ctb"))
Description: The Global Biodiversity Information Facility
('GBIF', <https://www.gbif.org>) sources data from an international network
of data providers, known as 'nodes'. Several of these nodes - the "living
Expand Down Expand Up @@ -62,6 +62,7 @@ BugReports: https://github.com/AtlasOfLivingAustralia/galah-R/issues
Maintainer: Martin Westgate <martin.westgate@csiro.au>
LazyLoad: yes
VignetteBuilder: knitr
RoxygenNote: 7.3.2
RoxygenNote: 7.3.3
Encoding: UTF-8
Roxygen: list(markdown = TRUE)
Config/testthat/edition: 3
149 changes: 43 additions & 106 deletions NAMESPACE
Original file line number Diff line number Diff line change
@@ -1,51 +1,86 @@
# Generated by roxygen2: do not edit by hand

S3method(add_count,data_request)
S3method(arrange,data_request)
S3method(arrange,metadata_request)
S3method(capture,data_request)
S3method(capture,files_request)
S3method(capture,list)
S3method(capture,metadata_request)
S3method(collapse,data_request)
S3method(collapse,files_request)
S3method(collapse,metadata_request)
S3method(collapse,prequery)
S3method(collapse,query)
S3method(collapse,query_set)
S3method(collect,computed_query)
S3method(collect,data_request)
S3method(collect,files_request)
S3method(collect,metadata_request)
S3method(collect,prequery)
S3method(collect,query)
S3method(collect,query_set)
S3method(compound,data_request)
S3method(compound,files_request)
S3method(compound,metadata_request)
S3method(compound,prequery)
S3method(compound,query)
S3method(compound,query_set)
S3method(compute,data_request)
S3method(compute,files_request)
S3method(compute,metadata_request)
S3method(compute,prequery)
S3method(compute,query)
S3method(compute,query_set)
S3method(count,data_request)
S3method(distinct,data_request)
S3method(filter,data_request)
S3method(filter,files_request)
S3method(filter,metadata_request)
S3method(glimpse,data_request)
S3method(group_by,data_request)
S3method(identify,data_request)
S3method(identify,metadata_request)
S3method(print,computed_query)
S3method(print,data_filter)
S3method(print,data_request)
S3method(print,files_filter)
S3method(print,files_request)
S3method(print,galah_config)
S3method(print,metadata_filter)
S3method(print,metadata_request)
S3method(print,occurrences_glimpse)
S3method(print,predicates_filter)
S3method(print,prequery)
S3method(print,query)
S3method(print,query_set)
S3method(select,data_request)
S3method(select,metadata_request)
S3method(slice_head,data_request)
S3method(slice_head,metadata_request)
S3method(st_crop,data_request)
export(add_count)
export(apply_profile)
export(arrange)
export(as_data_filter)
export(as_files_filter)
export(as_metadata_filter)
export(as_predicates_filter)
export(atlas_citation)
export(atlas_counts)
export(atlas_media)
export(atlas_occurrences)
export(atlas_species)
export(atlas_taxonomy)
export(authenticate)
export(capture)
export(collapse)
export(collect)
export(collect_media)
export(compound)
export(compute)
export(count)
export(desc)
export(distinct)
export(filter)
export(galah_apply_profile)
export(galah_bbox)
Expand All @@ -59,6 +94,7 @@ export(galah_polygon)
export(galah_radius)
export(galah_select)
export(geolocate)
export(glimpse)
export(group_by)
export(identify)
export(read_zip)
Expand All @@ -75,6 +111,7 @@ export(search_fields)
export(search_identifiers)
export(search_licences)
export(search_lists)
export(search_media)
export(search_profiles)
export(search_providers)
export(search_ranks)
Expand All @@ -87,6 +124,7 @@ export(show_all_apis)
export(show_all_assertions)
export(show_all_atlases)
export(show_all_collections)
export(show_all_config)
export(show_all_datasets)
export(show_all_fields)
export(show_all_licences)
Expand All @@ -99,123 +137,22 @@ export(show_values)
export(slice_head)
export(st_crop)
export(unnest)
importFrom(cli,cli_div)
importFrom(cli,cli_end)
importFrom(cli,cli_text)
importFrom(cli,col_magenta)
importFrom(cli,col_yellow)
importFrom(crayon,make_style)
importFrom(crayon,silver)
importFrom(dplyr,all_of)
importFrom(dplyr,any_of)
importFrom(dplyr,add_count)
importFrom(dplyr,arrange)
importFrom(dplyr,bind_cols)
importFrom(dplyr,bind_rows)
importFrom(dplyr,c_across)
importFrom(dplyr,case_match)
importFrom(dplyr,collapse)
importFrom(dplyr,collect)
importFrom(dplyr,compute)
importFrom(dplyr,count)
importFrom(dplyr,desc)
importFrom(dplyr,distinct)
importFrom(dplyr,filter)
importFrom(dplyr,full_join)
importFrom(dplyr,glimpse)
importFrom(dplyr,group_by)
importFrom(dplyr,join_by)
importFrom(dplyr,last_col)
importFrom(dplyr,mutate)
importFrom(dplyr,pull)
importFrom(dplyr,relocate)
importFrom(dplyr,rename)
importFrom(dplyr,right_join)
importFrom(dplyr,rowwise)
importFrom(dplyr,select)
importFrom(dplyr,slice)
importFrom(dplyr,slice_head)
importFrom(dplyr,starts_with)
importFrom(dplyr,ungroup)
importFrom(glue,glue)
importFrom(glue,glue_collapse)
importFrom(glue,glue_data)
importFrom(graphics,identify)
importFrom(httr2,req_body_raw)
importFrom(httr2,req_error)
importFrom(httr2,req_headers)
importFrom(httr2,req_perform)
importFrom(httr2,req_timeout)
importFrom(httr2,request)
importFrom(httr2,resp_body_json)
importFrom(httr2,resp_body_string)
importFrom(httr2,url_build)
importFrom(httr2,url_parse)
importFrom(jsonlite,fromJSON)
importFrom(jsonlite,toJSON)
importFrom(jsonlite,unbox)
importFrom(lifecycle,badge)
importFrom(lifecycle,deprecate_stop)
importFrom(lifecycle,deprecate_warn)
importFrom(potions,brew)
importFrom(potions,pour)
importFrom(purrr,list_flatten)
importFrom(purrr,list_transpose)
importFrom(purrr,map)
importFrom(purrr,pluck)
importFrom(purrr,pluck_depth)
importFrom(purrr,rate_backoff)
importFrom(purrr,rate_delay)
importFrom(purrr,rate_sleep)
importFrom(rlang,.data)
importFrom(rlang,abort)
importFrom(rlang,as_label)
importFrom(rlang,as_name)
importFrom(rlang,as_quosure)
importFrom(rlang,as_string)
importFrom(rlang,`:=`)
importFrom(rlang,caller_env)
importFrom(rlang,enquo)
importFrom(rlang,enquos)
importFrom(rlang,eval_tidy)
importFrom(rlang,expr_text)
importFrom(rlang,f_lhs)
importFrom(rlang,f_rhs)
importFrom(rlang,format_error_bullets)
importFrom(rlang,get_env)
importFrom(rlang,get_expr)
importFrom(rlang,inform)
importFrom(rlang,is_bare_environment)
importFrom(rlang,is_empty)
importFrom(rlang,is_list)
importFrom(rlang,is_quosure)
importFrom(rlang,is_string)
importFrom(rlang,is_syntactic_literal)
importFrom(rlang,new_quosure)
importFrom(rlang,parse_expr)
importFrom(rlang,quo_get_env)
importFrom(rlang,quo_get_expr)
importFrom(rlang,quo_is_call)
importFrom(rlang,quo_is_symbol)
importFrom(rlang,quo_squash)
importFrom(rlang,try_fetch)
importFrom(rlang,warn)
importFrom(sf,st_as_sf)
importFrom(sf,st_as_sfc)
importFrom(sf,st_as_text)
importFrom(sf,st_bbox)
importFrom(sf,st_cast)
importFrom(sf,st_coordinates)
importFrom(sf,st_crop)
importFrom(sf,st_crs)
importFrom(sf,st_geometry)
importFrom(sf,st_geometry_type)
importFrom(sf,st_is_empty)
importFrom(sf,st_is_simple)
importFrom(sf,st_is_valid)
importFrom(stringr,str_detect)
importFrom(stringr,str_extract)
importFrom(stringr,str_remove)
importFrom(stringr,str_replace)
importFrom(stringr,str_replace_all)
importFrom(stringr,str_split)
importFrom(stringr,str_to_title)
importFrom(stringr,str_trim)
importFrom(tibble,as_tibble)
importFrom(tibble,tibble)
32 changes: 32 additions & 0 deletions NEWS.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,35 @@
# galah 2.2.0

### Improved organisational support
* Flemish living atlas and Kew Gardens Data Portal added (#256, #271).
* Authentication supported for ALA users, with associated vignette (#189).
* All GBIF data queries now use predicates. `filter()` builds predicate queries natively when atlas is set to `GBIF` using an object-oriented workflow (#272).
* Re-downloading a file via its' DOI now supported for `GBIF` (#272).
* `search_identifiers()` and `tibble`-based searching via `search_taxa()` now supported for `GBIF`

### New functions
* `dplyr::distinct()` can be used to find grouped data and summaries, generalising `atlas_species()` (#284).
* `dplyr::glimpse()` can be used to see what the resulting query will look like.
* New functions `capture()` and `compound()` as prequels to `collapse()` (#278).

## Changes to metadata functions
* All metadata requests now accept `select()`.
* Metadata types that support `unnest()` now also support `filter()`, even when `unnest()` is not supplied.
* All `show_all()` and `search_all()` functions gain an `all_fields` argument.
* Metadata now supports list-columns where the API returns nested data.
* Metadata functions now return columns names in `snake_case` rather than `camelCase`.
* All metadata functions support caching, and are affected by re-introduced `caching` argument in `galah_config()` (set to `TRUE` by default #282).
* Media metadata now uses a different API to return more relevant information.

### Minor improvements and bug fixes
* `galah_call()` is now synonmous with `request_data()` rather than wrapping all `request_` functions; `method` argument is removed.
* Move to `testthat` 3rd edition for improved test functionality.
* Move to `{cli}` for `print()` calls, not `cat()`.
* Reduce usage of `@importFrom` in favour of `pkg::fun()` syntax, as per R style guide.
* `basisOfRecord` now included as default field (i.e. with `select(group = "basic")`). (#281)
* `query` objects now have a `request` slot showing the request that generated them .


# galah 2.1.2

### Minor improvements
Expand Down
Loading