Skip to content

sasquatch: Use SAS, R, and Quarto together #673

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
11 of 29 tasks
ryanzomorrodi opened this issue Nov 18, 2024 · 73 comments
Open
11 of 29 tasks

sasquatch: Use SAS, R, and Quarto together #673

ryanzomorrodi opened this issue Nov 18, 2024 · 73 comments

Comments

@ryanzomorrodi
Copy link

ryanzomorrodi commented Nov 18, 2024

Submitting Author Name: Ryan Zomorrodi
Submitting Author Github Handle: @ryanzomorrodi
Other Package Authors Github handles: (comma separated, delete if none)
Repository: https://github.com/ryanzomorrodi/sasquatch
Version submitted: 0.0.0.9004
Submission type: Standard
Editor: @maurolepore
Reviewers: @thisisnic, @tataphani

Due date for @tataphani: 2025-06-20

Archive: TBD
Version accepted: TBD
Language: en


  • Paste the full DESCRIPTION file inside a code block below:
Package: sasquatch
Title: Use 'SAS', R, and 'quarto' Together
Version: 0.0.0.9004
Authors@R: 
    person("Ryan", "Zomorrodi", , "rzomor2@uic.edu", role = c("aut", "cre", "cph"),
           comment = c(ORCID = "0009-0003-6417-5985"))
Description: Use R and 'SAS' within reproducible multilingual 'quarto' 
    documents. Run 'SAS' code blocks interactively, send data back and forth
    between 'SAS' and R, and render 'SAS' output within quarto documents. 'SAS'
    connections are established through a combination of 'SASPy' and 
    'reticulate'.
License: MIT + file LICENSE
Encoding: UTF-8
Roxygen: list(markdown = TRUE)
RoxygenNote: 7.3.2
SystemRequirements: 
    python (>= 3.0.0), 
    SASPy,
    java (>= 7) required for IOM access method
Imports: 
    htmlwidgets,
    knitr,
    reticulate,
    rstudioapi
URL: https://ryanzomorrodi.github.io/sasquatch/, https://github.com/ryanzomorrodi/sasr
Suggests: 
    rmarkdown,
    testthat (>= 3.0.0)
VignetteBuilder: knitr
Config/testthat/edition: 3
BugReports: https://github.com/ryanzomorrodi/sasr/issues

Scope

  • Please indicate which category or categories from our package fit policies this package falls under: (Please check an appropriate box below. If you are unsure, we suggest you make a pre-submission inquiry.):

    • data retrieval
    • data extraction
    • data munging
    • data deposition
    • data validation and testing
    • workflow automation
    • version control
    • citation management and bibliometrics
    • scientific software wrappers
    • field and lab reproducibility tools
    • database software bindings
    • geospatial data
    • text analysis
  • Explain how and why the package falls under these categories (briefly, 1-2 sentences):

sasquatch allows users to create remote SAS sessions, work with them interactively, pass tables between R and SAS, and render quarto documents.

  • Who is the target audience and what are scientific applications of this package?

The target audience would be anyone looking to combine SAS in R within a single workflow. Using quarto, analysts can have one single reproducable report that combines SAS and R (and python potentially).

saquatch works similarly to packages like sasr or configSAS. sasr, while similar to sasquatch, does not include interactive SAS functionality or a knitr engine. On the other hand, configSAS includes a knitr engine, but no interactive SAS functionality. configSAS knitr output also does not include syntax highlighting and nested SAS output interferes with the styles of the rest of the document.

N/A

  • If you made a pre-submission inquiry, please paste the link to the corresponding issue, forum post, or other discussion, or @tag the editor you contacted.

  • Explain reasons for any pkgcheck items which your package is unable to pass.

Locally, pkgcheck is able to pass all tests except coverage. I do not currently have any coverage over the knitr engine because I am struggling to think about how I can test that effectively. My assumption that the automated pkgcheck testing will fail due to the need for python, python package SASPy, java, and a SAS License. (I have set up a CI that has all of these set up within the sasquatch repo).

Technical checks

Confirm each of the following by checking the box.

This package:

Publication options

  • Do you intend for this package to go on CRAN?

  • Do you intend for this package to go on Bioconductor?

  • Do you wish to submit an Applications Article about your package to Methods in Ecology and Evolution? If so:

MEE Options
  • The package is novel and will be of interest to the broad readership of the journal.
  • The manuscript describing the package is no longer than 3000 words.
  • You intend to archive the code for the package in a long-term repository which meets the requirements of the journal (see MEE's Policy on Publishing Code)
  • (Scope: Do consider MEE's Aims and Scope for your manuscript. We make no guarantee that your manuscript will be within MEE scope.)
  • (Although not required, we strongly recommend having a full manuscript prepared when you submit here.)
  • (Please do not submit your package separately to Methods in Ecology and Evolution)

Code of conduct

@ropensci-review-bot
Copy link
Collaborator

Thanks for submitting to rOpenSci, our editors and @ropensci-review-bot will reply soon. Type @ropensci-review-bot help for help.

@ropensci-review-bot
Copy link
Collaborator

🚀

Editor check started

👋

@ropensci-review-bot
Copy link
Collaborator

Checks for sasquatch (v0.0.0.9004)

git hash: 8353d8ac

  • ✔️ Package name is available
  • ✔️ has a 'codemeta.json' file.
  • ✔️ has a 'contributing' file.
  • ✔️ uses 'roxygen2'.
  • ✔️ 'DESCRIPTION' has a URL field.
  • ✔️ 'DESCRIPTION' has a BugReports field.
  • ✔️ Package has at least one HTML vignette
  • ✔️ All functions have examples.
  • ✔️ Package has continuous integration checks.
  • ✖️ Package coverage failed
  • ✖️ R CMD check found 1 error.
  • ✔️ R CMD check found no warnings.

Important: All failing checks above must be addressed prior to proceeding

Package License: MIT + file LICENSE


1. Package Dependencies

Details of Package Dependency Usage (click to open)

The table below tallies all function calls to all packages ('ncalls'), both internal (r-base + recommended, along with the package itself), and external (imported and suggested packages). 'NA' values indicate packages to which no identified calls to R functions could be found. Note that these results are generated by an automated code-tagging system which may not be entirely accurate.

type package ncalls
internal sasquatch 25
internal base 10
internal graphics 1
imports htmlwidgets 1
imports knitr 1
imports reticulate 1
imports rstudioapi 1
suggests rmarkdown NA
suggests testthat NA
linking_to NA NA

Click below for tallies of functions used in each package. Locations of each call within this package may be generated locally by running 's <- pkgstats::pkgstats(<path/to/repo>)', and examining the 'external_calls' table.

sasquatch

read_file (2), rstudio_context (2), sas_engine (2), check_connection (1), newline (1), r_to_sas (1), rstudio_selection (1), rstudio_text_tidy (1), sas_connect (1), sas_disconnect (1), sas_download (1), sas_get_session (1), sas_list (1), sas_remove (1), sas_run_file (1), sas_run_selected (1), sas_run_string (1), sas_to_r (1), sas_upload (1), sas_use_quarto (1), wrap_in_iframe (1), wrap_in_pre (1)

base

list (2), log (2), system.file (2), length (1), options (1), paste (1), paste0 (1)

graphics

text (1)

htmlwidgets

sizingPolicy (1)

knitr

knit_engines$set (1)

reticulate

import (1)

rstudioapi

primary_selection (1)


2. Statistical Properties

This package features some noteworthy statistical properties which may need to be clarified by a handling editor prior to progressing.

Details of statistical properties (click to open)

The package has:

  • code in R (100% in 9 files) and XML (0% in 1 files)
  • 1 authors
  • 1 vignette
  • no internal data file
  • 4 imported packages
  • 14 exported functions (median 7 lines of code)
  • 39 non-exported functions in R (median 6 lines of code)

Statistical properties of package structure as distributional percentiles in relation to all current CRAN packages
The following terminology is used:

  • loc = "Lines of Code"
  • fn = "function"
  • exp/not_exp = exported / not exported

All parameters are explained as tooltips in the locally-rendered HTML version of this report generated by the checks_to_markdown() function

The final measure (fn_call_network_size) is the total number of calls between functions (in R), or more abstract relationships between code objects in other languages. Values are flagged as "noteworthy" when they lie in the upper or lower 5th percentile.

measure value percentile noteworthy
files_R 9 52.3
files_inst 2 99.0
files_vignettes 1 61.9
files_tests 7 81.9
loc_R 238 26.0
loc_inst 30 35.4
loc_vignettes 128 31.6
loc_tests 130 42.6
num_vignettes 1 58.9
n_fns_r 53 56.9
n_fns_r_exported 14 56.1
n_fns_r_not_exported 39 58.6
n_fns_per_file_r 3 50.0
num_params_per_fn 2 8.2
loc_per_fn_r 7 16.7
loc_per_fn_r_exp 8 16.7
loc_per_fn_r_not_exp 6 14.8
rel_whitespace_R 24 36.3
rel_whitespace_inst 97 51.6
rel_whitespace_vignettes 49 43.9
rel_whitespace_tests 40 55.7
doclines_per_fn_exp 20 14.5
doclines_per_fn_not_exp 0 0.0 TRUE
fn_call_network_size 27 51.6

2a. Network visualisation

Click to see the interactive network visualisation of calls between objects in package


3. goodpractice and other checks

Details of goodpractice checks (click to open)

3a. Continuous Integration Badges

R-CMD-check.yaml

GitHub Workflow Results

id name conclusion sha run_number date
11900852065 pages build and deployment success fbd7ec 29 2024-11-18
11900828295 pkgdown.yaml success 8353d8 29 2024-11-18
11900828308 R-CMD-check.yaml success 8353d8 12 2024-11-18
11900828293 test-coverage.yaml success 8353d8 12 2024-11-18

3b. goodpractice results

R CMD check with rcmdcheck

R CMD check generated the following error:

  1. checking tests ...
    Running ‘testthat.R’
    ERROR
    Running the tests in ‘tests/testthat.R’ failed.
    Last 13 lines of output:
    5. └─reticulate (local) python_not_found("Python shared library not found, Python bindings not loaded.")
    ── Error ('test-run.R:18:3'): Run SAS code from file ───────────────────────────
    Error: Python shared library not found, Python bindings not loaded.
    Please create a default virtual environment with reticulate::virtualenv_create('r-reticulate').
    Backtrace:
    1. └─sasquatch::sas_connect() at test-run.R:18:3
    2. └─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
    3. └─reticulate:::ensure_python_initialized()
      
    4.   └─reticulate:::initialize_python()
      
    5.     └─reticulate (local) python_not_found("Python shared library not found, Python bindings not loaded.")
      

[ FAIL 12 | WARN 0 | SKIP 0 | PASS 14 ]
Error: Test failures
Execution halted

R CMD check generated the following test_fail:

  1. This file is part of the standard setup for testthat.

It is recommended that you do not modify it.

Where should you do additional test configuration?

Learn more about the roles of various files in:

* https://r-pkgs.org/testing-design.html#sec-tests-files-overview

* https://testthat.r-lib.org/articles/special-files.html

library(testthat)
library(sasquatch)

test_check("sasquatch")
[ FAIL 12 | WARN 0 | SKIP 0 | PASS 14 ]

══ Failed tests ════════════════════════════════════════════════════════════════
── Failure ('test-connection.R:2:3'): test connection ──────────────────────────
Expected sas_connect() to run without any errors.
i Actually got a with text:
Python shared library not found, Python bindings not loaded.
Please create a default virtual environment with reticulate::virtualenv_create('r-reticulate').
── Failure ('test-connection.R:4:3'): test connection ──────────────────────────
Expected sas_connect("oda") to run without any errors.
i Actually got a with text:
Python shared library not found, Python bindings not loaded.
Please create a default virtual environment with reticulate::virtualenv_create('r-reticulate').
── Failure ('test-connection.R:6:3'): test connection ──────────────────────────
Expected sas_get_session() to run without any errors.
i Actually got a with text:
No current SAS session. Use sas_connect() to start one.
── Failure ('test-connection.R:8:3'): test connection ──────────────────────────
Expected sas_disconnect() to run without any errors.
i Actually got a with text:
No current SAS session. Use sas_connect() to start one.
── Error ('test-conversion.R:2:3'): SAS to R data.frame ────────────────────────
Error: Python shared library not found, Python bindings not loaded.
Please create a default virtual environment with reticulate::virtualenv_create('r-reticulate').
Backtrace:

  1. └─sasquatch::sas_connect() at test-conversion.R:2:3
  2. └─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
  3. └─reticulate:::ensure_python_initialized()
    
  4.   └─reticulate:::initialize_python()
    
  5.     └─reticulate (local) python_not_found("Python shared library not found, Python bindings not loaded.")
    

── Error ('test-conversion.R:24:3'): R to SAS data.frame ───────────────────────
Error: Python shared library not found, Python bindings not loaded.
Please create a default virtual environment with reticulate::virtualenv_create('r-reticulate').
Backtrace:

  1. └─sasquatch::sas_connect() at test-conversion.R:24:3
  2. └─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
  3. └─reticulate:::ensure_python_initialized()
    
  4.   └─reticulate:::initialize_python()
    
  5.     └─reticulate (local) python_not_found("Python shared library not found, Python bindings not loaded.")
    

── Error ('test-io.R:12:3'): uploading files to SAS ────────────────────────────
Error: Python shared library not found, Python bindings not loaded.
Please create a default virtual environment with reticulate::virtualenv_create('r-reticulate').
Backtrace:

  1. └─sasquatch::sas_connect() at test-io.R:12:3
  2. └─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
  3. └─reticulate:::ensure_python_initialized()
    
  4.   └─reticulate:::initialize_python()
    
  5.     └─reticulate (local) python_not_found("Python shared library not found, Python bindings not loaded.")
    

── Error ('test-io.R:34:3'): download files from SAS ───────────────────────────
Error: Python shared library not found, Python bindings not loaded.
Please create a default virtual environment with reticulate::virtualenv_create('r-reticulate').
Backtrace:

  1. └─sasquatch::sas_connect() at test-io.R:34:3
  2. └─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
  3. └─reticulate:::ensure_python_initialized()
    
  4.   └─reticulate:::initialize_python()
    
  5.     └─reticulate (local) python_not_found("Python shared library not found, Python bindings not loaded.")
    

── Error ('test-io.R:61:3'): removing files from SAS ───────────────────────────
Error: Python shared library not found, Python bindings not loaded.
Please create a default virtual environment with reticulate::virtualenv_create('r-reticulate').
Backtrace:

  1. └─sasquatch::sas_connect() at test-io.R:61:3
  2. └─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
  3. └─reticulate:::ensure_python_initialized()
    
  4.   └─reticulate:::initialize_python()
    
  5.     └─reticulate (local) python_not_found("Python shared library not found, Python bindings not loaded.")
    

── Error ('test-io.R:85:3'): listing files ─────────────────────────────────────
Error: Python shared library not found, Python bindings not loaded.
Please create a default virtual environment with reticulate::virtualenv_create('r-reticulate').
Backtrace:

  1. └─sasquatch::sas_connect() at test-io.R:85:3
  2. └─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
  3. └─reticulate:::ensure_python_initialized()
    
  4.   └─reticulate:::initialize_python()
    
  5.     └─reticulate (local) python_not_found("Python shared library not found, Python bindings not loaded.")
    

── Error ('test-run.R:4:3'): Run SAS code from string ──────────────────────────
Error: Python shared library not found, Python bindings not loaded.
Please create a default virtual environment with reticulate::virtualenv_create('r-reticulate').
Backtrace:

  1. └─sasquatch::sas_connect() at test-run.R:4:3
  2. └─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
  3. └─reticulate:::ensure_python_initialized()
    
  4.   └─reticulate:::initialize_python()
    
  5.     └─reticulate (local) python_not_found("Python shared library not found, Python bindings not loaded.")
    

── Error ('test-run.R:18:3'): Run SAS code from file ───────────────────────────
Error: Python shared library not found, Python bindings not loaded.
Please create a default virtual environment with reticulate::virtualenv_create('r-reticulate').
Backtrace:

  1. └─sasquatch::sas_connect() at test-run.R:18:3
  2. └─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
  3. └─reticulate:::ensure_python_initialized()
    
  4.   └─reticulate:::initialize_python()
    
  5.     └─reticulate (local) python_not_found("Python shared library not found, Python bindings not loaded.")
    

[ FAIL 12 | WARN 0 | SKIP 0 | PASS 14 ]
Error: Test failures
Execution halted

R CMD check generated the following check_fail:

  1. rcmdcheck_tests_pass

Test coverage with covr

ERROR: Test Coverage Failed

Cyclocomplexity with cyclocomp

No functions have cyclocomplexity >= 15

Static code analyses with lintr

lintr found no issues with this package!


Package Versions

package version
pkgstats 0.2.0.48
pkgcheck 0.1.2.68


Editor-in-Chief Instructions:

Processing may not proceed until the items marked with ✖️ have been resolved.

mpadge added a commit to ropensci-review-tools/pkgcheck that referenced this issue Nov 19, 2024
@emilyriederer
Copy link

Hi @ryanzomorrodi ! Thanks for your submission.

I see your README.md draws contrast with sasR and configSAS. Could you please also comment how this compares to the "native" sas language engine for R Markdown? Is it largely the interactive capabilities you mention? Or the ability to use SODA versus an on-computer executable?

(Transparently, I'm not a SAS user, so I lack some background context on this space.)

@ryanzomorrodi
Copy link
Author

ryanzomorrodi commented Nov 23, 2024

Hi @emilyriederer ,

I have never used the native sas engine. I saw the mention of it within the RMarkdown cookbook before, but frankly I can't find any other mention of someone using it in the wild. Unfortunately, I don't have access to a computer with a SAS executable installed to test it out.

One package I forgot to mention is SASmarkdown. It also relies on a local SAS executable so I haven't been able to test it out. But, it doesn't have any interactive features, there are also separate engines for output and logs (meaning you have to run your code twice to see the log), and SAS cannot interact with R at all (you need to write everything to a file and read it in the other language). This seems to be what people are currently using instead of the native engine.

One of the advantages in relying on the SASPy Python package is SASPy can connect to both local and remote SAS clients. The configuration is a bit tedious, but at least for SODA, configure_saspy() can do it for you. I was hoping that if others use it, they could share how they set up their configurations and then additional templates can be added.

@emilyriederer
Copy link

Hi @ryanzomorrodi - Thank you for your replied and your patience! I'm seeking out some editors with SAS expertise to help the process here, but will aim to get back to you soon.

@ryanzomorrodi
Copy link
Author

Sounds great! Thank you

@emilyriederer
Copy link

Hi @ryanzomorrodi - I'm happy to share that we think sasquatch is in scope. Given the necessary external dependencies like SAS it may take a bit longer to get our checks run and to identify the right editor, but more to come ASAP.

(Also, what an absolutely perfect name...)

@emilyriederer
Copy link

@ropensci-review-bot check package

@ropensci-review-bot
Copy link
Collaborator

Thanks, about to send the query.

@ropensci-review-bot
Copy link
Collaborator

🚀

Editor check started

👋

@ropensci-review-bot
Copy link
Collaborator

Checks for sasquatch (v0.0.0.9014)

git hash: b506da05

  • ✔️ Package name is available
  • ✔️ has a 'codemeta.json' file.
  • ✔️ has a 'contributing' file.
  • ✔️ uses 'roxygen2'.
  • ✔️ 'DESCRIPTION' has a URL field.
  • ✔️ 'DESCRIPTION' has a BugReports field.
  • ✔️ Package has at least one HTML vignette
  • ✔️ All functions have examples.
  • ✔️ Package has continuous integration checks.
  • ✖️ Package coverage failed
  • ✖️ R CMD check found 1 error.
  • ✔️ R CMD check found no warnings.

Important: All failing checks above must be addressed prior to proceeding

Package License: MIT + file LICENSE


1. Package Dependencies

Details of Package Dependency Usage (click to open)

The table below tallies all function calls to all packages ('ncalls'), both internal (r-base + recommended, along with the package itself), and external (imported and suggested packages). 'NA' values indicate packages to which no identified calls to R functions could be found. Note that these results are generated by an automated code-tagging system which may not be entirely accurate.

type package ncalls
internal base 32
internal sasquatch 32
internal graphics 2
imports reticulate 3
imports knitr 2
imports htmlwidgets 1
imports rstudioapi 1
suggests rmarkdown NA
suggests testthat NA
suggests curl NA
linking_to NA NA

Click below for tallies of functions used in each package. Locations of each call within this package may be generated locally by running 's <- pkgstats::pkgstats(<path/to/repo>)', and examining the 'external_calls' table.

base

list (6), paste0 (5), paste (4), readline (3), log (2), options (2), c (1), length (1), readLines (1), sapply (1), seq_along (1), sub (1), Sys.getenv (1), Sys.which (1), system.file (1), unique (1)

sasquatch

menu (4), get_home_dir (2), list_to_config_dict (2), read_file (2), rstudio_context (2), sas_engine (2), check_connection (1), configure_saspy (1), document (1), install_saspy (1), newline (1), r_to_sas (1), rstudio_selection (1), rstudio_text_tidy (1), sas_connect (1), sas_disconnect (1), sas_download (1), sas_get_session (1), sas_list (1), sas_remove (1), sas_run_file (1), sas_run_selected (1), wrap_in_iframe (1), wrap_in_pre (1)

reticulate

import (1), py_discover_config (1), virtualenv_remove (1)

graphics

text (1), title (1)

knitr

knit_engines$set (1), knit_hooks$set (1)

htmlwidgets

sizingPolicy (1)

rstudioapi

primary_selection (1)


2. Statistical Properties

This package features some noteworthy statistical properties which may need to be clarified by a handling editor prior to progressing.

Details of statistical properties (click to open)

The package has:

  • code in JavaScript (4% in 1 files), R (96% in 10 files) and XML (0% in 1 files)
  • 1 authors
  • 1 vignette
  • no internal data file
  • 4 imported packages
  • 15 exported functions (median 8 lines of code)
  • 47 non-exported functions in R (median 8 lines of code)

Statistical properties of package structure as distributional percentiles in relation to all current CRAN packages
The following terminology is used:

  • loc = "Lines of Code"
  • fn = "function"
  • exp/not_exp = exported / not exported

All parameters are explained as tooltips in the locally-rendered HTML version of this report generated by the checks_to_markdown() function

The final measure (fn_call_network_size) is the total number of calls between functions (in R), or more abstract relationships between code objects in other languages. Values are flagged as "noteworthy" when they lie in the upper or lower 5th percentile.

measure value percentile noteworthy
files_R 10 56.4
files_inst 3 98.9
files_vignettes 0 0.0 TRUE
files_tests 6 79.4
loc_R 371 37.0
loc_inst 47 36.4
loc_tests 133 43.1
num_vignettes 1 58.8
n_fns_r 62 61.9
n_fns_r_exported 15 58.4
n_fns_r_not_exported 47 64.1
n_fns_per_file_r 3 54.3
num_params_per_fn 2 7.0
loc_per_fn_r 8 20.5
loc_per_fn_r_exp 8 16.9
loc_per_fn_r_not_exp 8 22.9
rel_whitespace_R 20 42.3
rel_whitespace_inst 70 53.2
rel_whitespace_tests 45 58.6
doclines_per_fn_exp 19 12.9
doclines_per_fn_not_exp 0 0.0 TRUE
fn_call_network_size 33 56.1

2a. Network visualisation

Click to see the interactive network visualisation of calls between objects in package


3. goodpractice and other checks

Details of goodpractice checks (click to open)

3a. Continuous Integration Badges

R-CMD-check.yaml

GitHub Workflow Results

id name conclusion sha run_number date
11990402536 pages build and deployment success 5afcec 43 2024-11-23
11990389814 pkgdown.yaml success b506da 45 2024-11-23
11990389816 R-CMD-check.yaml failure b506da 28 2024-11-23
11990150794 test-coverage.yaml failure d5bab8 26 2024-11-23

3b. goodpractice results

R CMD check with rcmdcheck

R CMD check generated the following error:

  1. checking tests ...
    Running ‘testthat.R’
    ERROR
    Running the tests in ‘tests/testthat.R’ failed.
    Last 13 lines of output:
    Backtrace:
    1. ├─sasquatch::sas_connect() at test-run.R:22:3
    2. │ ├─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
    3. │ │ ├─base::tryCatch(...)
    4. │ │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
    5. │ │ └─base::force(expr)
    6. │ ├─.pkgenv$SASPy$SASsession
    7. │ └─reticulate:::$.python.builtin.module(.pkgenv$SASPy, "SASsession")
    8. │ └─reticulate::py_get_attr(x, name, TRUE)
    9. └─reticulate (local) <fn>(<python.builtin.module>)

[ FAIL 12 | WARN 0 | SKIP 0 | PASS 13 ]
Error: Test failures
Execution halted

R CMD check generated the following test_fail:

  1. This file is part of the standard setup for testthat.

It is recommended that you do not modify it.

Where should you do additional test configuration?

Learn more about the roles of various files in:

* https://r-pkgs.org/testing-design.html#sec-tests-files-overview

* https://testthat.r-lib.org/articles/special-files.html

library(testthat)
library(sasquatch)

test_check("sasquatch")
List of 22
$ python : chr "/root/.virtualenvs/r-reticulate/bin/python"
$ libpython : chr "/usr/lib/python3.8/config-3.8-x86_64-linux-gnu/libpython3.8.so"
$ pythonhome : chr "/root/.virtualenvs/r-reticulate:/root/.virtualenvs/r-reticulate"
$ pythonpath : chr "/usr/lib/python38.zip:/usr/lib/python3.8:/usr/lib/python3.8/lib-dynload:/root/.virtualenvs/r-reticulate/lib/pyt"| truncated
$ prefix : chr "/root/.virtualenvs/r-reticulate"
$ exec_prefix : chr "/root/.virtualenvs/r-reticulate"
$ base_exec_prefix : chr "/usr"
$ virtualenv : chr "/root/.virtualenvs/r-reticulate"
$ virtualenv_activate : chr ""
$ executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
$ base_executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
$ version_string : chr "3.8.10 (default, Nov 7 2024, 13:10:47) [GCC 9.4.0]"
$ version :Classes 'package_version', 'numeric_version' hidden list of 1
..$ : int [1:2] 3 8
$ architecture : chr "64bit"
$ anaconda : logi FALSE
$ conda : chr "False"
$ numpy :List of 2
..$ path : chr "/root/.virtualenvs/r-reticulate/lib/python3.8/site-packages/numpy"
..$ version:Class 'numeric_version' hidden list of 1
.. ..$ : int [1:3] 1 24 4
$ required_module : chr "saspy"
$ required_module_path: NULL
$ available : logi TRUE
$ python_versions : chr "/root/.virtualenvs/r-reticulate/bin/python"
$ forced : NULL

  • attr(*, "class")= chr "py_config"
    List of 22
    $ python : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ libpython : chr "/usr/lib/python3.8/config-3.8-x86_64-linux-gnu/libpython3.8.so"
    $ pythonhome : chr "/root/.virtualenvs/r-reticulate:/root/.virtualenvs/r-reticulate"
    $ pythonpath : chr "/usr/lib/python38.zip:/usr/lib/python3.8:/usr/lib/python3.8/lib-dynload:/root/.virtualenvs/r-reticulate/lib/pyt"| truncated
    $ prefix : chr "/root/.virtualenvs/r-reticulate"
    $ exec_prefix : chr "/root/.virtualenvs/r-reticulate"
    $ base_exec_prefix : chr "/usr"
    $ virtualenv : chr "/root/.virtualenvs/r-reticulate"
    $ virtualenv_activate : chr ""
    $ executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ base_executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ version_string : chr "3.8.10 (default, Nov 7 2024, 13:10:47) [GCC 9.4.0]"
    $ version :Classes 'package_version', 'numeric_version' hidden list of 1
    ..$ : int [1:2] 3 8
    $ architecture : chr "64bit"
    $ anaconda : logi FALSE
    $ conda : chr "False"
    $ numpy :List of 2
    ..$ path : chr "/root/.virtualenvs/r-reticulate/lib/python3.8/site-packages/numpy"
    ..$ version:Class 'numeric_version' hidden list of 1
    .. ..$ : int [1:3] 1 24 4
    $ required_module : chr "saspy"
    $ required_module_path: NULL
    $ available : logi TRUE
    $ python_versions : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ forced : NULL
  • attr(*, "class")= chr "py_config"
    List of 22
    $ python : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ libpython : chr "/usr/lib/python3.8/config-3.8-x86_64-linux-gnu/libpython3.8.so"
    $ pythonhome : chr "/root/.virtualenvs/r-reticulate:/root/.virtualenvs/r-reticulate"
    $ pythonpath : chr "/usr/lib/python38.zip:/usr/lib/python3.8:/usr/lib/python3.8/lib-dynload:/root/.virtualenvs/r-reticulate/lib/pyt"| truncated
    $ prefix : chr "/root/.virtualenvs/r-reticulate"
    $ exec_prefix : chr "/root/.virtualenvs/r-reticulate"
    $ base_exec_prefix : chr "/usr"
    $ virtualenv : chr "/root/.virtualenvs/r-reticulate"
    $ virtualenv_activate : chr ""
    $ executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ base_executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ version_string : chr "3.8.10 (default, Nov 7 2024, 13:10:47) [GCC 9.4.0]"
    $ version :Classes 'package_version', 'numeric_version' hidden list of 1
    ..$ : int [1:2] 3 8
    $ architecture : chr "64bit"
    $ anaconda : logi FALSE
    $ conda : chr "False"
    $ numpy :List of 2
    ..$ path : chr "/root/.virtualenvs/r-reticulate/lib/python3.8/site-packages/numpy"
    ..$ version:Class 'numeric_version' hidden list of 1
    .. ..$ : int [1:3] 1 24 4
    $ required_module : chr "saspy"
    $ required_module_path: NULL
    $ available : logi TRUE
    $ python_versions : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ forced : NULL
  • attr(*, "class")= chr "py_config"
    List of 22
    $ python : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ libpython : chr "/usr/lib/python3.8/config-3.8-x86_64-linux-gnu/libpython3.8.so"
    $ pythonhome : chr "/root/.virtualenvs/r-reticulate:/root/.virtualenvs/r-reticulate"
    $ pythonpath : chr "/usr/lib/python38.zip:/usr/lib/python3.8:/usr/lib/python3.8/lib-dynload:/root/.virtualenvs/r-reticulate/lib/pyt"| truncated
    $ prefix : chr "/root/.virtualenvs/r-reticulate"
    $ exec_prefix : chr "/root/.virtualenvs/r-reticulate"
    $ base_exec_prefix : chr "/usr"
    $ virtualenv : chr "/root/.virtualenvs/r-reticulate"
    $ virtualenv_activate : chr ""
    $ executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ base_executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ version_string : chr "3.8.10 (default, Nov 7 2024, 13:10:47) [GCC 9.4.0]"
    $ version :Classes 'package_version', 'numeric_version' hidden list of 1
    ..$ : int [1:2] 3 8
    $ architecture : chr "64bit"
    $ anaconda : logi FALSE
    $ conda : chr "False"
    $ numpy :List of 2
    ..$ path : chr "/root/.virtualenvs/r-reticulate/lib/python3.8/site-packages/numpy"
    ..$ version:Class 'numeric_version' hidden list of 1
    .. ..$ : int [1:3] 1 24 4
    $ required_module : chr "saspy"
    $ required_module_path: NULL
    $ available : logi TRUE
    $ python_versions : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ forced : NULL
  • attr(*, "class")= chr "py_config"
    List of 22
    $ python : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ libpython : chr "/usr/lib/python3.8/config-3.8-x86_64-linux-gnu/libpython3.8.so"
    $ pythonhome : chr "/root/.virtualenvs/r-reticulate:/root/.virtualenvs/r-reticulate"
    $ pythonpath : chr "/usr/lib/python38.zip:/usr/lib/python3.8:/usr/lib/python3.8/lib-dynload:/root/.virtualenvs/r-reticulate/lib/pyt"| truncated
    $ prefix : chr "/root/.virtualenvs/r-reticulate"
    $ exec_prefix : chr "/root/.virtualenvs/r-reticulate"
    $ base_exec_prefix : chr "/usr"
    $ virtualenv : chr "/root/.virtualenvs/r-reticulate"
    $ virtualenv_activate : chr ""
    $ executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ base_executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ version_string : chr "3.8.10 (default, Nov 7 2024, 13:10:47) [GCC 9.4.0]"
    $ version :Classes 'package_version', 'numeric_version' hidden list of 1
    ..$ : int [1:2] 3 8
    $ architecture : chr "64bit"
    $ anaconda : logi FALSE
    $ conda : chr "False"
    $ numpy :List of 2
    ..$ path : chr "/root/.virtualenvs/r-reticulate/lib/python3.8/site-packages/numpy"
    ..$ version:Class 'numeric_version' hidden list of 1
    .. ..$ : int [1:3] 1 24 4
    $ required_module : chr "saspy"
    $ required_module_path: NULL
    $ available : logi TRUE
    $ python_versions : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ forced : NULL
  • attr(*, "class")= chr "py_config"
    List of 22
    $ python : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ libpython : chr "/usr/lib/python3.8/config-3.8-x86_64-linux-gnu/libpython3.8.so"
    $ pythonhome : chr "/root/.virtualenvs/r-reticulate:/root/.virtualenvs/r-reticulate"
    $ pythonpath : chr "/usr/lib/python38.zip:/usr/lib/python3.8:/usr/lib/python3.8/lib-dynload:/root/.virtualenvs/r-reticulate/lib/pyt"| truncated
    $ prefix : chr "/root/.virtualenvs/r-reticulate"
    $ exec_prefix : chr "/root/.virtualenvs/r-reticulate"
    $ base_exec_prefix : chr "/usr"
    $ virtualenv : chr "/root/.virtualenvs/r-reticulate"
    $ virtualenv_activate : chr ""
    $ executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ base_executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ version_string : chr "3.8.10 (default, Nov 7 2024, 13:10:47) [GCC 9.4.0]"
    $ version :Classes 'package_version', 'numeric_version' hidden list of 1
    ..$ : int [1:2] 3 8
    $ architecture : chr "64bit"
    $ anaconda : logi FALSE
    $ conda : chr "False"
    $ numpy :List of 2
    ..$ path : chr "/root/.virtualenvs/r-reticulate/lib/python3.8/site-packages/numpy"
    ..$ version:Class 'numeric_version' hidden list of 1
    .. ..$ : int [1:3] 1 24 4
    $ required_module : chr "saspy"
    $ required_module_path: NULL
    $ available : logi TRUE
    $ python_versions : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ forced : NULL
  • attr(*, "class")= chr "py_config"
    List of 22
    $ python : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ libpython : chr "/usr/lib/python3.8/config-3.8-x86_64-linux-gnu/libpython3.8.so"
    $ pythonhome : chr "/root/.virtualenvs/r-reticulate:/root/.virtualenvs/r-reticulate"
    $ pythonpath : chr "/usr/lib/python38.zip:/usr/lib/python3.8:/usr/lib/python3.8/lib-dynload:/root/.virtualenvs/r-reticulate/lib/pyt"| truncated
    $ prefix : chr "/root/.virtualenvs/r-reticulate"
    $ exec_prefix : chr "/root/.virtualenvs/r-reticulate"
    $ base_exec_prefix : chr "/usr"
    $ virtualenv : chr "/root/.virtualenvs/r-reticulate"
    $ virtualenv_activate : chr ""
    $ executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ base_executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ version_string : chr "3.8.10 (default, Nov 7 2024, 13:10:47) [GCC 9.4.0]"
    $ version :Classes 'package_version', 'numeric_version' hidden list of 1
    ..$ : int [1:2] 3 8
    $ architecture : chr "64bit"
    $ anaconda : logi FALSE
    $ conda : chr "False"
    $ numpy :List of 2
    ..$ path : chr "/root/.virtualenvs/r-reticulate/lib/python3.8/site-packages/numpy"
    ..$ version:Class 'numeric_version' hidden list of 1
    .. ..$ : int [1:3] 1 24 4
    $ required_module : chr "saspy"
    $ required_module_path: NULL
    $ available : logi TRUE
    $ python_versions : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ forced : NULL
  • attr(*, "class")= chr "py_config"
    List of 22
    $ python : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ libpython : chr "/usr/lib/python3.8/config-3.8-x86_64-linux-gnu/libpython3.8.so"
    $ pythonhome : chr "/root/.virtualenvs/r-reticulate:/root/.virtualenvs/r-reticulate"
    $ pythonpath : chr "/usr/lib/python38.zip:/usr/lib/python3.8:/usr/lib/python3.8/lib-dynload:/root/.virtualenvs/r-reticulate/lib/pyt"| truncated
    $ prefix : chr "/root/.virtualenvs/r-reticulate"
    $ exec_prefix : chr "/root/.virtualenvs/r-reticulate"
    $ base_exec_prefix : chr "/usr"
    $ virtualenv : chr "/root/.virtualenvs/r-reticulate"
    $ virtualenv_activate : chr ""
    $ executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ base_executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ version_string : chr "3.8.10 (default, Nov 7 2024, 13:10:47) [GCC 9.4.0]"
    $ version :Classes 'package_version', 'numeric_version' hidden list of 1
    ..$ : int [1:2] 3 8
    $ architecture : chr "64bit"
    $ anaconda : logi FALSE
    $ conda : chr "False"
    $ numpy :List of 2
    ..$ path : chr "/root/.virtualenvs/r-reticulate/lib/python3.8/site-packages/numpy"
    ..$ version:Class 'numeric_version' hidden list of 1
    .. ..$ : int [1:3] 1 24 4
    $ required_module : chr "saspy"
    $ required_module_path: NULL
    $ available : logi TRUE
    $ python_versions : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ forced : NULL
  • attr(*, "class")= chr "py_config"
    List of 22
    $ python : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ libpython : chr "/usr/lib/python3.8/config-3.8-x86_64-linux-gnu/libpython3.8.so"
    $ pythonhome : chr "/root/.virtualenvs/r-reticulate:/root/.virtualenvs/r-reticulate"
    $ pythonpath : chr "/usr/lib/python38.zip:/usr/lib/python3.8:/usr/lib/python3.8/lib-dynload:/root/.virtualenvs/r-reticulate/lib/pyt"| truncated
    $ prefix : chr "/root/.virtualenvs/r-reticulate"
    $ exec_prefix : chr "/root/.virtualenvs/r-reticulate"
    $ base_exec_prefix : chr "/usr"
    $ virtualenv : chr "/root/.virtualenvs/r-reticulate"
    $ virtualenv_activate : chr ""
    $ executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ base_executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ version_string : chr "3.8.10 (default, Nov 7 2024, 13:10:47) [GCC 9.4.0]"
    $ version :Classes 'package_version', 'numeric_version' hidden list of 1
    ..$ : int [1:2] 3 8
    $ architecture : chr "64bit"
    $ anaconda : logi FALSE
    $ conda : chr "False"
    $ numpy :List of 2
    ..$ path : chr "/root/.virtualenvs/r-reticulate/lib/python3.8/site-packages/numpy"
    ..$ version:Class 'numeric_version' hidden list of 1
    .. ..$ : int [1:3] 1 24 4
    $ required_module : chr "saspy"
    $ required_module_path: NULL
    $ available : logi TRUE
    $ python_versions : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ forced : NULL
  • attr(*, "class")= chr "py_config"
    List of 22
    $ python : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ libpython : chr "/usr/lib/python3.8/config-3.8-x86_64-linux-gnu/libpython3.8.so"
    $ pythonhome : chr "/root/.virtualenvs/r-reticulate:/root/.virtualenvs/r-reticulate"
    $ pythonpath : chr "/usr/lib/python38.zip:/usr/lib/python3.8:/usr/lib/python3.8/lib-dynload:/root/.virtualenvs/r-reticulate/lib/pyt"| truncated
    $ prefix : chr "/root/.virtualenvs/r-reticulate"
    $ exec_prefix : chr "/root/.virtualenvs/r-reticulate"
    $ base_exec_prefix : chr "/usr"
    $ virtualenv : chr "/root/.virtualenvs/r-reticulate"
    $ virtualenv_activate : chr ""
    $ executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ base_executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ version_string : chr "3.8.10 (default, Nov 7 2024, 13:10:47) [GCC 9.4.0]"
    $ version :Classes 'package_version', 'numeric_version' hidden list of 1
    ..$ : int [1:2] 3 8
    $ architecture : chr "64bit"
    $ anaconda : logi FALSE
    $ conda : chr "False"
    $ numpy :List of 2
    ..$ path : chr "/root/.virtualenvs/r-reticulate/lib/python3.8/site-packages/numpy"
    ..$ version:Class 'numeric_version' hidden list of 1
    .. ..$ : int [1:3] 1 24 4
    $ required_module : chr "saspy"
    $ required_module_path: NULL
    $ available : logi TRUE
    $ python_versions : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ forced : NULL
  • attr(*, "class")= chr "py_config"
    [ FAIL 12 | WARN 0 | SKIP 0 | PASS 13 ]

══ Failed tests ════════════════════════════════════════════════════════════════
── Failure ('test-connection.R:4:3'): test connection ──────────────────────────
Expected sas_connect() to run without any errors.
i Actually got a with text:
Python module saspy was not found.

Detected Python configuration:

── Failure ('test-connection.R:6:3'): test connection ──────────────────────────
Expected sas_connect("oda") to run without any errors.
i Actually got a with text:
Python module saspy was not found.

Detected Python configuration:

── Failure ('test-connection.R:8:3'): test connection ──────────────────────────
Expected sas_get_session() to run without any errors.
i Actually got a with text:
No current SAS session. Use sas_connect() to start one.
── Failure ('test-connection.R:10:3'): test connection ─────────────────────────
Expected sas_disconnect() to run without any errors.
i Actually got a with text:
No current SAS session. Use sas_connect() to start one.
── Error ('test-conversion.R:4:3'): SAS to R data.frame ────────────────────────
Error: Python module saspy was not found.

Detected Python configuration:

Backtrace:

  1. ├─sasquatch::sas_connect() at test-conversion.R:4:3
  2. │ ├─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
  3. │ │ ├─base::tryCatch(...)
  4. │ │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
  5. │ │ └─base::force(expr)
  6. │ ├─.pkgenv$SASPy$SASsession
  7. │ └─reticulate:::$.python.builtin.module(.pkgenv$SASPy, "SASsession")
  8. │ └─reticulate::py_get_attr(x, name, TRUE)
  9. └─reticulate (local) <fn>(<python.builtin.module>)
    ── Error ('test-conversion.R:28:3'): R to SAS data.frame ───────────────────────
    Error: Python module saspy was not found.

Detected Python configuration:

Backtrace:

  1. ├─sasquatch::sas_connect() at test-conversion.R:28:3
  2. │ ├─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
  3. │ │ ├─base::tryCatch(...)
  4. │ │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
  5. │ │ └─base::force(expr)
  6. │ ├─.pkgenv$SASPy$SASsession
  7. │ └─reticulate:::$.python.builtin.module(.pkgenv$SASPy, "SASsession")
  8. │ └─reticulate::py_get_attr(x, name, TRUE)
  9. └─reticulate (local) <fn>(<python.builtin.module>)
    ── Error ('test-io.R:14:3'): uploading files to SAS ────────────────────────────
    Error: Python module saspy was not found.

Detected Python configuration:

Backtrace:

  1. ├─sasquatch::sas_connect() at test-io.R:14:3
  2. │ ├─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
  3. │ │ ├─base::tryCatch(...)
  4. │ │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
  5. │ │ └─base::force(expr)
  6. │ ├─.pkgenv$SASPy$SASsession
  7. │ └─reticulate:::$.python.builtin.module(.pkgenv$SASPy, "SASsession")
  8. │ └─reticulate::py_get_attr(x, name, TRUE)
  9. └─reticulate (local) <fn>(<python.builtin.module>)
    ── Error ('test-io.R:38:3'): download files from SAS ───────────────────────────
    Error: Python module saspy was not found.

Detected Python configuration:

Backtrace:

  1. ├─sasquatch::sas_connect() at test-io.R:38:3
  2. │ ├─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
  3. │ │ ├─base::tryCatch(...)
  4. │ │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
  5. │ │ └─base::force(expr)
  6. │ ├─.pkgenv$SASPy$SASsession
  7. │ └─reticulate:::$.python.builtin.module(.pkgenv$SASPy, "SASsession")
  8. │ └─reticulate::py_get_attr(x, name, TRUE)
  9. └─reticulate (local) <fn>(<python.builtin.module>)
    ── Error ('test-io.R:67:3'): removing files from SAS ───────────────────────────
    Error: Python module saspy was not found.

Detected Python configuration:

Backtrace:

  1. ├─sasquatch::sas_connect() at test-io.R:67:3
  2. │ ├─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
  3. │ │ ├─base::tryCatch(...)
  4. │ │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
  5. │ │ └─base::force(expr)
  6. │ ├─.pkgenv$SASPy$SASsession
  7. │ └─reticulate:::$.python.builtin.module(.pkgenv$SASPy, "SASsession")
  8. │ └─reticulate::py_get_attr(x, name, TRUE)
  9. └─reticulate (local) <fn>(<python.builtin.module>)
    ── Error ('test-io.R:93:3'): listing files ─────────────────────────────────────
    Error: Python module saspy was not found.

Detected Python configuration:

Backtrace:

  1. ├─sasquatch::sas_connect() at test-io.R:93:3
  2. │ ├─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
  3. │ │ ├─base::tryCatch(...)
  4. │ │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
  5. │ │ └─base::force(expr)
  6. │ ├─.pkgenv$SASPy$SASsession
  7. │ └─reticulate:::$.python.builtin.module(.pkgenv$SASPy, "SASsession")
  8. │ └─reticulate::py_get_attr(x, name, TRUE)
  9. └─reticulate (local) <fn>(<python.builtin.module>)
    ── Error ('test-run.R:6:3'): Run SAS code from string ──────────────────────────
    Error: Python module saspy was not found.

Detected Python configuration:

Backtrace:

  1. ├─sasquatch::sas_connect() at test-run.R:6:3
  2. │ ├─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
  3. │ │ ├─base::tryCatch(...)
  4. │ │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
  5. │ │ └─base::force(expr)
  6. │ ├─.pkgenv$SASPy$SASsession
  7. │ └─reticulate:::$.python.builtin.module(.pkgenv$SASPy, "SASsession")
  8. │ └─reticulate::py_get_attr(x, name, TRUE)
  9. └─reticulate (local) <fn>(<python.builtin.module>)
    ── Error ('test-run.R:22:3'): Run SAS code from file ───────────────────────────
    Error: Python module saspy was not found.

Detected Python configuration:

Backtrace:

  1. ├─sasquatch::sas_connect() at test-run.R:22:3
  2. │ ├─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
  3. │ │ ├─base::tryCatch(...)
  4. │ │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
  5. │ │ └─base::force(expr)
  6. │ ├─.pkgenv$SASPy$SASsession
  7. │ └─reticulate:::$.python.builtin.module(.pkgenv$SASPy, "SASsession")
  8. │ └─reticulate::py_get_attr(x, name, TRUE)
  9. └─reticulate (local) <fn>(<python.builtin.module>)

[ FAIL 12 | WARN 0 | SKIP 0 | PASS 13 ]
Error: Test failures
Execution halted

R CMD check generated the following check_fail:

  1. rcmdcheck_tests_pass

Test coverage with covr

ERROR: Test Coverage Failed

Cyclocomplexity with cyclocomp

The following function have cyclocomplexity >= 15:

function cyclocomplexity
configure_saspy 16

Static code analyses with lintr

lintr found no issues with this package!


Package Versions

package version
pkgstats 0.2.0.48
pkgcheck 0.1.2.77


Editor-in-Chief Instructions:

Processing may not proceed until the items marked with ✖️ have been resolved.

@emilyriederer
Copy link

emilyriederer commented Dec 4, 2024

Incidentally, @ryanzomorrodi -- I see you mention not having a good idea for testing your knitr language engine. Way back in 2019, I PRed the SASS engine to knitr and wrote some test to include with my PR. I don't pretend that this is the best or only way, but I found by using mockr I could override the knitr:::is_html_output function to trick it into producing output I could compare in tests. I've attached in case its at all useful to you.

Other ideas (that I haven't tried) might include snapshot testing.

Again, maybe not the best way, maybe not necessary (the handling editor and reviewer can decide that) but just a few passing thoughts. I also recognize that knitr engines I think are a bit more binary in how and whether they work so may not benefit from testing as much as parts of the code with many corner cases.

test_eng_sxss.txt

@ryanzomorrodi
Copy link
Author

That seems like a very reasonable approach, I will try it out. Thank you

@maurolepore
Copy link
Member

@ropensci-review-bot assign @maurolepore as editor

@ropensci-review-bot
Copy link
Collaborator

Assigned! @maurolepore is now the editor

@maurolepore
Copy link
Member

maurolepore commented Dec 14, 2024

Dear @ryanzomorrodi, thanks so much for your submission. I'm happy to be the handling editor.

Within the next few days I'll be reading this thread in more detail, and going through editor checks.

  • ml01. In the meantime, could you please suggest three reviewers?

It might help you to see the criteria we use to choose reviewers, particularly how we define a conflict of interest.

It's also a good time to do any changes you might have in mind. Once the reviews start it's best to avoid forcing reviewers to work against a moving target.

Very excited your tool as a way to bridge SAS and R 💯 🥇

@ryanzomorrodi
Copy link
Author

Hi @maurolepore

That's great to hear! I reviewed the criteria, but I'm wondering if there is a set list of reviewers to choose from or should I post something on social media. It looks like the book mentions an Airtable directory, but it feels like that is just for editors.

My primary interest is to select reviewers with some level of SAS experience.

@maurolepore
Copy link
Member

@ryanzomorrodi, that's right, that airtable database is restricted to editors.

If nobody from your own network comes to mind, then no need to stretch to social media.

We ask for suggestions only to ensure we understand the kind of skills the author believes to be useful, so thanks for highlighting the usefulness of SAS experience 🙏👍

@ryanzomorrodi
Copy link
Author

Sounds good! I apologize, I'm a relative newcomer to the R open-source world, so I'm not super familiar with the space

@maurolepore
Copy link
Member

No problem at all. One great reason to be here is precisely to expand your networks :-)

@maurolepore
Copy link
Member

@ropensci-review-bot check package

@ropensci-review-bot
Copy link
Collaborator

Thanks, about to send the query.

@ropensci-review-bot
Copy link
Collaborator

🚀

Editor check started

👋

@ropensci-review-bot
Copy link
Collaborator

Checks for sasquatch (v0.0.0.9017)

git hash: aee061da

  • ✔️ Package name is available
  • ✔️ has a 'codemeta.json' file.
  • ✔️ has a 'contributing' file.
  • ✔️ uses 'roxygen2'.
  • ✔️ 'DESCRIPTION' has a URL field.
  • ✔️ 'DESCRIPTION' has a BugReports field.
  • ✔️ Package has at least one HTML vignette
  • ✔️ All functions have examples.
  • ✔️ Package has continuous integration checks.
  • ✖️ Package coverage failed
  • ✖️ R CMD check found 1 error.
  • ✖️ R CMD check found 1 warning.

Important: All failing checks above must be addressed prior to proceeding

Package License: MIT + file LICENSE


1. Package Dependencies

Details of Package Dependency Usage (click to open)

The table below tallies all function calls to all packages ('ncalls'), both internal (r-base + recommended, along with the package itself), and external (imported and suggested packages). 'NA' values indicate packages to which no identified calls to R functions could be found. Note that these results are generated by an automated code-tagging system which may not be entirely accurate.

type package ncalls
internal sasquatch 37
internal base 33
internal graphics 2
imports reticulate 3
imports knitr 2
imports chk 1
imports htmlwidgets 1
imports rstudioapi 1
suggests rmarkdown NA
suggests testthat NA
suggests curl NA
linking_to NA NA

Click below for tallies of functions used in each package. Locations of each call within this package may be generated locally by running 's <- pkgstats::pkgstats(<path/to/repo>)', and examining the 'external_calls' table.

sasquatch

menu (4), get_home_dir (2), list_to_config_dict (2), read_file (2), rstudio_context (2), sas_engine (2), wrap_in_iframe (2), chk_connection (1), chk_has_rownames (1), configure_saspy (1), document (1), execute_safely (1), install_saspy (1), newline (1), r_to_sas (1), rstudio_selection (1), rstudio_text_tidy (1), sas_connect (1), sas_disconnect (1), sas_download (1), sas_get_session (1), sas_list (1), sas_remove (1), sas_run_file (1), sas_run_selected (1), sas_run_string (1), sas_to_r (1), wrap_in_pre (1)

base

list (5), paste0 (5), paste (4), readline (3), log (2), options (2), c (1), call (1), length (1), parent.frame (1), readLines (1), sapply (1), seq_along (1), sub (1), Sys.getenv (1), Sys.which (1), system.file (1), unique (1)

reticulate

import (1), py_discover_config (1), virtualenv_remove (1)

graphics

text (1), title (1)

knitr

knit_engines$set (1), knit_hooks$set (1)

chk

abort_chk (1)

htmlwidgets

sizingPolicy (1)

rstudioapi

primary_selection (1)


2. Statistical Properties

This package features some noteworthy statistical properties which may need to be clarified by a handling editor prior to progressing.

Details of statistical properties (click to open)

The package has:

  • code in JavaScript (4% in 1 files), R (96% in 11 files) and XML (0% in 1 files)
  • 1 authors
  • 1 vignette
  • no internal data file
  • 5 imported packages
  • 15 exported functions (median 10 lines of code)
  • 55 non-exported functions in R (median 8 lines of code)

Statistical properties of package structure as distributional percentiles in relation to all current CRAN packages
The following terminology is used:

  • loc = "Lines of Code"
  • fn = "function"
  • exp/not_exp = exported / not exported

All parameters are explained as tooltips in the locally-rendered HTML version of this report generated by the checks_to_markdown() function

The final measure (fn_call_network_size) is the total number of calls between functions (in R), or more abstract relationships between code objects in other languages. Values are flagged as "noteworthy" when they lie in the upper or lower 5th percentile.

measure value percentile noteworthy
files_R 11 60.2
files_inst 3 98.8
files_vignettes 0 0.0 TRUE
files_tests 6 79.4
loc_R 449 42.4
loc_inst 47 34.9
loc_tests 133 43.0
num_vignettes 1 58.8
n_fns_r 70 65.3
n_fns_r_exported 15 58.4
n_fns_r_not_exported 55 68.5
n_fns_per_file_r 3 55.2
num_params_per_fn 2 7.1
loc_per_fn_r 8 24.5
loc_per_fn_r_exp 10 22.9
loc_per_fn_r_not_exp 8 23.0
rel_whitespace_R 18 44.4
rel_whitespace_inst 70 52.2
rel_whitespace_tests 45 58.5
doclines_per_fn_exp 19 12.9
doclines_per_fn_not_exp 0 0.0 TRUE
fn_call_network_size 44 62.5

2a. Network visualisation

Click to see the interactive network visualisation of calls between objects in package


3. goodpractice and other checks

Details of goodpractice checks (click to open)

3a. Continuous Integration Badges

R-CMD-check.yaml

GitHub Workflow Results

id name conclusion sha run_number date
12408303336 pages build and deployment success dd809c 45 2024-12-19
12408283861 pkgdown.yaml success aee061 47 2024-12-19
12408283864 R-CMD-check.yaml failure aee061 30 2024-12-19
11990150794 test-coverage.yaml failure d5bab8 26 2024-11-23

3b. goodpractice results

R CMD check with rcmdcheck

R CMD check generated the following error:

  1. checking tests ...
    Running ‘testthat.R’
    ERROR
    Running the tests in ‘tests/testthat.R’ failed.
    Last 13 lines of output:
    Backtrace:
    1. ├─sasquatch::sas_connect() at test-run.R:22:3
    2. │ ├─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
    3. │ │ ├─base::tryCatch(...)
    4. │ │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
    5. │ │ └─base::force(expr)
    6. │ ├─.pkgenv$SASPy$SASsession
    7. │ └─reticulate:::$.python.builtin.module(.pkgenv$SASPy, "SASsession")
    8. │ └─reticulate::py_get_attr(x, name, TRUE)
    9. └─reticulate (local) <fn>(<python.builtin.module>)

[ FAIL 12 | WARN 0 | SKIP 0 | PASS 9 ]
Error: Test failures
Execution halted

R CMD check generated the following warning:

  1. checking for code/documentation mismatches ... WARNING
    Codoc mismatches from Rd file 'install_saspy.Rd':
    install_saspy
    Code: function(envname = "r-saspy", extra_packages, restart_session =
    TRUE)
    Docs: function(envname = "r-saspy", extra_packages = NULL,
    restart_session = TRUE)
    Mismatches in argument default values:
    Name: 'extra_packages' Code: Docs: NULL

R CMD check generated the following test_fail:

  1. This file is part of the standard setup for testthat.

It is recommended that you do not modify it.

Where should you do additional test configuration?

Learn more about the roles of various files in:

* https://r-pkgs.org/testing-design.html#sec-tests-files-overview

* https://testthat.r-lib.org/articles/special-files.html

library(testthat)
library(sasquatch)

test_check("sasquatch")
List of 22
$ python : chr "/root/.virtualenvs/r-reticulate/bin/python"
$ libpython : chr "/usr/lib/python3.8/config-3.8-x86_64-linux-gnu/libpython3.8.so"
$ pythonhome : chr "/root/.virtualenvs/r-reticulate:/root/.virtualenvs/r-reticulate"
$ pythonpath : chr "/usr/lib/python38.zip:/usr/lib/python3.8:/usr/lib/python3.8/lib-dynload:/root/.virtualenvs/r-reticulate/lib/pyt"| truncated
$ prefix : chr "/root/.virtualenvs/r-reticulate"
$ exec_prefix : chr "/root/.virtualenvs/r-reticulate"
$ base_exec_prefix : chr "/usr"
$ virtualenv : chr "/root/.virtualenvs/r-reticulate"
$ virtualenv_activate : chr ""
$ executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
$ base_executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
$ version_string : chr "3.8.10 (default, Nov 7 2024, 13:10:47) [GCC 9.4.0]"
$ version :Classes 'package_version', 'numeric_version' hidden list of 1
..$ : int [1:2] 3 8
$ architecture : chr "64bit"
$ anaconda : logi FALSE
$ conda : chr "False"
$ numpy :List of 2
..$ path : chr "/root/.virtualenvs/r-reticulate/lib/python3.8/site-packages/numpy"
..$ version:Class 'numeric_version' hidden list of 1
.. ..$ : int [1:3] 1 24 4
$ required_module : chr "saspy"
$ required_module_path: NULL
$ available : logi TRUE
$ python_versions : chr "/root/.virtualenvs/r-reticulate/bin/python"
$ forced : NULL

  • attr(*, "class")= chr "py_config"
    List of 22
    $ python : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ libpython : chr "/usr/lib/python3.8/config-3.8-x86_64-linux-gnu/libpython3.8.so"
    $ pythonhome : chr "/root/.virtualenvs/r-reticulate:/root/.virtualenvs/r-reticulate"
    $ pythonpath : chr "/usr/lib/python38.zip:/usr/lib/python3.8:/usr/lib/python3.8/lib-dynload:/root/.virtualenvs/r-reticulate/lib/pyt"| truncated
    $ prefix : chr "/root/.virtualenvs/r-reticulate"
    $ exec_prefix : chr "/root/.virtualenvs/r-reticulate"
    $ base_exec_prefix : chr "/usr"
    $ virtualenv : chr "/root/.virtualenvs/r-reticulate"
    $ virtualenv_activate : chr ""
    $ executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ base_executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ version_string : chr "3.8.10 (default, Nov 7 2024, 13:10:47) [GCC 9.4.0]"
    $ version :Classes 'package_version', 'numeric_version' hidden list of 1
    ..$ : int [1:2] 3 8
    $ architecture : chr "64bit"
    $ anaconda : logi FALSE
    $ conda : chr "False"
    $ numpy :List of 2
    ..$ path : chr "/root/.virtualenvs/r-reticulate/lib/python3.8/site-packages/numpy"
    ..$ version:Class 'numeric_version' hidden list of 1
    .. ..$ : int [1:3] 1 24 4
    $ required_module : chr "saspy"
    $ required_module_path: NULL
    $ available : logi TRUE
    $ python_versions : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ forced : NULL
  • attr(*, "class")= chr "py_config"
    List of 22
    $ python : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ libpython : chr "/usr/lib/python3.8/config-3.8-x86_64-linux-gnu/libpython3.8.so"
    $ pythonhome : chr "/root/.virtualenvs/r-reticulate:/root/.virtualenvs/r-reticulate"
    $ pythonpath : chr "/usr/lib/python38.zip:/usr/lib/python3.8:/usr/lib/python3.8/lib-dynload:/root/.virtualenvs/r-reticulate/lib/pyt"| truncated
    $ prefix : chr "/root/.virtualenvs/r-reticulate"
    $ exec_prefix : chr "/root/.virtualenvs/r-reticulate"
    $ base_exec_prefix : chr "/usr"
    $ virtualenv : chr "/root/.virtualenvs/r-reticulate"
    $ virtualenv_activate : chr ""
    $ executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ base_executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ version_string : chr "3.8.10 (default, Nov 7 2024, 13:10:47) [GCC 9.4.0]"
    $ version :Classes 'package_version', 'numeric_version' hidden list of 1
    ..$ : int [1:2] 3 8
    $ architecture : chr "64bit"
    $ anaconda : logi FALSE
    $ conda : chr "False"
    $ numpy :List of 2
    ..$ path : chr "/root/.virtualenvs/r-reticulate/lib/python3.8/site-packages/numpy"
    ..$ version:Class 'numeric_version' hidden list of 1
    .. ..$ : int [1:3] 1 24 4
    $ required_module : chr "saspy"
    $ required_module_path: NULL
    $ available : logi TRUE
    $ python_versions : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ forced : NULL
  • attr(*, "class")= chr "py_config"
    List of 22
    $ python : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ libpython : chr "/usr/lib/python3.8/config-3.8-x86_64-linux-gnu/libpython3.8.so"
    $ pythonhome : chr "/root/.virtualenvs/r-reticulate:/root/.virtualenvs/r-reticulate"
    $ pythonpath : chr "/usr/lib/python38.zip:/usr/lib/python3.8:/usr/lib/python3.8/lib-dynload:/root/.virtualenvs/r-reticulate/lib/pyt"| truncated
    $ prefix : chr "/root/.virtualenvs/r-reticulate"
    $ exec_prefix : chr "/root/.virtualenvs/r-reticulate"
    $ base_exec_prefix : chr "/usr"
    $ virtualenv : chr "/root/.virtualenvs/r-reticulate"
    $ virtualenv_activate : chr ""
    $ executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ base_executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ version_string : chr "3.8.10 (default, Nov 7 2024, 13:10:47) [GCC 9.4.0]"
    $ version :Classes 'package_version', 'numeric_version' hidden list of 1
    ..$ : int [1:2] 3 8
    $ architecture : chr "64bit"
    $ anaconda : logi FALSE
    $ conda : chr "False"
    $ numpy :List of 2
    ..$ path : chr "/root/.virtualenvs/r-reticulate/lib/python3.8/site-packages/numpy"
    ..$ version:Class 'numeric_version' hidden list of 1
    .. ..$ : int [1:3] 1 24 4
    $ required_module : chr "saspy"
    $ required_module_path: NULL
    $ available : logi TRUE
    $ python_versions : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ forced : NULL
  • attr(*, "class")= chr "py_config"
    List of 22
    $ python : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ libpython : chr "/usr/lib/python3.8/config-3.8-x86_64-linux-gnu/libpython3.8.so"
    $ pythonhome : chr "/root/.virtualenvs/r-reticulate:/root/.virtualenvs/r-reticulate"
    $ pythonpath : chr "/usr/lib/python38.zip:/usr/lib/python3.8:/usr/lib/python3.8/lib-dynload:/root/.virtualenvs/r-reticulate/lib/pyt"| truncated
    $ prefix : chr "/root/.virtualenvs/r-reticulate"
    $ exec_prefix : chr "/root/.virtualenvs/r-reticulate"
    $ base_exec_prefix : chr "/usr"
    $ virtualenv : chr "/root/.virtualenvs/r-reticulate"
    $ virtualenv_activate : chr ""
    $ executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ base_executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ version_string : chr "3.8.10 (default, Nov 7 2024, 13:10:47) [GCC 9.4.0]"
    $ version :Classes 'package_version', 'numeric_version' hidden list of 1
    ..$ : int [1:2] 3 8
    $ architecture : chr "64bit"
    $ anaconda : logi FALSE
    $ conda : chr "False"
    $ numpy :List of 2
    ..$ path : chr "/root/.virtualenvs/r-reticulate/lib/python3.8/site-packages/numpy"
    ..$ version:Class 'numeric_version' hidden list of 1
    .. ..$ : int [1:3] 1 24 4
    $ required_module : chr "saspy"
    $ required_module_path: NULL
    $ available : logi TRUE
    $ python_versions : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ forced : NULL
  • attr(*, "class")= chr "py_config"
    List of 22
    $ python : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ libpython : chr "/usr/lib/python3.8/config-3.8-x86_64-linux-gnu/libpython3.8.so"
    $ pythonhome : chr "/root/.virtualenvs/r-reticulate:/root/.virtualenvs/r-reticulate"
    $ pythonpath : chr "/usr/lib/python38.zip:/usr/lib/python3.8:/usr/lib/python3.8/lib-dynload:/root/.virtualenvs/r-reticulate/lib/pyt"| truncated
    $ prefix : chr "/root/.virtualenvs/r-reticulate"
    $ exec_prefix : chr "/root/.virtualenvs/r-reticulate"
    $ base_exec_prefix : chr "/usr"
    $ virtualenv : chr "/root/.virtualenvs/r-reticulate"
    $ virtualenv_activate : chr ""
    $ executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ base_executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ version_string : chr "3.8.10 (default, Nov 7 2024, 13:10:47) [GCC 9.4.0]"
    $ version :Classes 'package_version', 'numeric_version' hidden list of 1
    ..$ : int [1:2] 3 8
    $ architecture : chr "64bit"
    $ anaconda : logi FALSE
    $ conda : chr "False"
    $ numpy :List of 2
    ..$ path : chr "/root/.virtualenvs/r-reticulate/lib/python3.8/site-packages/numpy"
    ..$ version:Class 'numeric_version' hidden list of 1
    .. ..$ : int [1:3] 1 24 4
    $ required_module : chr "saspy"
    $ required_module_path: NULL
    $ available : logi TRUE
    $ python_versions : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ forced : NULL
  • attr(*, "class")= chr "py_config"
    List of 22
    $ python : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ libpython : chr "/usr/lib/python3.8/config-3.8-x86_64-linux-gnu/libpython3.8.so"
    $ pythonhome : chr "/root/.virtualenvs/r-reticulate:/root/.virtualenvs/r-reticulate"
    $ pythonpath : chr "/usr/lib/python38.zip:/usr/lib/python3.8:/usr/lib/python3.8/lib-dynload:/root/.virtualenvs/r-reticulate/lib/pyt"| truncated
    $ prefix : chr "/root/.virtualenvs/r-reticulate"
    $ exec_prefix : chr "/root/.virtualenvs/r-reticulate"
    $ base_exec_prefix : chr "/usr"
    $ virtualenv : chr "/root/.virtualenvs/r-reticulate"
    $ virtualenv_activate : chr ""
    $ executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ base_executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ version_string : chr "3.8.10 (default, Nov 7 2024, 13:10:47) [GCC 9.4.0]"
    $ version :Classes 'package_version', 'numeric_version' hidden list of 1
    ..$ : int [1:2] 3 8
    $ architecture : chr "64bit"
    $ anaconda : logi FALSE
    $ conda : chr "False"
    $ numpy :List of 2
    ..$ path : chr "/root/.virtualenvs/r-reticulate/lib/python3.8/site-packages/numpy"
    ..$ version:Class 'numeric_version' hidden list of 1
    .. ..$ : int [1:3] 1 24 4
    $ required_module : chr "saspy"
    $ required_module_path: NULL
    $ available : logi TRUE
    $ python_versions : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ forced : NULL
  • attr(*, "class")= chr "py_config"
    List of 22
    $ python : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ libpython : chr "/usr/lib/python3.8/config-3.8-x86_64-linux-gnu/libpython3.8.so"
    $ pythonhome : chr "/root/.virtualenvs/r-reticulate:/root/.virtualenvs/r-reticulate"
    $ pythonpath : chr "/usr/lib/python38.zip:/usr/lib/python3.8:/usr/lib/python3.8/lib-dynload:/root/.virtualenvs/r-reticulate/lib/pyt"| truncated
    $ prefix : chr "/root/.virtualenvs/r-reticulate"
    $ exec_prefix : chr "/root/.virtualenvs/r-reticulate"
    $ base_exec_prefix : chr "/usr"
    $ virtualenv : chr "/root/.virtualenvs/r-reticulate"
    $ virtualenv_activate : chr ""
    $ executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ base_executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ version_string : chr "3.8.10 (default, Nov 7 2024, 13:10:47) [GCC 9.4.0]"
    $ version :Classes 'package_version', 'numeric_version' hidden list of 1
    ..$ : int [1:2] 3 8
    $ architecture : chr "64bit"
    $ anaconda : logi FALSE
    $ conda : chr "False"
    $ numpy :List of 2
    ..$ path : chr "/root/.virtualenvs/r-reticulate/lib/python3.8/site-packages/numpy"
    ..$ version:Class 'numeric_version' hidden list of 1
    .. ..$ : int [1:3] 1 24 4
    $ required_module : chr "saspy"
    $ required_module_path: NULL
    $ available : logi TRUE
    $ python_versions : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ forced : NULL
  • attr(*, "class")= chr "py_config"
    List of 22
    $ python : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ libpython : chr "/usr/lib/python3.8/config-3.8-x86_64-linux-gnu/libpython3.8.so"
    $ pythonhome : chr "/root/.virtualenvs/r-reticulate:/root/.virtualenvs/r-reticulate"
    $ pythonpath : chr "/usr/lib/python38.zip:/usr/lib/python3.8:/usr/lib/python3.8/lib-dynload:/root/.virtualenvs/r-reticulate/lib/pyt"| truncated
    $ prefix : chr "/root/.virtualenvs/r-reticulate"
    $ exec_prefix : chr "/root/.virtualenvs/r-reticulate"
    $ base_exec_prefix : chr "/usr"
    $ virtualenv : chr "/root/.virtualenvs/r-reticulate"
    $ virtualenv_activate : chr ""
    $ executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ base_executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ version_string : chr "3.8.10 (default, Nov 7 2024, 13:10:47) [GCC 9.4.0]"
    $ version :Classes 'package_version', 'numeric_version' hidden list of 1
    ..$ : int [1:2] 3 8
    $ architecture : chr "64bit"
    $ anaconda : logi FALSE
    $ conda : chr "False"
    $ numpy :List of 2
    ..$ path : chr "/root/.virtualenvs/r-reticulate/lib/python3.8/site-packages/numpy"
    ..$ version:Class 'numeric_version' hidden list of 1
    .. ..$ : int [1:3] 1 24 4
    $ required_module : chr "saspy"
    $ required_module_path: NULL
    $ available : logi TRUE
    $ python_versions : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ forced : NULL
  • attr(*, "class")= chr "py_config"
    List of 22
    $ python : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ libpython : chr "/usr/lib/python3.8/config-3.8-x86_64-linux-gnu/libpython3.8.so"
    $ pythonhome : chr "/root/.virtualenvs/r-reticulate:/root/.virtualenvs/r-reticulate"
    $ pythonpath : chr "/usr/lib/python38.zip:/usr/lib/python3.8:/usr/lib/python3.8/lib-dynload:/root/.virtualenvs/r-reticulate/lib/pyt"| truncated
    $ prefix : chr "/root/.virtualenvs/r-reticulate"
    $ exec_prefix : chr "/root/.virtualenvs/r-reticulate"
    $ base_exec_prefix : chr "/usr"
    $ virtualenv : chr "/root/.virtualenvs/r-reticulate"
    $ virtualenv_activate : chr ""
    $ executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ base_executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ version_string : chr "3.8.10 (default, Nov 7 2024, 13:10:47) [GCC 9.4.0]"
    $ version :Classes 'package_version', 'numeric_version' hidden list of 1
    ..$ : int [1:2] 3 8
    $ architecture : chr "64bit"
    $ anaconda : logi FALSE
    $ conda : chr "False"
    $ numpy :List of 2
    ..$ path : chr "/root/.virtualenvs/r-reticulate/lib/python3.8/site-packages/numpy"
    ..$ version:Class 'numeric_version' hidden list of 1
    .. ..$ : int [1:3] 1 24 4
    $ required_module : chr "saspy"
    $ required_module_path: NULL
    $ available : logi TRUE
    $ python_versions : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ forced : NULL
  • attr(*, "class")= chr "py_config"
    [ FAIL 12 | WARN 0 | SKIP 0 | PASS 9 ]

══ Failed tests ════════════════════════════════════════════════════════════════
── Failure ('test-connection.R:4:3'): test connection ──────────────────────────
Expected sas_connect() to run without any errors.
i Actually got a with text:
Python module saspy was not found.

Detected Python configuration:

── Failure ('test-connection.R:6:3'): test connection ──────────────────────────
Expected sas_connect("oda") to run without any errors.
i Actually got a with text:
Python module saspy was not found.

Detected Python configuration:

── Failure ('test-connection.R:10:3'): test connection ─────────────────────────
Expected sas_disconnect() to run without any errors.
i Actually got a <chk_error> with text:
No active SAS session. Use sas_connect() to start one.
── Failure ('test-connection.R:14:3'): test connection ─────────────────────────
sas_get_session() did not throw the expected error.
── Error ('test-conversion.R:4:3'): SAS to R data.frame ────────────────────────
Error: Python module saspy was not found.

Detected Python configuration:

Backtrace:

  1. ├─sasquatch::sas_connect() at test-conversion.R:4:3
  2. │ ├─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
  3. │ │ ├─base::tryCatch(...)
  4. │ │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
  5. │ │ └─base::force(expr)
  6. │ ├─.pkgenv$SASPy$SASsession
  7. │ └─reticulate:::$.python.builtin.module(.pkgenv$SASPy, "SASsession")
  8. │ └─reticulate::py_get_attr(x, name, TRUE)
  9. └─reticulate (local) <fn>(<python.builtin.module>)
    ── Error ('test-conversion.R:28:3'): R to SAS data.frame ───────────────────────
    Error: Python module saspy was not found.

Detected Python configuration:

Backtrace:

  1. ├─sasquatch::sas_connect() at test-conversion.R:28:3
  2. │ ├─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
  3. │ │ ├─base::tryCatch(...)
  4. │ │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
  5. │ │ └─base::force(expr)
  6. │ ├─.pkgenv$SASPy$SASsession
  7. │ └─reticulate:::$.python.builtin.module(.pkgenv$SASPy, "SASsession")
  8. │ └─reticulate::py_get_attr(x, name, TRUE)
  9. └─reticulate (local) <fn>(<python.builtin.module>)
    ── Error ('test-io.R:14:3'): uploading files to SAS ────────────────────────────
    Error: Python module saspy was not found.

Detected Python configuration:

Backtrace:

  1. ├─sasquatch::sas_connect() at test-io.R:14:3
  2. │ ├─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
  3. │ │ ├─base::tryCatch(...)
  4. │ │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
  5. │ │ └─base::force(expr)
  6. │ ├─.pkgenv$SASPy$SASsession
  7. │ └─reticulate:::$.python.builtin.module(.pkgenv$SASPy, "SASsession")
  8. │ └─reticulate::py_get_attr(x, name, TRUE)
  9. └─reticulate (local) <fn>(<python.builtin.module>)
    ── Error ('test-io.R:38:3'): download files from SAS ───────────────────────────
    Error: Python module saspy was not found.

Detected Python configuration:

Backtrace:

  1. ├─sasquatch::sas_connect() at test-io.R:38:3
  2. │ ├─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
  3. │ │ ├─base::tryCatch(...)
  4. │ │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
  5. │ │ └─base::force(expr)
  6. │ ├─.pkgenv$SASPy$SASsession
  7. │ └─reticulate:::$.python.builtin.module(.pkgenv$SASPy, "SASsession")
  8. │ └─reticulate::py_get_attr(x, name, TRUE)
  9. └─reticulate (local) <fn>(<python.builtin.module>)
    ── Error ('test-io.R:67:3'): removing files from SAS ───────────────────────────
    Error: Python module saspy was not found.

Detected Python configuration:

Backtrace:

  1. ├─sasquatch::sas_connect() at test-io.R:67:3
  2. │ ├─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
  3. │ │ ├─base::tryCatch(...)
  4. │ │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
  5. │ │ └─base::force(expr)
  6. │ ├─.pkgenv$SASPy$SASsession
  7. │ └─reticulate:::$.python.builtin.module(.pkgenv$SASPy, "SASsession")
  8. │ └─reticulate::py_get_attr(x, name, TRUE)
  9. └─reticulate (local) <fn>(<python.builtin.module>)
    ── Error ('test-io.R:93:3'): listing files ─────────────────────────────────────
    Error: Python module saspy was not found.

Detected Python configuration:

Backtrace:

  1. ├─sasquatch::sas_connect() at test-io.R:93:3
  2. │ ├─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
  3. │ │ ├─base::tryCatch(...)
  4. │ │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
  5. │ │ └─base::force(expr)
  6. │ ├─.pkgenv$SASPy$SASsession
  7. │ └─reticulate:::$.python.builtin.module(.pkgenv$SASPy, "SASsession")
  8. │ └─reticulate::py_get_attr(x, name, TRUE)
  9. └─reticulate (local) <fn>(<python.builtin.module>)
    ── Error ('test-run.R:6:3'): Run SAS code from string ──────────────────────────
    Error: Python module saspy was not found.

Detected Python configuration:

Backtrace:

  1. ├─sasquatch::sas_connect() at test-run.R:6:3
  2. │ ├─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
  3. │ │ ├─base::tryCatch(...)
  4. │ │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
  5. │ │ └─base::force(expr)
  6. │ ├─.pkgenv$SASPy$SASsession
  7. │ └─reticulate:::$.python.builtin.module(.pkgenv$SASPy, "SASsession")
  8. │ └─reticulate::py_get_attr(x, name, TRUE)
  9. └─reticulate (local) <fn>(<python.builtin.module>)
    ── Error ('test-run.R:22:3'): Run SAS code from file ───────────────────────────
    Error: Python module saspy was not found.

Detected Python configuration:

Backtrace:

  1. ├─sasquatch::sas_connect() at test-run.R:22:3
  2. │ ├─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
  3. │ │ ├─base::tryCatch(...)
  4. │ │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
  5. │ │ └─base::force(expr)
  6. │ ├─.pkgenv$SASPy$SASsession
  7. │ └─reticulate:::$.python.builtin.module(.pkgenv$SASPy, "SASsession")
  8. │ └─reticulate::py_get_attr(x, name, TRUE)
  9. └─reticulate (local) <fn>(<python.builtin.module>)

[ FAIL 12 | WARN 0 | SKIP 0 | PASS 9 ]
Error: Test failures
Execution halted

R CMD check generated the following check_fails:

  1. rcmdcheck_code_docs_mismatch
  2. rcmdcheck_tests_pass

Test coverage with covr

ERROR: Test Coverage Failed

Cyclocomplexity with cyclocomp

The following function have cyclocomplexity >= 15:

function cyclocomplexity
configure_saspy 16

Static code analyses with lintr

lintr found no issues with this package!


Package Versions

package version
pkgstats 0.2.0.48
pkgcheck 0.1.2.77


Editor-in-Chief Instructions:

Processing may not proceed until the items marked with ✖️ have been resolved.

@maurolepore
Copy link
Member

@ropensci-review-bot assign @thisisnic as reviewer

@ropensci-review-bot
Copy link
Collaborator

@thisisnic added to the reviewers list. Review due date is 2025-05-14. Thanks @thisisnic for accepting to review! Please refer to our reviewer guide.

rOpenSci’s community is our best asset. We aim for reviews to be open, non-adversarial, and focused on improving software quality. Be respectful and kind! See our reviewers guide and code of conduct for more.

@ropensci-review-bot
Copy link
Collaborator

@thisisnic: If you haven't done so, please fill this form for us to update our reviewers records.

@thisisnic
Copy link

Thanks for inviting me to be involved - my review is pasted below. Hope this is useful @ryanzomorrodi , and happy for any meta-feedback on the review itself @maurolepore!

Package Review

Please check off boxes as applicable, and elaborate in comments below. Your review is not limited to these topics, as described in the reviewer guide

  • Briefly describe any working relationship you have (had) with the package authors.
  • As the reviewer I confirm that there are no conflicts of interest for me to review this work (if you are unsure whether you are in conflict, please speak to your editor before starting your review).

Documentation

The package includes all the following forms of documentation:

  • A statement of need: clearly stating problems the software is designed to solve and its target audience in README
  • Installation instructions: for the development version of package and any non-standard dependencies in README
  • Vignette(s): demonstrating major functionality that runs successfully locally
  • Function Documentation: for all exported functions
  • Examples: (that run successfully locally) for all exported functions
  • Community guidelines: including contribution guidelines in the README or CONTRIBUTING, and DESCRIPTION with URL, BugReports and Maintainer (which may be autogenerated via Authors@R).

Functionality

  • Installation: Installation succeeds as documented.
  • Functionality: Any functional claims of the software have been confirmed.
  • Performance: Any performance claims of the software have been confirmed.
  • Automated tests: Unit tests cover essential functions of the package and a reasonable range of inputs and conditions. All tests pass on the local machine.
  • Packaging guidelines: The package conforms to the rOpenSci packaging guidelines.

Estimated hours spent reviewing: 2.5

  • Should the author(s) deem it appropriate, I agree to be acknowledged as a package reviewer ("rev" role) in the package DESCRIPTION file.

Review Comments

I did this review without reading any previous context above on the thread to try to remain as independent as possible in my reasoning, so there may be ideas duplicated here.

Overall, I think this is an excellent package and provides useful functionality, which is well-documented. Most of the notes below are optional suggestions based on my subjective experience of trying out the package.

The minimal changes I'd suggest incorporating are:

  • adding the code of conduct
  • updating the vignette which didn't render successfully for me locally

Running code examples in the README

Summary: looks great - a few suggestions below but feel free to treat them all as optional.

I tried to set things up to try the package out myself, using the instructions in the README.

I did feel a little uncomfortable entering in my SAS online password into the command line - I would have preferred to be given information about the config file and where it's stored to enter it there myself as that seems more typical of how other packages handle this kind of thing.

The password remains in the R terminal unobscured after being entered, which isn't great security practice.

When I went to configure it, the setup script asked "Which server is your account on?" with the following options:

1. United States 1
2. United States 2
3. Europe 2
4. Asia Pacific 1
5. Asia Pacific 2

Mine is "Europe 1" but I was unable to select this. This didn't prevent it from running in the end though.

I also got this.

✔ Writing to C:\Users\thisi\OneDrive\DOCUME~1\VIRTUA~1\r-saspy\lib\site-packages\saspy/sascfg_personal.py.
✔ Opening sascfg_personal.py.
ℹ For more information about SASPy configuration see the sasquatch::configuration vignette or the
  SASPy documentation.
Warning message:
No java installation found. Enter the java path manually within sascfg_personal.py. 
Error: vignette ‘configuration’ not found
> sasquatch::configuration
Error: 'configuration' is not an exported object from 'namespace:sasquatch

This confused me as, skimming, my instinct is to try to run sasquatch::configuration though this isn't the correct syntax for viewing a vignette.

Once I had done this and tried again with Java installed, it worked great! I would have liked to have the SAS code example from the animated gif in the code example so I could copy and paste it.

I tried another example from the README

sas_from_r(mtcars, "mtcars")
Warning message:
In sas_from_r(mtcars, "mtcars") :
x rownames will not be transferred as a column.

It took me a moment to understand that x refers to the source table - this could be rephrased to be clearer, or a different example used which doesn't result in a warning message.

It'd also be handy to have it explained explicitly that this creates it as "mtcars" in the current SAS session - this wasn't clear to me and I had to check the docs to find this out.

cars <- sas_to_r("cars", libref = "sashelp")

As there is already a dataset in R called cars I might be tempted to call this variable something else.

Overall, I found the instructions in the README clear enough to follow. Although I had a few small technical hiccups, it worked and I was impressed by being able to run SAS code in a Quarto markdown document.

Running devtools::check()

❯ checking package subdirectories ... NOTE
  Problems with news in 'NEWS.md':
  No news entries found.

❯ checking R code for possible problems ... NOTE
  .rlang_check_is_string: no visible binding for global variable 'na_chr'
  .rlang_stop_unexpected_typeof: no visible global function definition
    for 'caller_env'
  check_logical: no visible global function definition for 'caller_arg'
  check_logical: no visible global function definition for 'caller_env'
  stop_input_type: no visible global function definition for 'caller_arg'
  stop_input_type: no visible global function definition for 'caller_env'
  Undefined global functions or variables:
    caller_arg caller_env na_chr

Looking at the second of those, it looks like the notes were generated by the signature for check_logical()

https://github.com/ryanzomorrodi/sasquatch/blob/18cd7ca03a107be78700fdd3febf6908f28563c6/R/import-standalone-types-check.R#L508-L509

I might be tempted to write my own wrapper function or ask rlang to export their check functions, but this is just personal preference.

Vignettes

When I build the "configuration.rmd" vignette locally, for the first code block under "Executing SAS code", it just dumps out the HTML like so:

sas_run_string("PROC MEANS DATA = sashelp.cars;RUN;")
#> $x
#> $x$lst
#> [1] "<!DOCTYPE html>\n<html lang=\"en\" xml:lang=\"en\" xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta charset=\"utf-8\"/>\n<meta content=\"SAS 9.4\" name=\"generator\"/>\n<title>SAS Output</title>\n<style>\n/*<![CDATA[*/\n.body.c > table, .body.c > pre, .body.c div > table,\n.body.c div > pre, .body.c > table, .body.c > pre,\n.body.j > table, .body.j > pre, .body.j div > table,\n.body.j div > pre, .body.j > table, .body.j > pre,\n.body.c p.note, .body.c p.warning, .body.c p.error, .body.c p.fatal,\n.body.j p.note, .body.j p.warning, .body.j p.error, .body.j p.fatal,\n.body.c > table.layoutcontainer, .body.j > table.layoutcontainer { margin-left: auto; margin-right: auto }\n.layoutregion.l table, .layoutregion.l pre, .layoutregion.l p.note,\n.layoutregion.l p.warning, .layoutregion.l p.error, .layoutregion.l p.fatal { margin-left: 0 }\n.layoutregion.c table, .layoutregion.c pre, .layoutregion.c p.note,\n.layoutregion.c p.warning, .layoutregion.c p.error, .layoutregion.c p.fatal { margin-left: auto; margin-right: auto }\n.layoutregion.r table, .layoutregion.r pre, .layoutregion.r p.note,\n.layoutregion.r table, .layoutregion.r pre, .layoutregion.r p.note,\n.layoutregion.r p.warning, .layoutregion.r p.error, .layoutregion.r p.fatal { margin-right: 0 }\narticle, aside, details, figcaption, figure, footer, header, hgroup, nav, section { display: block }\nhtml{ font-size: 100% }\n.body { margin: 1em; font-size: 13px; line-height: 1.231 }\nsup { position: relative; vertical-align: baseline; bottom: 0.25em; font-size: 0.8em }\nsub { position: relative; vertical-align: baseline; top: 0.25em; font-size: 0.8em }\nul, ol { margin: 1em 0; padding: 0 0 0 40px }\ndd { margin: 0 0 0 40px }\nnav ul, nav ol { list-style: none; list-style-image: none; margin: 0; padding: 0 }\nimg { border: 0; vertical-align: middle }\nsvg:not(:root) { overflow: hidden }\nfigure { margin: 0 }\ntable { border-collapse: collapse; 
...

It might be worth including this output as an image or other workaround instead of as runnable code.

In the configuration vignette, the "Access methods" contains a nested list - it's a little hard to skim and might be better as different headings instead.

The exported functions

I found the naming of the exported functions intuitive. The exported functionality feels like enough to get things done without being overwhelming. I think as the package evolves and users asks questions, there will be opportunity to expand some of the descriptions of functions to contain a little more information.

Contribution guidelines

These guidelines exist, but the code of conduct that they link to is missing.

@maurolepore
Copy link
Member

@thisisnic thanks so much for your review! I love your approach of unpacking your user experience.

@maurolepore
Copy link
Member

@ropensci-review-bot submit review #673 (comment) time 2.5.

@ropensci-review-bot
Copy link
Collaborator

Logged review for thisisnic (hours: 2.5.)

@maurolepore
Copy link
Member

@ryanzomorrodi we're still waiting for a second reviewer to accept and review. Please hold and plan to incorporate the feedback of both reviewers at once.

@ryanzomorrodi
Copy link
Author

Okay, sounds good.

Thank you @thisisnic for all your feedback!

@maurolepore
Copy link
Member

@ropensci-review-bot add @tataphani as reviewer

@ropensci-review-bot
Copy link
Collaborator

@tataphani added to the reviewers list. Review due date is 2025-05-25. Thanks @tataphani for accepting to review! Please refer to our reviewer guide.

rOpenSci’s community is our best asset. We aim for reviews to be open, non-adversarial, and focused on improving software quality. Be respectful and kind! See our reviewers guide and code of conduct for more.

@ropensci-review-bot
Copy link
Collaborator

@tataphani: If you haven't done so, please fill this form for us to update our reviewers records.

@maurolepore
Copy link
Member

@tataphani thanks for accepting this review. Please let me know any questions you have.

@tataphani
Copy link

tataphani commented May 5, 2025 via email

@maurolepore
Copy link
Member

maurolepore commented May 6, 2025

@tataphani could you please summarize what the email says if you believe is relevant?

Feel free to ask here anything that is unclear or that you can't find in our guide for reviewers.

I'm also available via email or rOpenSci's Slack.

@ropensci-review-bot
Copy link
Collaborator

@ryanzomorrodi: please post your response with @ropensci-review-bot submit response <url to issue comment> if you haven't done so already (this is an automatic reminder).

Here's the author guide for response. https://devguide.ropensci.org/authors-guide.html

@tataphani
Copy link

got the access

@maurolepore
Copy link
Member

maurolepore commented May 17, 2025

@ryanzomorrodi sorry about the confusing bot message. Please continue to wait until after @tataphani submits his review. Thanks for your patience.

@ropensci-review-bot
Copy link
Collaborator

📆 @tataphani you have 2 days left before the due date for your review (2025-05-25).

@maurolepore
Copy link
Member

@tataphani the bot gently reminded us about your review. Could you please give us an estimate of when it would be ready?

@tataphani
Copy link

tataphani commented May 29, 2025 via email

@maurolepore
Copy link
Member

Thanks @tataphani for the update.

Our dev guide has a chapter for reviewers
https://devguide.ropensci.org/softwarereview_reviewer.html

It includes a template with a checklist for what to check
https://devguide.ropensci.org/reviewtemplate.html

Sure, feel free to reach out on slack.

Yes, we have a bot command that allows us to set a new due date. How much longer do you think you would need?

@tataphani
Copy link

tataphani commented May 30, 2025 via email

@maurolepore
Copy link
Member

@ropensci-review-bot set due date for @tataphani to 2025-06-20

@ropensci-review-bot
Copy link
Collaborator

Review due date for @tataphani is now 20-June-2025

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

7 participants