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

thisisnic pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow.git


The following commit(s) were added to refs/heads/main by this push:
     new a0e58f18dc GH-38033: [R] Allow `code()` to return package name prefix. 
(#38144)
a0e58f18dc is described below

commit a0e58f18dc643f9bfd4efa32331ddf477643fed2
Author: orgadish <[email protected]>
AuthorDate: Thu Oct 19 14:43:48 2023 -0400

    GH-38033: [R] Allow `code()` to return package name prefix. (#38144)
    
    ### Rationale for this change
    #38033
    
    ### What changes are included in this PR?
    - ~~Added `get_pkg_ns()` helper.~~
    - ~~Added `call_name` private method to `DataType` class to store the 
string name used in the code call. Refactored `code()` public method to use 
`call_name`.~~
    - Converted all `$code() call(...)` to `$code(namespace = FALSE) call2(..., 
.ns = if(namespace) "arrow")` in `DataType`, `Schema`, and `DictionaryType`.
    - Added `code` to `Schema` docstring.
    - Updated `expect_code_roundtrip` to test roundtrip with and without 
namespace, and check match/no match for `arrow::` depending on namespace 
argument.
    
    ### Are these changes tested?
    * All tests pass, including lintr checks.
    
    ### Are there any user-facing changes?
    Yes, user-facing changes, but no breaking changes to any public APIs.
    * Closes: #38033
    
    Lead-authored-by: orgadish <[email protected]>
    Co-authored-by: Nic Crane <[email protected]>
    Signed-off-by: Nic Crane <[email protected]>
---
 r/R/dictionary.R                    |  8 ++---
 r/R/schema.R                        |  8 ++---
 r/R/type.R                          | 62 ++++++++++++++++++++-----------------
 r/man/DataType-class.Rd             |  2 +-
 r/man/Schema-class.Rd               |  1 +
 r/tests/testthat/helper-roundtrip.R | 10 +++++-
 6 files changed, 52 insertions(+), 39 deletions(-)

diff --git a/r/R/dictionary.R b/r/R/dictionary.R
index df94ada035..d42a10ad59 100644
--- a/r/R/dictionary.R
+++ b/r/R/dictionary.R
@@ -35,18 +35,18 @@ DictionaryType <- R6Class("DictionaryType",
     ToString = function() {
       prettier_dictionary_type(DataType__ToString(self))
     },
-    code = function() {
+    code = function(namespace = FALSE) {
       details <- list()
       if (self$index_type != int32()) {
-        details$index_type <- self$index_type$code()
+        details$index_type <- self$index_type$code(namespace)
       }
       if (self$value_type != utf8()) {
-        details$value_type <- self$value_type$code()
+        details$value_type <- self$value_type$code(namespace)
       }
       if (isTRUE(self$ordered)) {
         details$ordered <- TRUE
       }
-      call2("dictionary", !!!details)
+      call2("dictionary", !!!details, .ns = if (namespace) "arrow")
     }
   ),
   active = list(
diff --git a/r/R/schema.R b/r/R/schema.R
index ac0604b2b3..75623668d9 100644
--- a/r/R/schema.R
+++ b/r/R/schema.R
@@ -39,6 +39,7 @@
 #' - `$WithMetadata(metadata)`: returns a new `Schema` with the key-value
 #'    `metadata` set. Note that all list elements in `metadata` will be coerced
 #'    to `character`.
+#' - `$code(namespace)`: returns the R code needed to generate this schema. 
Use `namespace=TRUE` to call with `arrow::`.
 #'
 #' @section Active bindings:
 #'
@@ -107,14 +108,13 @@ Schema <- R6Class("Schema",
       inherits(other, "Schema") && Schema__Equals(self, other, 
isTRUE(check_metadata))
     },
     export_to_c = function(ptr) ExportSchema(self, ptr),
-    code = function() {
+    code = function(namespace = FALSE) {
       names <- self$names
       codes <- map2(names, self$fields, function(name, field) {
-        field$type$code()
+        field$type$code(namespace)
       })
       codes <- set_names(codes, names)
-
-      call2("schema", !!!codes)
+      call2("schema", !!!codes, .ns = if (namespace) "arrow")
     },
     WithNames = function(names) {
       if (!inherits(names, "character")) {
diff --git a/r/R/type.R b/r/R/type.R
index 58d3267243..d6db6f146e 100644
--- a/r/R/type.R
+++ b/r/R/type.R
@@ -27,7 +27,7 @@
 #' - `$ToString()`: String representation of the DataType
 #' - `$Equals(other)`: Is the DataType equal to `other`
 #' - `$fields()`: The children fields associated with this type
-#' - `$code()`: Produces an R call of the data type.
+#' - `$code(namespace)`: Produces an R call of the data type. Use 
`namespace=TRUE` to call with `arrow::`.
 #'
 #' There are also some active bindings:
 #' - `$id`: integer Arrow type id.
@@ -51,7 +51,7 @@ DataType <- R6Class("DataType",
       DataType__fields(self)
     },
     export_to_c = function(ptr) ExportType(self, ptr),
-    code = function() call("stop", paste0("Unsupported type: <", 
self$ToString(), ">."))
+    code = function(namespace = FALSE) call("stop", paste0("Unsupported type: 
<", self$ToString(), ">."))
   ),
   active = list(
     id = function() DataType__id(self),
@@ -158,7 +158,7 @@ infer_type.Expression <- function(x, ...) x$type()
 FixedWidthType <- R6Class("FixedWidthType",
   inherit = DataType,
   public = list(
-    code = function() call(tolower(self$name))
+    code = function(namespace = FALSE) call2(tolower(self$name), .ns = if 
(namespace) "arrow")
   ),
   active = list(
     bit_width = function() FixedWidthType__bit_width(self)
@@ -178,45 +178,47 @@ Float32 <- R6Class("Float32", inherit = FixedWidthType)
 Float64 <- R6Class("Float64",
   inherit = FixedWidthType,
   public = list(
-    code = function() call("float64")
+    code = function(namespace = FALSE) call2("float64", .ns = if (namespace) 
"arrow")
   )
 )
 Boolean <- R6Class("Boolean", inherit = FixedWidthType)
 Utf8 <- R6Class("Utf8",
   inherit = DataType,
   public = list(
-    code = function() call("utf8")
+    code = function(namespace = FALSE) call2("utf8", .ns = if (namespace) 
"arrow")
   )
 )
 LargeUtf8 <- R6Class("LargeUtf8",
   inherit = DataType,
   public = list(
-    code = function() call("large_utf8")
+    code = function(namespace = FALSE) call2("large_utf8", .ns = if 
(namespace) "arrow")
   )
 )
 Binary <- R6Class("Binary",
   inherit = DataType,
   public = list(
-    code = function() call("binary")
+    code = function(namespace = FALSE) call2("binary", .ns = if (namespace) 
"arrow")
   )
 )
 LargeBinary <- R6Class("LargeBinary",
   inherit = DataType, public = list(
-    code = function() call("large_binary")
+    code = function(namespace = FALSE) call2("large_binary", .ns = if 
(namespace) "arrow")
   )
 )
 FixedSizeBinary <- R6Class("FixedSizeBinary",
   inherit = FixedWidthType,
   public = list(
     byte_width = function() FixedSizeBinary__byte_width(self),
-    code = function() call2("fixed_size_binary", byte_width = 
self$byte_width())
+    code = function(namespace = FALSE) {
+      call2("fixed_size_binary", byte_width = self$byte_width(), .ns = if 
(namespace) "arrow")
+    }
   )
 )
 
 DateType <- R6Class("DateType",
   inherit = FixedWidthType,
   public = list(
-    code = function() call2(tolower(self$name)),
+    code = function(namespace = FALSE) call2(tolower(self$name), .ns = if 
(namespace) "arrow"),
     unit = function() DateType__unit(self)
   )
 )
@@ -232,26 +234,26 @@ TimeType <- R6Class("TimeType",
 Time32 <- R6Class("Time32",
   inherit = TimeType,
   public = list(
-    code = function() {
+    code = function(namespace = FALSE) {
       unit <- if (self$unit() == TimeUnit$MILLI) {
         "ms"
       } else {
         "s"
       }
-      call2("time32", unit = unit)
+      call2("time32", unit = unit, .ns = if (namespace) "arrow")
     }
   )
 )
 Time64 <- R6Class("Time64",
   inherit = TimeType,
   public = list(
-    code = function() {
+    code = function(namespace = FALSE) {
       unit <- if (self$unit() == TimeUnit$NANO) {
         "ns"
       } else {
         "us"
       }
-      call2("time64", unit = unit)
+      call2("time64", unit = unit, .ns = if (namespace) "arrow")
     }
   )
 )
@@ -266,20 +268,20 @@ DurationType <- R6Class("DurationType",
 Null <- R6Class("Null",
   inherit = DataType,
   public = list(
-    code = function() call("null")
+    code = function(namespace = FALSE) call2("null", .ns = if (namespace) 
"arrow")
   )
 )
 
 Timestamp <- R6Class("Timestamp",
   inherit = FixedWidthType,
   public = list(
-    code = function() {
+    code = function(namespace = FALSE) {
       unit <- c("s", "ms", "us", "ns")[self$unit() + 1L]
       tz <- self$timezone()
       if (identical(tz, "")) {
-        call2("timestamp", unit = unit)
+        call2("timestamp", unit = unit, .ns = if (namespace) "arrow")
       } else {
-        call2("timestamp", unit = unit, timezone = tz)
+        call2("timestamp", unit = unit, timezone = tz, .ns = if (namespace) 
"arrow")
       }
     },
     timezone = function() TimestampType__timezone(self),
@@ -290,8 +292,8 @@ Timestamp <- R6Class("Timestamp",
 DecimalType <- R6Class("DecimalType",
   inherit = FixedWidthType,
   public = list(
-    code = function() {
-      call2("decimal", precision = self$precision(), scale = self$scale())
+    code = function(namespace = FALSE) {
+      call2("decimal", precision = self$precision(), scale = self$scale(), .ns 
= if (namespace) "arrow")
     },
     precision = function() DecimalType__precision(self),
     scale = function() DecimalType__scale(self)
@@ -624,13 +626,13 @@ check_decimal_args <- function(precision, scale) {
 StructType <- R6Class("StructType",
   inherit = NestedType,
   public = list(
-    code = function() {
+    code = function(namespace = FALSE) {
       field_names <- StructType__field_names(self)
       codes <- map(field_names, function(name) {
-        self$GetFieldByName(name)$type$code()
+        self$GetFieldByName(name)$type$code(namespace)
       })
       codes <- set_names(codes, field_names)
-      call2("struct", !!!codes)
+      call2("struct", !!!codes, .ns = if (namespace) "arrow")
     },
     GetFieldByName = function(name) StructType__GetFieldByName(self, name),
     GetFieldIndex = function(name) StructType__GetFieldIndex(self, name)
@@ -648,8 +650,8 @@ names.StructType <- function(x) StructType__field_names(x)
 ListType <- R6Class("ListType",
   inherit = NestedType,
   public = list(
-    code = function() {
-      call("list_of", self$value_type$code())
+    code = function(namespace = FALSE) {
+      call2("list_of", self$value_type$code(namespace), .ns = if (namespace) 
"arrow")
     }
   ),
   active = list(
@@ -665,8 +667,8 @@ list_of <- function(type) list__(type)
 LargeListType <- R6Class("LargeListType",
   inherit = NestedType,
   public = list(
-    code = function() {
-      call2("large_list_of", self$value_type$code())
+    code = function(namespace = FALSE) {
+      call2("large_list_of", self$value_type$code(namespace), .ns = if 
(namespace) "arrow")
     }
   ),
   active = list(
@@ -684,8 +686,10 @@ large_list_of <- function(type) large_list__(type)
 FixedSizeListType <- R6Class("FixedSizeListType",
   inherit = NestedType,
   public = list(
-    code = function() {
-      call2("fixed_size_list_of", self$value_type$code(), list_size = 
self$list_size)
+    code = function(namespace = FALSE) {
+      call2("fixed_size_list_of", self$value_type$code(namespace),
+        list_size = self$list_size, .ns = if (namespace) "arrow"
+      )
     }
   ),
   active = list(
diff --git a/r/man/DataType-class.Rd b/r/man/DataType-class.Rd
index 4f95578133..5c17c072f9 100644
--- a/r/man/DataType-class.Rd
+++ b/r/man/DataType-class.Rd
@@ -13,7 +13,7 @@ DataType class
 \item \verb{$ToString()}: String representation of the DataType
 \item \verb{$Equals(other)}: Is the DataType equal to \code{other}
 \item \verb{$fields()}: The children fields associated with this type
-\item \verb{$code()}: Produces an R call of the data type.
+\item \verb{$code(namespace)}: Produces an R call of the data type. Use 
\code{namespace=TRUE} to call with \verb{arrow::}.
 }
 
 There are also some active bindings:
diff --git a/r/man/Schema-class.Rd b/r/man/Schema-class.Rd
index 32250cdfe7..ecd216af07 100644
--- a/r/man/Schema-class.Rd
+++ b/r/man/Schema-class.Rd
@@ -24,6 +24,7 @@ Many Arrow objects, including \link{Table} and 
\link{Dataset}, have a \verb{$sch
 \item \verb{$WithMetadata(metadata)}: returns a new \code{Schema} with the 
key-value
 \code{metadata} set. Note that all list elements in \code{metadata} will be 
coerced
 to \code{character}.
+\item \verb{$code(namespace)}: returns the R code needed to generate this 
schema. Use \code{namespace=TRUE} to call with \verb{arrow::}.
 }
 }
 
diff --git a/r/tests/testthat/helper-roundtrip.R 
b/r/tests/testthat/helper-roundtrip.R
index d6b965ca65..449a30dd9d 100644
--- a/r/tests/testthat/helper-roundtrip.R
+++ b/r/tests/testthat/helper-roundtrip.R
@@ -44,5 +44,13 @@ expect_array_roundtrip <- function(x, type, as = NULL) {
 }
 
 expect_code_roundtrip <- function(x) {
-  expect_equal(eval(x$code()), x)
+  code <- x$code()
+  code_with_ns <- x$code(namespace = TRUE)
+
+  pkg_prefix_pattern <- "^arrow[:][:]"
+  expect_no_match(as.character(code), pkg_prefix_pattern)
+  expect_match(as.character(code_with_ns)[1], pkg_prefix_pattern)
+
+  expect_equal(eval(code), x)
+  expect_equal(eval(code_with_ns), x)
 }

Reply via email to