Skip to content

Commit

Permalink
feat(r): Allow opt-out of warning for unregistered extension types (#632
Browse files Browse the repository at this point in the history
)

Closes #631.

``` r
# Using pak::pak("apache/arrow-nanoarrow/r#632")
library(nanoarrow)
array <- as_nanoarrow_array(data.frame(x = 1:5, y = letters[1:5]))
array$children$z <- nanoarrow_extension_array(letters[1:5], "some_extension")

# warns!
tibble::as_tibble(array)
#> Warning in warn_unregistered_extension_type(x): z: Converting unknown extension
#> some_extension{string} as storage type
#> Warning in warn_unregistered_extension_type(storage): z: Converting unknown
#> extension some_extension{string} as storage type
#> # A tibble: 5 × 3
#>       x y     z    
#>   <int> <chr> <chr>
#> 1     1 a     a    
#> 2     2 b     b    
#> 3     3 c     c    
#> 4     4 d     d    
#> 5     5 e     e

# doesn't!
options(nanoarrow.warn_unregistered_extension = FALSE)
tibble::as_tibble(array)
#> # A tibble: 5 × 3
#>       x y     z    
#>   <int> <chr> <chr>
#> 1     1 a     a    
#> 2     2 b     b    
#> 3     3 c     c    
#> 4     4 d     d    
#> 5     5 e     e
```

<sup>Created on 2024-09-20 with [reprex
v2.1.1](https://reprex.tidyverse.org)</sup>
  • Loading branch information
paleolimbot authored Sep 23, 2024
1 parent 503548b commit 44e8eb9
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 14 deletions.
4 changes: 4 additions & 0 deletions r/R/convert-array.R
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@
#' dispatching on `to`: developers may implement their own S3 methods for
#' custom vector types.
#'
#' Note that unregistered extension types will by default issue a warning.
#' Use `options(nanoarrow.warn_unregistered_extension = FALSE)` to disable
#' this behaviour.
#'
#' @param array A [nanoarrow_array][as_nanoarrow_array].
#' @param to A target prototype object describing the type to which `array`
#' should be converted, or `NULL` to use the default conversion as
Expand Down
33 changes: 19 additions & 14 deletions r/R/extension.R
Original file line number Diff line number Diff line change
Expand Up @@ -164,23 +164,28 @@ nanoarrow_extension_array <- function(storage_array, extension_name,
}

warn_unregistered_extension_type <- function(x) {
# Allow an opt-out of this warning for consumers that don't have
# control over their source and want to drop unknown extensions
if (!getOption("nanoarrow.warn_unregistered_extension", TRUE)) {
return()
}

# Warn that we're about to ignore an extension type
message <- sprintf(
paste0(
"Converting unknown extension %s as storage type\n",
"Disable warning with ",
"options(nanoarrow.warn_unregistered_extension = FALSE)"
),
nanoarrow_schema_formatted(x)
)

# Add the field name if we know it
if (!is.null(x$name) && !identical(x$name, "")) {
warning(
sprintf(
"%s: Converting unknown extension %s as storage type",
x$name,
nanoarrow_schema_formatted(x)
)
)
} else {
warning(
sprintf(
"Converting unknown extension %s as storage type",
nanoarrow_schema_formatted(x)
)
)
message <- paste0(x$name, ": ", message)
}

warning(message)
}

# Mutable registry to look up extension specifications
Expand Down
4 changes: 4 additions & 0 deletions r/man/convert_array.Rd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

22 changes: 22 additions & 0 deletions r/tests/testthat/test-extension.R
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,28 @@ test_that("as_nanoarrow_array() dispatches on registered extension spec", {
)
})

test_that("inferring the type of an unregistered extension warns", {
unknown_extension <- na_extension(na_int32(), "definitely not registered")
expect_warning(
infer_nanoarrow_ptype(unknown_extension),
"Converting unknown extension"
)

# Check that warning contains a field name if present
struct_with_unknown_ext <- na_struct(list(some_col = unknown_extension))
expect_warning(
infer_nanoarrow_ptype(struct_with_unknown_ext),
"some_col: Converting unknown extension"
)

previous_opts <- options(nanoarrow.warn_unregistered_extension = FALSE)
on.exit(options(previous_opts))
expect_warning(
infer_nanoarrow_ptype(unknown_extension),
NA
)
})

test_that("extensions can infer a schema of a nanoarrow_vctr() subclass", {
register_nanoarrow_extension(
"some_ext",
Expand Down

0 comments on commit 44e8eb9

Please sign in to comment.