This is an automated email from the ASF dual-hosted git repository.

paleolimbot pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/sedona-db.git


The following commit(s) were added to refs/heads/main by this push:
     new b254e8d8 chore(r): Add air format + lintr checks to R package (#495)
b254e8d8 is described below

commit b254e8d884cd0d705a252e6127743e27de8789c8
Author: Dewey Dunnington <[email protected]>
AuthorDate: Wed Jan 7 08:48:34 2026 -0600

    chore(r): Add air format + lintr checks to R package (#495)
---
 .github/workflows/r.yml                            |   8 +
 .../tests/testthat/test-adbc.R => air.toml}        |  16 +-
 r/sedonadb/.Rbuildignore                           |   1 +
 .../{tests/testthat/test-adbc.R => .lintr.R}       |  20 +--
 r/sedonadb/DESCRIPTION                             |   2 +
 r/sedonadb/R/000-wrappers.R                        | 187 +++++++++++++++++----
 r/sedonadb/R/adbc.R                                |   4 +-
 r/sedonadb/R/context.R                             |  24 ++-
 r/sedonadb/R/dataframe.R                           |  25 +--
 r/sedonadb/R/expression.R                          |  54 ++++--
 r/sedonadb/R/pkg-dplyr.R                           |   2 +
 r/sedonadb/R/pkg-sf.R                              |   7 +-
 r/sedonadb/R/zzz.R                                 |  16 +-
 r/sedonadb/tests/testthat/test-adbc.R              |   2 +-
 .../tests/testthat/{test-adbc.R => test-lint.R}    |  16 +-
 r/sedonadb/tests/testthat/test-literal.R           |   6 +-
 r/sedonadb/tools/savvy-update.sh                   |   3 +
 17 files changed, 269 insertions(+), 124 deletions(-)

diff --git a/.github/workflows/r.yml b/.github/workflows/r.yml
index 0f0ee3a4..2a6dfe8b 100644
--- a/.github/workflows/r.yml
+++ b/.github/workflows/r.yml
@@ -32,6 +32,14 @@ on:
       - 'c/**'
       - 'r/**'
 jobs:
+  format:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v6
+
+      # Run air format
+      - run: curl -LsSf 
https://github.com/posit-dev/air/releases/latest/download/air-installer.sh | sh
+      - run: cd r/sedonadb && air format . --check
 
   test:
     runs-on: ${{ matrix.config.os }}
diff --git a/r/sedonadb/tests/testthat/test-adbc.R b/r/air.toml
similarity index 69%
copy from r/sedonadb/tests/testthat/test-adbc.R
copy to r/air.toml
index d4e6b839..1c334da1 100644
--- a/r/sedonadb/tests/testthat/test-adbc.R
+++ b/r/air.toml
@@ -15,17 +15,5 @@
 # specific language governing permissions and limitations
 # under the License.
 
-test_that("adbc driver works", {
-  con <- sedonadb_adbc() |>
-    adbcdrivermanager::adbc_database_init() |>
-    adbcdrivermanager::adbc_connection_init()
-
-  df <-  con |>
-    adbcdrivermanager::read_adbc("SELECT ST_Point(0, 1) as geometry") |>
-    as.data.frame()
-
-  expect_identical(
-    wk::as_wkt(df$geometry),
-    wk::wkt("POINT (0 1)")
-  )
-})
+[format]
+line-width = 90
diff --git a/r/sedonadb/.Rbuildignore b/r/sedonadb/.Rbuildignore
index d18da406..f7c144e3 100644
--- a/r/sedonadb/.Rbuildignore
+++ b/r/sedonadb/.Rbuildignore
@@ -11,3 +11,4 @@
 ^\.vscode$
 ^README\.Rmd$
 ^bootstrap\.R$
+^\.lintr\.R$
diff --git a/r/sedonadb/tests/testthat/test-adbc.R b/r/sedonadb/.lintr.R
similarity index 69%
copy from r/sedonadb/tests/testthat/test-adbc.R
copy to r/sedonadb/.lintr.R
index d4e6b839..eef3c7d3 100644
--- a/r/sedonadb/tests/testthat/test-adbc.R
+++ b/r/sedonadb/.lintr.R
@@ -15,17 +15,11 @@
 # specific language governing permissions and limitations
 # under the License.
 
-test_that("adbc driver works", {
-  con <- sedonadb_adbc() |>
-    adbcdrivermanager::adbc_database_init() |>
-    adbcdrivermanager::adbc_connection_init()
+linters <- linters_with_defaults(
+  line_length_linter(90),
+  object_length_linter = NULL
+)
 
-  df <-  con |>
-    adbcdrivermanager::read_adbc("SELECT ST_Point(0, 1) as geometry") |>
-    as.data.frame()
-
-  expect_identical(
-    wk::as_wkt(df$geometry),
-    wk::wkt("POINT (0 1)")
-  )
-})
+exclusions <- list(
+  "R/000-wrappers.R"
+)
diff --git a/r/sedonadb/DESCRIPTION b/r/sedonadb/DESCRIPTION
index 4876e3be..90f82b0b 100644
--- a/r/sedonadb/DESCRIPTION
+++ b/r/sedonadb/DESCRIPTION
@@ -26,3 +26,5 @@ Imports:
     nanoarrow
 Config/testthat/edition: 3
 Config/build/bootstrap: TRUE
+Config/Needs/check:
+    lintr
diff --git a/r/sedonadb/R/000-wrappers.R b/r/sedonadb/R/000-wrappers.R
index 40fd3ce4..6cd4654f 100644
--- a/r/sedonadb/R/000-wrappers.R
+++ b/r/sedonadb/R/000-wrappers.R
@@ -28,11 +28,11 @@ NULL
 
 # Check class and extract the external pointer embedded in the environment
 .savvy_extract_ptr <- function(e, class) {
-  if(is.null(e)) {
+  if (is.null(e)) {
     return(NULL)
   }
 
-  if(inherits(e, class)) {
+  if (inherits(e, class)) {
     e$.ptr
   } else {
     msg <- paste0("Expected ", class, ", got ", class(e)[1])
@@ -55,8 +55,17 @@ NULL
 }
 
 
-`configure_proj_shared` <- function(`shared_library_path` = NULL, 
`database_path` = NULL, `search_path` = NULL) {
-  invisible(.Call(savvy_configure_proj_shared__impl, `shared_library_path`, 
`database_path`, `search_path`))
+`configure_proj_shared` <- function(
+  `shared_library_path` = NULL,
+  `database_path` = NULL,
+  `search_path` = NULL
+) {
+  invisible(.Call(
+    savvy_configure_proj_shared__impl,
+    `shared_library_path`,
+    `database_path`,
+    `search_path`
+  ))
 }
 
 
@@ -73,13 +82,22 @@ NULL
 
 `InternalContext_data_frame_from_array_stream` <- function(self) {
   function(`stream_xptr`, `collect_now`) {
-    
.savvy_wrap_InternalDataFrame(.Call(savvy_InternalContext_data_frame_from_array_stream__impl,
 `self`, `stream_xptr`, `collect_now`))
+    .savvy_wrap_InternalDataFrame(.Call(
+      savvy_InternalContext_data_frame_from_array_stream__impl,
+      `self`,
+      `stream_xptr`,
+      `collect_now`
+    ))
   }
 }
 
 `InternalContext_data_frame_from_table_provider` <- function(self) {
   function(`provider_xptr`) {
-    
.savvy_wrap_InternalDataFrame(.Call(savvy_InternalContext_data_frame_from_table_provider__impl,
 `self`, `provider_xptr`))
+    .savvy_wrap_InternalDataFrame(.Call(
+      savvy_InternalContext_data_frame_from_table_provider__impl,
+      `self`,
+      `provider_xptr`
+    ))
   }
 }
 
@@ -91,13 +109,21 @@ NULL
 
 `InternalContext_read_parquet` <- function(self) {
   function(`paths`) {
-    
.savvy_wrap_InternalDataFrame(.Call(savvy_InternalContext_read_parquet__impl, 
`self`, `paths`))
+    .savvy_wrap_InternalDataFrame(.Call(
+      savvy_InternalContext_read_parquet__impl,
+      `self`,
+      `paths`
+    ))
   }
 }
 
 `InternalContext_register_scalar_udf` <- function(self) {
   function(`scalar_udf_xptr`) {
-    invisible(.Call(savvy_InternalContext_register_scalar_udf__impl, `self`, 
`scalar_udf_xptr`))
+    invisible(.Call(
+      savvy_InternalContext_register_scalar_udf__impl,
+      `self`,
+      `scalar_udf_xptr`
+    ))
   }
 }
 
@@ -115,7 +141,11 @@ NULL
 
 `InternalContext_view` <- function(self) {
   function(`table_ref`) {
-    .savvy_wrap_InternalDataFrame(.Call(savvy_InternalContext_view__impl, 
`self`, `table_ref`))
+    .savvy_wrap_InternalDataFrame(.Call(
+      savvy_InternalContext_view__impl,
+      `self`,
+      `table_ref`
+    ))
   }
 }
 
@@ -123,7 +153,9 @@ NULL
   e <- new.env(parent = emptyenv())
   e$.ptr <- ptr
   e$`data_frame_from_array_stream` <- 
`InternalContext_data_frame_from_array_stream`(ptr)
-  e$`data_frame_from_table_provider` <- 
`InternalContext_data_frame_from_table_provider`(ptr)
+  e$`data_frame_from_table_provider` <- 
`InternalContext_data_frame_from_table_provider`(
+    ptr
+  )
   e$`deregister_table` <- `InternalContext_deregister_table`(ptr)
   e$`read_parquet` <- `InternalContext_read_parquet`(ptr)
   e$`register_scalar_udf` <- `InternalContext_register_scalar_udf`(ptr)
@@ -136,7 +168,6 @@ NULL
 }
 
 
-
 `InternalContext` <- new.env(parent = emptyenv())
 
 ### associated functions for InternalContext
@@ -146,7 +177,10 @@ NULL
 }
 
 
-class(`InternalContext`) <- c("sedonadb::InternalContext__bundle", 
"savvy_sedonadb__sealed")
+class(`InternalContext`) <- c(
+  "sedonadb::InternalContext__bundle",
+  "savvy_sedonadb__sealed"
+)
 
 #' @export
 `print.sedonadb::InternalContext__bundle` <- function(x, ...) {
@@ -164,7 +198,11 @@ class(`InternalContext`) <- 
c("sedonadb::InternalContext__bundle", "savvy_sedona
 `InternalDataFrame_compute` <- function(self) {
   function(`ctx`) {
     `ctx` <- .savvy_extract_ptr(`ctx`, "sedonadb::InternalContext")
-    .savvy_wrap_InternalDataFrame(.Call(savvy_InternalDataFrame_compute__impl, 
`self`, `ctx`))
+    .savvy_wrap_InternalDataFrame(.Call(
+      savvy_InternalDataFrame_compute__impl,
+      `self`,
+      `ctx`
+    ))
   }
 }
 
@@ -188,14 +226,26 @@ class(`InternalContext`) <- 
c("sedonadb::InternalContext__bundle", "savvy_sedona
 
 `InternalDataFrame_select_indices` <- function(self) {
   function(`names`, `indices`) {
-    
.savvy_wrap_InternalDataFrame(.Call(savvy_InternalDataFrame_select_indices__impl,
 `self`, `names`, `indices`))
+    .savvy_wrap_InternalDataFrame(.Call(
+      savvy_InternalDataFrame_select_indices__impl,
+      `self`,
+      `names`,
+      `indices`
+    ))
   }
 }
 
 `InternalDataFrame_show` <- function(self) {
   function(`ctx`, `width_chars`, `ascii`, `limit` = NULL) {
     `ctx` <- .savvy_extract_ptr(`ctx`, "sedonadb::InternalContext")
-    .Call(savvy_InternalDataFrame_show__impl, `self`, `ctx`, `width_chars`, 
`ascii`, `limit`)
+    .Call(
+      savvy_InternalDataFrame_show__impl,
+      `self`,
+      `ctx`,
+      `width_chars`,
+      `ascii`,
+      `limit`
+    )
   }
 }
 
@@ -207,14 +257,37 @@ class(`InternalContext`) <- 
c("sedonadb::InternalContext__bundle", "savvy_sedona
 
 `InternalDataFrame_to_arrow_stream` <- function(self) {
   function(`out`, `requested_schema_xptr`) {
-    invisible(.Call(savvy_InternalDataFrame_to_arrow_stream__impl, `self`, 
`out`, `requested_schema_xptr`))
+    invisible(.Call(
+      savvy_InternalDataFrame_to_arrow_stream__impl,
+      `self`,
+      `out`,
+      `requested_schema_xptr`
+    ))
   }
 }
 
 `InternalDataFrame_to_parquet` <- function(self) {
-  function(`ctx`, `path`, `partition_by`, `sort_by`, `single_file_output`, 
`overwrite_bbox_columns`, `geoparquet_version` = NULL) {
+  function(
+    `ctx`,
+    `path`,
+    `partition_by`,
+    `sort_by`,
+    `single_file_output`,
+    `overwrite_bbox_columns`,
+    `geoparquet_version` = NULL
+  ) {
     `ctx` <- .savvy_extract_ptr(`ctx`, "sedonadb::InternalContext")
-    invisible(.Call(savvy_InternalDataFrame_to_parquet__impl, `self`, `ctx`, 
`path`, `partition_by`, `sort_by`, `single_file_output`, 
`overwrite_bbox_columns`, `geoparquet_version`))
+    invisible(.Call(
+      savvy_InternalDataFrame_to_parquet__impl,
+      `self`,
+      `ctx`,
+      `path`,
+      `partition_by`,
+      `sort_by`,
+      `single_file_output`,
+      `overwrite_bbox_columns`,
+      `geoparquet_version`
+    ))
   }
 }
 
@@ -227,7 +300,13 @@ class(`InternalContext`) <- 
c("sedonadb::InternalContext__bundle", "savvy_sedona
 `InternalDataFrame_to_view` <- function(self) {
   function(`ctx`, `table_ref`, `overwrite`) {
     `ctx` <- .savvy_extract_ptr(`ctx`, "sedonadb::InternalContext")
-    invisible(.Call(savvy_InternalDataFrame_to_view__impl, `self`, `ctx`, 
`table_ref`, `overwrite`))
+    invisible(.Call(
+      savvy_InternalDataFrame_to_view__impl,
+      `self`,
+      `ctx`,
+      `table_ref`,
+      `overwrite`
+    ))
   }
 }
 
@@ -238,7 +317,9 @@ class(`InternalContext`) <- 
c("sedonadb::InternalContext__bundle", "savvy_sedona
   e$`compute` <- `InternalDataFrame_compute`(ptr)
   e$`count` <- `InternalDataFrame_count`(ptr)
   e$`limit` <- `InternalDataFrame_limit`(ptr)
-  e$`primary_geometry_column_index` <- 
`InternalDataFrame_primary_geometry_column_index`(ptr)
+  e$`primary_geometry_column_index` <- 
`InternalDataFrame_primary_geometry_column_index`(
+    ptr
+  )
   e$`select_indices` <- `InternalDataFrame_select_indices`(ptr)
   e$`show` <- `InternalDataFrame_show`(ptr)
   e$`to_arrow_schema` <- `InternalDataFrame_to_arrow_schema`(ptr)
@@ -247,19 +328,23 @@ class(`InternalContext`) <- 
c("sedonadb::InternalContext__bundle", "savvy_sedona
   e$`to_provider` <- `InternalDataFrame_to_provider`(ptr)
   e$`to_view` <- `InternalDataFrame_to_view`(ptr)
 
-  class(e) <- c("sedonadb::InternalDataFrame", "InternalDataFrame", 
"savvy_sedonadb__sealed")
+  class(e) <- c(
+    "sedonadb::InternalDataFrame",
+    "InternalDataFrame",
+    "savvy_sedonadb__sealed"
+  )
   e
 }
 
 
-
 `InternalDataFrame` <- new.env(parent = emptyenv())
 
 ### associated functions for InternalDataFrame
 
-
-
-class(`InternalDataFrame`) <- c("sedonadb::InternalDataFrame__bundle", 
"savvy_sedonadb__sealed")
+class(`InternalDataFrame`) <- c(
+  "sedonadb::InternalDataFrame__bundle",
+  "savvy_sedonadb__sealed"
+)
 
 #' @export
 `print.sedonadb::InternalDataFrame__bundle` <- function(x, ...) {
@@ -312,13 +397,10 @@ class(`InternalDataFrame`) <- 
c("sedonadb::InternalDataFrame__bundle", "savvy_se
 }
 
 
-
 `SedonaDBExpr` <- new.env(parent = emptyenv())
 
 ### associated functions for SedonaDBExpr
 
-
-
 class(`SedonaDBExpr`) <- c("sedonadb::SedonaDBExpr__bundle", 
"savvy_sedonadb__sealed")
 
 #' @export
@@ -330,7 +412,14 @@ class(`SedonaDBExpr`) <- 
c("sedonadb::SedonaDBExpr__bundle", "savvy_sedonadb__se
 
 `SedonaDBExprFactory_aggregate_function` <- function(self) {
   function(`name`, `args`, `na_rm` = NULL, `distinct` = NULL) {
-    
.savvy_wrap_SedonaDBExpr(.Call(savvy_SedonaDBExprFactory_aggregate_function__impl,
 `self`, `name`, `args`, `na_rm`, `distinct`))
+    .savvy_wrap_SedonaDBExpr(.Call(
+      savvy_SedonaDBExprFactory_aggregate_function__impl,
+      `self`,
+      `name`,
+      `args`,
+      `na_rm`,
+      `distinct`
+    ))
   }
 }
 
@@ -338,19 +427,35 @@ class(`SedonaDBExpr`) <- 
c("sedonadb::SedonaDBExpr__bundle", "savvy_sedonadb__se
   function(`op`, `lhs`, `rhs`) {
     `lhs` <- .savvy_extract_ptr(`lhs`, "sedonadb::SedonaDBExpr")
     `rhs` <- .savvy_extract_ptr(`rhs`, "sedonadb::SedonaDBExpr")
-    .savvy_wrap_SedonaDBExpr(.Call(savvy_SedonaDBExprFactory_binary__impl, 
`self`, `op`, `lhs`, `rhs`))
+    .savvy_wrap_SedonaDBExpr(.Call(
+      savvy_SedonaDBExprFactory_binary__impl,
+      `self`,
+      `op`,
+      `lhs`,
+      `rhs`
+    ))
   }
 }
 
 `SedonaDBExprFactory_column` <- function(self) {
   function(`name`, `qualifier` = NULL) {
-    .savvy_wrap_SedonaDBExpr(.Call(savvy_SedonaDBExprFactory_column__impl, 
`self`, `name`, `qualifier`))
+    .savvy_wrap_SedonaDBExpr(.Call(
+      savvy_SedonaDBExprFactory_column__impl,
+      `self`,
+      `name`,
+      `qualifier`
+    ))
   }
 }
 
 `SedonaDBExprFactory_scalar_function` <- function(self) {
   function(`name`, `args`) {
-    
.savvy_wrap_SedonaDBExpr(.Call(savvy_SedonaDBExprFactory_scalar_function__impl, 
`self`, `name`, `args`))
+    .savvy_wrap_SedonaDBExpr(.Call(
+      savvy_SedonaDBExprFactory_scalar_function__impl,
+      `self`,
+      `name`,
+      `args`
+    ))
   }
 }
 
@@ -362,18 +467,25 @@ class(`SedonaDBExpr`) <- 
c("sedonadb::SedonaDBExpr__bundle", "savvy_sedonadb__se
   e$`column` <- `SedonaDBExprFactory_column`(ptr)
   e$`scalar_function` <- `SedonaDBExprFactory_scalar_function`(ptr)
 
-  class(e) <- c("sedonadb::SedonaDBExprFactory", "SedonaDBExprFactory", 
"savvy_sedonadb__sealed")
+  class(e) <- c(
+    "sedonadb::SedonaDBExprFactory",
+    "SedonaDBExprFactory",
+    "savvy_sedonadb__sealed"
+  )
   e
 }
 
 
-
 `SedonaDBExprFactory` <- new.env(parent = emptyenv())
 
 ### associated functions for SedonaDBExprFactory
 
 `SedonaDBExprFactory`$`literal` <- function(`array_xptr`, `schema_xptr`) {
-  .savvy_wrap_SedonaDBExpr(.Call(savvy_SedonaDBExprFactory_literal__impl, 
`array_xptr`, `schema_xptr`))
+  .savvy_wrap_SedonaDBExpr(.Call(
+    savvy_SedonaDBExprFactory_literal__impl,
+    `array_xptr`,
+    `schema_xptr`
+  ))
 }
 
 `SedonaDBExprFactory`$`new` <- function(`ctx`) {
@@ -382,7 +494,10 @@ class(`SedonaDBExpr`) <- 
c("sedonadb::SedonaDBExpr__bundle", "savvy_sedonadb__se
 }
 
 
-class(`SedonaDBExprFactory`) <- c("sedonadb::SedonaDBExprFactory__bundle", 
"savvy_sedonadb__sealed")
+class(`SedonaDBExprFactory`) <- c(
+  "sedonadb::SedonaDBExprFactory__bundle",
+  "savvy_sedonadb__sealed"
+)
 
 #' @export
 `print.sedonadb::SedonaDBExprFactory__bundle` <- function(x, ...) {
diff --git a/r/sedonadb/R/adbc.R b/r/sedonadb/R/adbc.R
index 6f2157b9..6c630fec 100644
--- a/r/sedonadb/R/adbc.R
+++ b/r/sedonadb/R/adbc.R
@@ -32,6 +32,6 @@
 #'   as.data.frame()
 #'
 sedonadb_adbc <- function() {
-    init_func <- structure(sedonadb_adbc_init_func(), class = 
"adbc_driver_init_func")
-    adbcdrivermanager::adbc_driver(init_func, subclass = 
"sedonadb_driver_sedonadb")
+  init_func <- structure(sedonadb_adbc_init_func(), class = 
"adbc_driver_init_func")
+  adbcdrivermanager::adbc_driver(init_func, subclass = 
"sedonadb_driver_sedonadb")
 }
diff --git a/r/sedonadb/R/context.R b/r/sedonadb/R/context.R
index 2c921b98..0eac883e 100644
--- a/r/sedonadb/R/context.R
+++ b/r/sedonadb/R/context.R
@@ -80,6 +80,7 @@ sd_view <- function(table_ref) {
   new_sedonadb_dataframe(ctx, df)
 }
 
+# nolint start: line_length_linter
 #' Register a user-defined function
 #'
 #' Several types of user-defined functions can be registered into a session
@@ -96,6 +97,7 @@ sd_register_udf <- function(udf) {
   ctx <- ctx()
   ctx$register_scalar_udf(udf)
 }
+# nolint end
 
 # We use just one context for now. In theory we could support multiple
 # contexts with a shared runtime, which would scope the registration
@@ -112,7 +114,6 @@ global_ctx <- new.env(parent = emptyenv())
 global_ctx$ctx <- NULL
 
 
-
 #' Configure PROJ
 #'
 #' Performs a runtime configuration of PROJ, which can be used in place of
@@ -138,12 +139,15 @@ global_ctx$ctx <- NULL
 #' @examples
 #' sd_configure_proj("auto")
 #'
-sd_configure_proj <- function(preset = NULL,
-                              shared_library = NULL,
-                             database_path = NULL,
-                             search_path = NULL) {
+sd_configure_proj <- function(
+  preset = NULL,
+  shared_library = NULL,
+  database_path = NULL,
+  search_path = NULL
+) {
   if (!is.null(preset)) {
-    switch (preset,
+    switch(
+      preset,
       homebrew = {
         configure_proj_prefix(Sys.getenv("HOMEBREW_PREFIX", "/opt/homebrew"))
         return(invisible(NULL))
@@ -217,10 +221,14 @@ configure_proj_prefix <- function(prefix) {
 }
 
 proj_dll_name <- function() {
-  switch(tolower(Sys.info()[["sysname"]]),
+  switch(
+    tolower(Sys.info()[["sysname"]]),
     windows = "proj.dll",
     darwin = "libproj.dylib",
     linux = "libproj.so",
-    stop(sprintf("Can't determine system PROJ shared library name for OS: %s", 
Sys.info()[["sysname"]]))
+    stop(sprintf(
+      "Can't determine system PROJ shared library name for OS: %s",
+      Sys.info()[["sysname"]]
+    ))
   )
 }
diff --git a/r/sedonadb/R/dataframe.R b/r/sedonadb/R/dataframe.R
index deb2e976..fefc3a3d 100644
--- a/r/sedonadb/R/dataframe.R
+++ b/r/sedonadb/R/dataframe.R
@@ -57,8 +57,12 @@ as_sedonadb_dataframe.nanoarrow_array <- function(x, ..., 
schema = NULL) {
 }
 
 #' @export
-as_sedonadb_dataframe.nanoarrow_array_stream <- function(x, ..., schema = NULL,
-                                                         lazy = TRUE) {
+as_sedonadb_dataframe.nanoarrow_array_stream <- function(
+  x,
+  ...,
+  schema = NULL,
+  lazy = TRUE
+) {
   stream <- nanoarrow::as_nanoarrow_array_stream(x, schema = schema)
   ctx <- ctx()
   df <- ctx$data_frame_from_array_stream(stream, collect_now = !lazy)
@@ -233,14 +237,15 @@ sd_preview <- function(.data, n = NULL, ascii = NULL, 
width = NULL) {
 #' sd_read_parquet(tmp_parquet)
 #' unlink(tmp_parquet)
 #'
-sd_write_parquet <- function(.data,
-                             path,
-                             partition_by = character(0),
-                             sort_by = character(0),
-                             single_file_output = NULL,
-                             geoparquet_version = "1.0",
-                             overwrite_bbox_columns = FALSE) {
-
+sd_write_parquet <- function(
+  .data,
+  path,
+  partition_by = character(0),
+  sort_by = character(0),
+  single_file_output = NULL,
+  geoparquet_version = "1.0",
+  overwrite_bbox_columns = FALSE
+) {
   # Determine single_file_output default based on path and partition_by
   if (is.null(single_file_output)) {
     single_file_output <- length(partition_by) == 0 && grepl("\\.parquet$", 
path)
diff --git a/r/sedonadb/R/expression.R b/r/sedonadb/R/expression.R
index 50240d4a..cca754a2 100644
--- a/r/sedonadb/R/expression.R
+++ b/r/sedonadb/R/expression.R
@@ -72,10 +72,21 @@ sd_expr_scalar_function <- function(function_name, args, 
factory = sd_expr_facto
 
 #' @rdname sd_expr_column
 #' @export
-sd_expr_aggregate_function <- function(function_name, args, ...,
-                                       na.rm = FALSE, distinct = FALSE, 
factory = sd_expr_factory()) {
+sd_expr_aggregate_function <- function(
+  function_name,
+  args,
+  ...,
+  na.rm = FALSE, # nolint: object_name_linter
+  distinct = FALSE,
+  factory = sd_expr_factory()
+) {
   args_as_expr <- lapply(args, as_sd_expr, factory = factory)
-  factory$aggregate_function(function_name, args_as_expr, na_rm = na.rm, 
distinct = distinct)
+  factory$aggregate_function(
+    function_name,
+    args_as_expr,
+    na_rm = na.rm,
+    distinct = distinct
+  )
 }
 
 #' @rdname sd_expr_column
@@ -133,15 +144,18 @@ print.SedonaDBExpr <- function(x, ...) {
 sd_eval_expr <- function(expr, expr_ctx = sd_expr_ctx(env = env), env = 
parent.frame()) {
   ensure_translations_registered()
 
-  rlang::try_fetch({
-    result <- sd_eval_expr_inner(expr, expr_ctx)
-    as_sd_expr(result, factory = expr_ctx$factory)
-  }, error = function(e) {
-    rlang::abort(
-      sprintf("Error evaluating translated expression %s", 
rlang::expr_label(expr)),
-      parent = e
-    )
-  })
+  rlang::try_fetch(
+    {
+      result <- sd_eval_expr_inner(expr, expr_ctx)
+      as_sd_expr(result, factory = expr_ctx$factory)
+    },
+    error = function(e) {
+      rlang::abort(
+        sprintf("Error evaluating translated expression %s", 
rlang::expr_label(expr)),
+        parent = e
+      )
+    }
+  )
 }
 
 sd_eval_expr_inner <- function(expr, expr_ctx) {
@@ -254,14 +268,19 @@ ensure_translations_registered <- function() {
     sd_expr_scalar_function("abs", list(x), factory = .ctx$factory)
   })
 
+  # nolint start: object_name_linter
   sd_register_translation("base::sum", function(.ctx, x, ..., na.rm = FALSE) {
     sd_expr_aggregate_function("sum", list(x), na.rm = na.rm, factory = 
.ctx$factory)
   })
+  # nolint end
 
   sd_register_translation("base::+", function(.ctx, lhs, rhs) {
     if (missing(rhs)) {
       # Use a double negative to ensure this fails for non-numeric types
-      sd_expr_negative(sd_expr_negative(lhs, factory = .ctx$factory), factory 
= .ctx$factory)
+      sd_expr_negative(
+        sd_expr_negative(lhs, factory = .ctx$factory),
+        factory = .ctx$factory
+      )
     } else {
       sd_expr_binary("+", lhs, rhs, factory = .ctx$factory)
     }
@@ -276,8 +295,11 @@ ensure_translations_registered <- function() {
   })
 
   for (op in c("==", "!=", ">", ">=", "<", "<=", "*", "/", "&", "|")) {
-    sd_register_translation(paste0("base::", op), rlang::inject(function(.ctx, 
lhs, rhs) {
-      sd_expr_binary(!!op, lhs, rhs, factory = .ctx$factory)
-    }))
+    sd_register_translation(
+      paste0("base::", op),
+      rlang::inject(function(.ctx, lhs, rhs) {
+        sd_expr_binary(!!op, lhs, rhs, factory = .ctx$factory)
+      })
+    )
   }
 }
diff --git a/r/sedonadb/R/pkg-dplyr.R b/r/sedonadb/R/pkg-dplyr.R
index 817dca65..e916202d 100644
--- a/r/sedonadb/R/pkg-dplyr.R
+++ b/r/sedonadb/R/pkg-dplyr.R
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
+# nolint start: object_name_linter
 collect.sedonadb_dataframe <- function(x, ...) {
   rlang::check_dots_empty()
   tibble::as_tibble(sd_collect(x))
@@ -28,3 +29,4 @@ select.sedonadb_dataframe <- function(.data, ...) {
   df <- .data$df$select_indices(names(loc), loc - 1L)
   new_sedonadb_dataframe(.data$ctx, df)
 }
+# nolint end
diff --git a/r/sedonadb/R/pkg-sf.R b/r/sedonadb/R/pkg-sf.R
index d4024570..7140f6a0 100644
--- a/r/sedonadb/R/pkg-sf.R
+++ b/r/sedonadb/R/pkg-sf.R
@@ -30,8 +30,13 @@ as_sedonadb_dataframe.sf <- function(x, ..., schema = NULL) {
 }
 
 # dynamically registered in zzz.R
+# nolint start: object_name_linter
 st_as_sf.sedonadb_dataframe <- function(x, ...) {
   stream <- nanoarrow::nanoarrow_allocate_array_stream()
   size <- x$df$collect(stream)
-  sf::st_as_sf(stream)
+  df <- nanoarrow::convert_array_stream(stream, size = size)
+  is_geom <- vapply(df, inherits, logical(1), "geoarrow_vctr")
+  df[is_geom] <- lapply(df[is_geom], sf::st_as_sfc)
+  sf::st_as_sf(df, ...)
 }
+# nolint end
diff --git a/r/sedonadb/R/zzz.R b/r/sedonadb/R/zzz.R
index 9f9720cc..0301620f 100644
--- a/r/sedonadb/R/zzz.R
+++ b/r/sedonadb/R/zzz.R
@@ -34,15 +34,19 @@
 # interrupts automatically when evaluating regular R code and signals
 # an interrupt condition,
 check_interrupts <- function() {
-  tryCatch({
-    FALSE
-  }, interrupt = function(...) TRUE, error = function(...) TRUE)
+  tryCatch(
+    {
+      FALSE
+    },
+    interrupt = function(...) TRUE,
+    error = function(...) TRUE
+  )
 }
 
 # From the `vctrs` package (this function is intended to be copied
 # without attribution or license requirements to avoid a hard dependency on
 # vctrs:
-# 
https://github.com/r-lib/vctrs/blob/c2a7710fe55e3a2249c4fdfe75bbccbafcf38804/R/register-s3.R#L25-L31
+# nolint 
https://github.com/r-lib/vctrs/blob/c2a7710fe55e3a2249c4fdfe75bbccbafcf38804/R/register-s3.R#L25-L31
 s3_register <- function(generic, class, method = NULL) {
   stopifnot(is.character(generic), length(generic) == 1)
   stopifnot(is.character(class), length(class) == 1)
@@ -73,12 +77,10 @@ s3_register <- function(generic, class, method = NULL) {
   register <- function(...) {
     envir <- asNamespace(package)
 
-    # Refresh the method each time, it might have been updated by
-    # `devtools::load_all()`
+    # Refresh the method each time, it might have been updated by 
`devtools::load_all()`
     method_fn <- get_method(method)
     stopifnot(is.function(method_fn))
 
-
     # Only register if generic can be accessed
     if (exists(generic, envir)) {
       registerS3method(generic, class, method_fn, envir = envir)
diff --git a/r/sedonadb/tests/testthat/test-adbc.R 
b/r/sedonadb/tests/testthat/test-adbc.R
index d4e6b839..3766aae5 100644
--- a/r/sedonadb/tests/testthat/test-adbc.R
+++ b/r/sedonadb/tests/testthat/test-adbc.R
@@ -20,7 +20,7 @@ test_that("adbc driver works", {
     adbcdrivermanager::adbc_database_init() |>
     adbcdrivermanager::adbc_connection_init()
 
-  df <-  con |>
+  df <- con |>
     adbcdrivermanager::read_adbc("SELECT ST_Point(0, 1) as geometry") |>
     as.data.frame()
 
diff --git a/r/sedonadb/tests/testthat/test-adbc.R 
b/r/sedonadb/tests/testthat/test-lint.R
similarity index 69%
copy from r/sedonadb/tests/testthat/test-adbc.R
copy to r/sedonadb/tests/testthat/test-lint.R
index d4e6b839..e1ef777f 100644
--- a/r/sedonadb/tests/testthat/test-adbc.R
+++ b/r/sedonadb/tests/testthat/test-lint.R
@@ -15,17 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
-test_that("adbc driver works", {
-  con <- sedonadb_adbc() |>
-    adbcdrivermanager::adbc_database_init() |>
-    adbcdrivermanager::adbc_connection_init()
-
-  df <-  con |>
-    adbcdrivermanager::read_adbc("SELECT ST_Point(0, 1) as geometry") |>
-    as.data.frame()
-
-  expect_identical(
-    wk::as_wkt(df$geometry),
-    wk::wkt("POINT (0 1)")
-  )
+test_that("package is lint-free", {
+  skip_if_not_installed("lintr")
+  lintr::expect_lint_free()
 })
diff --git a/r/sedonadb/tests/testthat/test-literal.R 
b/r/sedonadb/tests/testthat/test-literal.R
index a9f09406..fe66016d 100644
--- a/r/sedonadb/tests/testthat/test-literal.R
+++ b/r/sedonadb/tests/testthat/test-literal.R
@@ -18,7 +18,7 @@
 test_that("basic literals can be converted to expressions", {
   expect_identical(
     as_sedonadb_literal(NULL)$debug_string(),
-    'Literal(NULL, None)'
+    "Literal(NULL, None)"
   )
 
   expect_identical(
@@ -28,12 +28,12 @@ test_that("basic literals can be converted to expressions", 
{
 
   expect_identical(
     as_sedonadb_literal(1L)$debug_string(),
-    'Literal(Int32(1), None)'
+    "Literal(Int32(1), None)"
   )
 
   expect_identical(
     as_sedonadb_literal(1.0)$debug_string(),
-    'Literal(Float64(1), None)'
+    "Literal(Float64(1), None)"
   )
 
   expect_identical(
diff --git a/r/sedonadb/tools/savvy-update.sh b/r/sedonadb/tools/savvy-update.sh
index ce887eda..9289a45d 100755
--- a/r/sedonadb/tools/savvy-update.sh
+++ b/r/sedonadb/tools/savvy-update.sh
@@ -50,6 +50,9 @@ main() {
     clang-format -i "${api_h}"
     clang-format -i "${init_c}"
 
+    # Run air-format for the generated R file
+    air format "${wrappers_r}"
+
     # Remove .tmp files
     rm "${api_h}.tmp" "${init_c}.tmp" "${wrappers_r}.tmp"
 }

Reply via email to