GH-34421: [R] Let GcsFileSystem take a path for json_credentials - #34524

Merged
paleolimbot merged 11 commits into
apache:mainfrom
amoeba:gh-34421-gcs-credentials-path
Mar 22, 2023
Merged

GH-34421: [R] Let GcsFileSystem take a path for json_credentials#34524
paleolimbot merged 11 commits into
apache:mainfrom
amoeba:gh-34421-gcs-credentials-path

Conversation

@amoeba

@amoebaamoeba commented Mar 9, 2023

Copy link
Copy Markdown
Member

Rationale for this change

Existing documentation for this argument was misleading.

What changes are included in this PR?

A change in functionality, matching tests, and updated documentation are included. json_credentials can now either be a literal string containing credentials or a string containing a path to credentials. In the latter case, credentials will be automatically read in from the fileystem.

Are these changes tested?

Yes

Are there any user-facing changes?

Yes, though not breaking. This affects user-facing APIs and documentation and is both a bug fix and new functionality.

Closes#34421
Closes#33106

@github-actions

Copy link
Copy Markdown

@paleolimbotpaleolimbot left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you! Just a note about the encoding you assume and what happens when the file contains more than one line.

Comment threadr/R/filesystem.R Outdated

# Handle reading json_credentials from the filesystem
if ("json_credentials" %in% names(options) && file.exists(options[["json_credentials"]])) {
options[["json_credentials"]] <- paste(readLines(options[["json_credentials"]]), collapse = "")

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I forget the exact details but I think readLines() assumes system encoding (rather than UTF-8, which matters on Windows). Any thought as to which one of those is a better assumption if the value points to a file? (The workaround would be for the user to read in the file themselves first with an explicit encoding).

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, did you want to collapse = "\n"?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I forget the exact details but I think readLines() assumes system encoding (rather than UTF-8, which matters on Windows). Any thought as to which one of those is a better assumption if the value points to a file? (The workaround would be for the user to read in the file themselves first with an explicit encoding).

Thanks for catching this point. You're right about readLines' behavior. To your question, I'm not entirely sure. If I test on my Windows 11 VM, the system-wide encoding is Windows 1252, but JSON files downloaded via Edge produces either ASCII or UTF-8 files. Maybe this just works or maybe just works on newer Win10/11 builds?

Also, did you want to collapse = "\n"?

I suppose that's slightly better, though I think either works just the same. I'll change it.

Comment threadr/tests/testthat/test-gcs.R Outdated
cred_path <- tempfile()
on.exit(unlink(cred_path))

writeLines("fromdisk", cred_path)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe put some non-ASCII text and here? In test-csv there should be an example of how to do this (there are some \u and charToRaw() and writeBin things and I always forget the details).

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done in f3018b0. I didn't go too wild with it.

@github-actionsgithub-actionsBot added awaiting committer review Awaiting committer review and removed awaiting review Awaiting review labels Mar 10, 2023
@amoeba

Copy link
Copy Markdown
MemberAuthor

Thanks for the review @paleolimbot. Let me know what you think about the readLines and encoding thing. Other than that I think this is good to go.

Comment threadr/tests/testthat/test-gcs.R Outdated

# This calls readLines which complains about embedded nuls and missing a
# final newline (See ?readLines)
suppressWarnings({

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Rather than suppress this warning, you could (1) use something other than readLines() or (2) include a final newline in your test data. I'm guessing these are files downloaded from the google cloud console 99% of the time, so including a final newline would probably be sufficient.

(otherwise we might suppress warnings that are actual problems)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good point. I found I had to run the character vector through iconv to get exactly the content into the file (via writeBin). See 617d8b3. Otherwise, you always get a \00 (which R calls an embedded nul) at the end.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

...in case it's helpful: https://github.com/apache/arrow/blob/main/r/tests/testthat/test-csv.R#L318-L328

...and

read_utf8 <- function(file) {
res <- readBin(file, "raw", n = file.info(file)$size)
res <- rawToChar(res)
Encoding(res) <- "UTF-8"
res
}

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for this. I tried a few combinations that still used readLines and couldn't get something I liked that also passes CI. Even after ensuring the the test file has the exact UTF-8 bytes I want, readLines(path, encoding = "UTF-8") seems to still decode as Latin1. I stopped short of using a connection or mutating options. I can't reproduce this on my own Windows VM so testing solutions in CI is slow.

I ended up swapping out readLines for your above read_utf8 helper and previously updated the docs to indicate that the file must be UTF-8 encoded. I'll check CI later tonight/tomorrow.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey @paleolimbot this is ready for a review now that all checks pass.

@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting committer review Awaiting committer review labels Mar 20, 2023
This fixes two issues that using writeBin directly on a character vector has (embedded nul, no final newline)
@github-actionsgithub-actionsBot added awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Mar 20, 2023
@amoeba

Copy link
Copy Markdown
MemberAuthor

CI failure is real failure,

-- Failure ('test-gcs.R:107:3'): GcsFileSystem$create() can read json_credentials --
`object` (`actual`) not equal to `expected` (`expected`).
`actual`: "{\"key\" : \"valué\"}"
`expected`: "{\"key\" : \"valué\"}" Backtrace:
x
1. \-arrow:::expect_equal(fs$options$json_credentials, "{\"key\" : \"valué\"}") at test-gcs.R:107:2
2. \-testthat::expect_equal(...) at D:\a\arrow\arrow\r\check\arrow.Rcheck\tests\testthat\helper-expectation.R:42:4

I'll look into this and ping you again when it's ready for review.

@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting change review Awaiting change review labels Mar 20, 2023
@github-actionsgithub-actionsBot added awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Mar 20, 2023

@paleolimbotpaleolimbot left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for staying with me on the "non-ASCII" rabbit hole!

@github-actionsgithub-actionsBot added awaiting merge Awaiting merge and removed awaiting change review Awaiting change review labels Mar 22, 2023
@amoeba

Copy link
Copy Markdown
MemberAuthor

Glad you caught it, thanks again!

@paleolimbot
paleolimbot merged commit d526fd9 into apache:mainMar 22, 2023
@ursabot

Copy link
Copy Markdown

Benchmark runs are scheduled for baseline = ce0d20c and contender = d526fd9. d526fd9 is a master commit associated with this PR. Results will be available as each benchmark for each run completes.
Conbench compare runs links:
[Finished ⬇️0.0% ⬆️0.0%] ec2-t3-xlarge-us-east-2
[Finished ⬇️0.42% ⬆️0.03%] test-mac-arm
[Finished ⬇️0.0% ⬆️0.0%] ursa-i9-9960x
[Finished ⬇️0.03% ⬆️0.0%] ursa-thinkcentre-m75q
Buildkite builds:
[Finished] d526fd9d ec2-t3-xlarge-us-east-2
[Finished] d526fd9d test-mac-arm
[Finished] d526fd9d ursa-i9-9960x
[Finished] d526fd9d ursa-thinkcentre-m75q
[Finished] ce0d20c0 ec2-t3-xlarge-us-east-2
[Finished] ce0d20c0 test-mac-arm
[Finished] ce0d20c0 ursa-i9-9960x
[Finished] ce0d20c0 ursa-thinkcentre-m75q
Supported benchmarks:
ec2-t3-xlarge-us-east-2: Supported benchmark langs: Python, R. Runs only benchmarks with cloud = True
test-mac-arm: Supported benchmark langs: C++, Python, R
ursa-i9-9960x: Supported benchmark langs: Python, R, JavaScript
ursa-thinkcentre-m75q: Supported benchmark langs: C++, Java

ArgusLi pushed a commit to Bit-Quill/arrow that referenced this pull request May 15, 2023
apache#34524)
### Rationale for this change
Existing documentation for this argument was misleading.
### What changes are included in this PR?
A change in functionality, matching tests, and updated documentation are included. `json_credentials` can now either be a literal string containing credentials or a string containing a path to credentials. In the latter case, credentials will be automatically read in from the fileystem.
### Are these changes tested?
Yes
### Are there any user-facing changes?
Yes, though not breaking. This affects user-facing APIs and documentation and is both a bug fix and new functionality.
Closesapache#34421Closesapache#33106
* Closes: apache#34421
Authored-by: Bryce Mecum <petridish@gmail.com>
Signed-off-by: Dewey Dunnington <dewey@fishandwhistle.net>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[R] Allow GcsFileSystem$create to accept a path to json_credentials [R] Documentation for json_credentials is misleading

3 participants

@amoeba@ursabot@paleolimbot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

GH-34421: [R] Let GcsFileSystem take a path for json_credentials - #34524

Merged
paleolimbot merged 11 commits into
apache:mainfrom
amoeba:gh-34421-gcs-credentials-path
Mar 22, 2023
Merged

GH-34421: [R] Let GcsFileSystem take a path for json_credentials#34524
paleolimbot merged 11 commits into
apache:mainfrom
amoeba:gh-34421-gcs-credentials-path

Conversation

@amoeba

@amoebaamoeba commented Mar 9, 2023

Copy link
Copy Markdown
Member

Rationale for this change

Existing documentation for this argument was misleading.

What changes are included in this PR?

A change in functionality, matching tests, and updated documentation are included. json_credentials can now either be a literal string containing credentials or a string containing a path to credentials. In the latter case, credentials will be automatically read in from the fileystem.

Are these changes tested?

Yes

Are there any user-facing changes?

Yes, though not breaking. This affects user-facing APIs and documentation and is both a bug fix and new functionality.

Closes#34421
Closes#33106

@github-actions

Copy link
Copy Markdown

@paleolimbotpaleolimbot left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you! Just a note about the encoding you assume and what happens when the file contains more than one line.

Comment threadr/R/filesystem.R Outdated

# Handle reading json_credentials from the filesystem
if ("json_credentials" %in% names(options) && file.exists(options[["json_credentials"]])) {
options[["json_credentials"]] <- paste(readLines(options[["json_credentials"]]), collapse = "")

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I forget the exact details but I think readLines() assumes system encoding (rather than UTF-8, which matters on Windows). Any thought as to which one of those is a better assumption if the value points to a file? (The workaround would be for the user to read in the file themselves first with an explicit encoding).

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, did you want to collapse = "\n"?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I forget the exact details but I think readLines() assumes system encoding (rather than UTF-8, which matters on Windows). Any thought as to which one of those is a better assumption if the value points to a file? (The workaround would be for the user to read in the file themselves first with an explicit encoding).

Thanks for catching this point. You're right about readLines' behavior. To your question, I'm not entirely sure. If I test on my Windows 11 VM, the system-wide encoding is Windows 1252, but JSON files downloaded via Edge produces either ASCII or UTF-8 files. Maybe this just works or maybe just works on newer Win10/11 builds?

Also, did you want to collapse = "\n"?

I suppose that's slightly better, though I think either works just the same. I'll change it.

Comment threadr/tests/testthat/test-gcs.R Outdated
cred_path <- tempfile()
on.exit(unlink(cred_path))

writeLines("fromdisk", cred_path)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe put some non-ASCII text and here? In test-csv there should be an example of how to do this (there are some \u and charToRaw() and writeBin things and I always forget the details).

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done in f3018b0. I didn't go too wild with it.

@github-actionsgithub-actionsBot added awaiting committer review Awaiting committer review and removed awaiting review Awaiting review labels Mar 10, 2023
@amoeba

Copy link
Copy Markdown
MemberAuthor

Thanks for the review @paleolimbot. Let me know what you think about the readLines and encoding thing. Other than that I think this is good to go.

Comment threadr/tests/testthat/test-gcs.R Outdated

# This calls readLines which complains about embedded nuls and missing a
# final newline (See ?readLines)
suppressWarnings({

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Rather than suppress this warning, you could (1) use something other than readLines() or (2) include a final newline in your test data. I'm guessing these are files downloaded from the google cloud console 99% of the time, so including a final newline would probably be sufficient.

(otherwise we might suppress warnings that are actual problems)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good point. I found I had to run the character vector through iconv to get exactly the content into the file (via writeBin). See 617d8b3. Otherwise, you always get a \00 (which R calls an embedded nul) at the end.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

...in case it's helpful: https://github.com/apache/arrow/blob/main/r/tests/testthat/test-csv.R#L318-L328

...and

read_utf8 <- function(file) {
res <- readBin(file, "raw", n = file.info(file)$size)
res <- rawToChar(res)
Encoding(res) <- "UTF-8"
res
}

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for this. I tried a few combinations that still used readLines and couldn't get something I liked that also passes CI. Even after ensuring the the test file has the exact UTF-8 bytes I want, readLines(path, encoding = "UTF-8") seems to still decode as Latin1. I stopped short of using a connection or mutating options. I can't reproduce this on my own Windows VM so testing solutions in CI is slow.

I ended up swapping out readLines for your above read_utf8 helper and previously updated the docs to indicate that the file must be UTF-8 encoded. I'll check CI later tonight/tomorrow.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey @paleolimbot this is ready for a review now that all checks pass.

@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting committer review Awaiting committer review labels Mar 20, 2023
This fixes two issues that using writeBin directly on a character vector has (embedded nul, no final newline)
@github-actionsgithub-actionsBot added awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Mar 20, 2023
@amoeba

Copy link
Copy Markdown
MemberAuthor

CI failure is real failure,

-- Failure ('test-gcs.R:107:3'): GcsFileSystem$create() can read json_credentials --
`object` (`actual`) not equal to `expected` (`expected`).
`actual`: "{\"key\" : \"valué\"}"
`expected`: "{\"key\" : \"valué\"}" Backtrace:
x
1. \-arrow:::expect_equal(fs$options$json_credentials, "{\"key\" : \"valué\"}") at test-gcs.R:107:2
2. \-testthat::expect_equal(...) at D:\a\arrow\arrow\r\check\arrow.Rcheck\tests\testthat\helper-expectation.R:42:4

I'll look into this and ping you again when it's ready for review.

@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting change review Awaiting change review labels Mar 20, 2023
@github-actionsgithub-actionsBot added awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Mar 20, 2023

@paleolimbotpaleolimbot left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for staying with me on the "non-ASCII" rabbit hole!

@github-actionsgithub-actionsBot added awaiting merge Awaiting merge and removed awaiting change review Awaiting change review labels Mar 22, 2023
@amoeba

Copy link
Copy Markdown
MemberAuthor

Glad you caught it, thanks again!

@paleolimbot
paleolimbot merged commit d526fd9 into apache:mainMar 22, 2023
@ursabot

Copy link
Copy Markdown

Benchmark runs are scheduled for baseline = ce0d20c and contender = d526fd9. d526fd9 is a master commit associated with this PR. Results will be available as each benchmark for each run completes.
Conbench compare runs links:
[Finished ⬇️0.0% ⬆️0.0%] ec2-t3-xlarge-us-east-2
[Finished ⬇️0.42% ⬆️0.03%] test-mac-arm
[Finished ⬇️0.0% ⬆️0.0%] ursa-i9-9960x
[Finished ⬇️0.03% ⬆️0.0%] ursa-thinkcentre-m75q
Buildkite builds:
[Finished] d526fd9d ec2-t3-xlarge-us-east-2
[Finished] d526fd9d test-mac-arm
[Finished] d526fd9d ursa-i9-9960x
[Finished] d526fd9d ursa-thinkcentre-m75q
[Finished] ce0d20c0 ec2-t3-xlarge-us-east-2
[Finished] ce0d20c0 test-mac-arm
[Finished] ce0d20c0 ursa-i9-9960x
[Finished] ce0d20c0 ursa-thinkcentre-m75q
Supported benchmarks:
ec2-t3-xlarge-us-east-2: Supported benchmark langs: Python, R. Runs only benchmarks with cloud = True
test-mac-arm: Supported benchmark langs: C++, Python, R
ursa-i9-9960x: Supported benchmark langs: Python, R, JavaScript
ursa-thinkcentre-m75q: Supported benchmark langs: C++, Java

ArgusLi pushed a commit to Bit-Quill/arrow that referenced this pull request May 15, 2023
apache#34524)
### Rationale for this change
Existing documentation for this argument was misleading.
### What changes are included in this PR?
A change in functionality, matching tests, and updated documentation are included. `json_credentials` can now either be a literal string containing credentials or a string containing a path to credentials. In the latter case, credentials will be automatically read in from the fileystem.
### Are these changes tested?
Yes
### Are there any user-facing changes?
Yes, though not breaking. This affects user-facing APIs and documentation and is both a bug fix and new functionality.
Closesapache#34421Closesapache#33106
* Closes: apache#34421
Authored-by: Bryce Mecum <petridish@gmail.com>
Signed-off-by: Dewey Dunnington <dewey@fishandwhistle.net>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[R] Allow GcsFileSystem$create to accept a path to json_credentials [R] Documentation for json_credentials is misleading

3 participants

@amoeba@ursabot@paleolimbot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

GH-34421: [R] Let GcsFileSystem take a path for json_credentials - #34524

Merged
paleolimbot merged 11 commits into
apache:mainfrom
amoeba:gh-34421-gcs-credentials-path
Mar 22, 2023
Merged

GH-34421: [R] Let GcsFileSystem take a path for json_credentials#34524
paleolimbot merged 11 commits into
apache:mainfrom
amoeba:gh-34421-gcs-credentials-path

Conversation

@amoeba

@amoebaamoeba commented Mar 9, 2023

Copy link
Copy Markdown
Member

Rationale for this change

Existing documentation for this argument was misleading.

What changes are included in this PR?

A change in functionality, matching tests, and updated documentation are included. json_credentials can now either be a literal string containing credentials or a string containing a path to credentials. In the latter case, credentials will be automatically read in from the fileystem.

Are these changes tested?

Yes

Are there any user-facing changes?

Yes, though not breaking. This affects user-facing APIs and documentation and is both a bug fix and new functionality.

Closes#34421
Closes#33106

@github-actions

Copy link
Copy Markdown

@paleolimbotpaleolimbot left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you! Just a note about the encoding you assume and what happens when the file contains more than one line.

Comment threadr/R/filesystem.R Outdated

# Handle reading json_credentials from the filesystem
if ("json_credentials" %in% names(options) && file.exists(options[["json_credentials"]])) {
options[["json_credentials"]] <- paste(readLines(options[["json_credentials"]]), collapse = "")

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I forget the exact details but I think readLines() assumes system encoding (rather than UTF-8, which matters on Windows). Any thought as to which one of those is a better assumption if the value points to a file? (The workaround would be for the user to read in the file themselves first with an explicit encoding).

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, did you want to collapse = "\n"?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I forget the exact details but I think readLines() assumes system encoding (rather than UTF-8, which matters on Windows). Any thought as to which one of those is a better assumption if the value points to a file? (The workaround would be for the user to read in the file themselves first with an explicit encoding).

Thanks for catching this point. You're right about readLines' behavior. To your question, I'm not entirely sure. If I test on my Windows 11 VM, the system-wide encoding is Windows 1252, but JSON files downloaded via Edge produces either ASCII or UTF-8 files. Maybe this just works or maybe just works on newer Win10/11 builds?

Also, did you want to collapse = "\n"?

I suppose that's slightly better, though I think either works just the same. I'll change it.

Comment threadr/tests/testthat/test-gcs.R Outdated
cred_path <- tempfile()
on.exit(unlink(cred_path))

writeLines("fromdisk", cred_path)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe put some non-ASCII text and here? In test-csv there should be an example of how to do this (there are some \u and charToRaw() and writeBin things and I always forget the details).

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done in f3018b0. I didn't go too wild with it.

@github-actionsgithub-actionsBot added awaiting committer review Awaiting committer review and removed awaiting review Awaiting review labels Mar 10, 2023
@amoeba

Copy link
Copy Markdown
MemberAuthor

Thanks for the review @paleolimbot. Let me know what you think about the readLines and encoding thing. Other than that I think this is good to go.

Comment threadr/tests/testthat/test-gcs.R Outdated

# This calls readLines which complains about embedded nuls and missing a
# final newline (See ?readLines)
suppressWarnings({

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Rather than suppress this warning, you could (1) use something other than readLines() or (2) include a final newline in your test data. I'm guessing these are files downloaded from the google cloud console 99% of the time, so including a final newline would probably be sufficient.

(otherwise we might suppress warnings that are actual problems)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good point. I found I had to run the character vector through iconv to get exactly the content into the file (via writeBin). See 617d8b3. Otherwise, you always get a \00 (which R calls an embedded nul) at the end.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

...in case it's helpful: https://github.com/apache/arrow/blob/main/r/tests/testthat/test-csv.R#L318-L328

...and

read_utf8 <- function(file) {
res <- readBin(file, "raw", n = file.info(file)$size)
res <- rawToChar(res)
Encoding(res) <- "UTF-8"
res
}

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for this. I tried a few combinations that still used readLines and couldn't get something I liked that also passes CI. Even after ensuring the the test file has the exact UTF-8 bytes I want, readLines(path, encoding = "UTF-8") seems to still decode as Latin1. I stopped short of using a connection or mutating options. I can't reproduce this on my own Windows VM so testing solutions in CI is slow.

I ended up swapping out readLines for your above read_utf8 helper and previously updated the docs to indicate that the file must be UTF-8 encoded. I'll check CI later tonight/tomorrow.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey @paleolimbot this is ready for a review now that all checks pass.

@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting committer review Awaiting committer review labels Mar 20, 2023
This fixes two issues that using writeBin directly on a character vector has (embedded nul, no final newline)
@github-actionsgithub-actionsBot added awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Mar 20, 2023
@amoeba

Copy link
Copy Markdown
MemberAuthor

CI failure is real failure,

-- Failure ('test-gcs.R:107:3'): GcsFileSystem$create() can read json_credentials --
`object` (`actual`) not equal to `expected` (`expected`).
`actual`: "{\"key\" : \"valué\"}"
`expected`: "{\"key\" : \"valué\"}" Backtrace:
x
1. \-arrow:::expect_equal(fs$options$json_credentials, "{\"key\" : \"valué\"}") at test-gcs.R:107:2
2. \-testthat::expect_equal(...) at D:\a\arrow\arrow\r\check\arrow.Rcheck\tests\testthat\helper-expectation.R:42:4

I'll look into this and ping you again when it's ready for review.

@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting change review Awaiting change review labels Mar 20, 2023
@github-actionsgithub-actionsBot added awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Mar 20, 2023

@paleolimbotpaleolimbot left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for staying with me on the "non-ASCII" rabbit hole!

@github-actionsgithub-actionsBot added awaiting merge Awaiting merge and removed awaiting change review Awaiting change review labels Mar 22, 2023
@amoeba

Copy link
Copy Markdown
MemberAuthor

Glad you caught it, thanks again!

@paleolimbot
paleolimbot merged commit d526fd9 into apache:mainMar 22, 2023
@ursabot

Copy link
Copy Markdown

Benchmark runs are scheduled for baseline = ce0d20c and contender = d526fd9. d526fd9 is a master commit associated with this PR. Results will be available as each benchmark for each run completes.
Conbench compare runs links:
[Finished ⬇️0.0% ⬆️0.0%] ec2-t3-xlarge-us-east-2
[Finished ⬇️0.42% ⬆️0.03%] test-mac-arm
[Finished ⬇️0.0% ⬆️0.0%] ursa-i9-9960x
[Finished ⬇️0.03% ⬆️0.0%] ursa-thinkcentre-m75q
Buildkite builds:
[Finished] d526fd9d ec2-t3-xlarge-us-east-2
[Finished] d526fd9d test-mac-arm
[Finished] d526fd9d ursa-i9-9960x
[Finished] d526fd9d ursa-thinkcentre-m75q
[Finished] ce0d20c0 ec2-t3-xlarge-us-east-2
[Finished] ce0d20c0 test-mac-arm
[Finished] ce0d20c0 ursa-i9-9960x
[Finished] ce0d20c0 ursa-thinkcentre-m75q
Supported benchmarks:
ec2-t3-xlarge-us-east-2: Supported benchmark langs: Python, R. Runs only benchmarks with cloud = True
test-mac-arm: Supported benchmark langs: C++, Python, R
ursa-i9-9960x: Supported benchmark langs: Python, R, JavaScript
ursa-thinkcentre-m75q: Supported benchmark langs: C++, Java

ArgusLi pushed a commit to Bit-Quill/arrow that referenced this pull request May 15, 2023
apache#34524)
### Rationale for this change
Existing documentation for this argument was misleading.
### What changes are included in this PR?
A change in functionality, matching tests, and updated documentation are included. `json_credentials` can now either be a literal string containing credentials or a string containing a path to credentials. In the latter case, credentials will be automatically read in from the fileystem.
### Are these changes tested?
Yes
### Are there any user-facing changes?
Yes, though not breaking. This affects user-facing APIs and documentation and is both a bug fix and new functionality.
Closesapache#34421Closesapache#33106
* Closes: apache#34421
Authored-by: Bryce Mecum <petridish@gmail.com>
Signed-off-by: Dewey Dunnington <dewey@fishandwhistle.net>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[R] Allow GcsFileSystem$create to accept a path to json_credentials [R] Documentation for json_credentials is misleading

3 participants

@amoeba@ursabot@paleolimbot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

GH-34421: [R] Let GcsFileSystem take a path for json_credentials - #34524

Merged
paleolimbot merged 11 commits into
apache:mainfrom
amoeba:gh-34421-gcs-credentials-path
Mar 22, 2023
Merged

GH-34421: [R] Let GcsFileSystem take a path for json_credentials#34524
paleolimbot merged 11 commits into
apache:mainfrom
amoeba:gh-34421-gcs-credentials-path

Conversation

@amoeba

@amoebaamoeba commented Mar 9, 2023

Copy link
Copy Markdown
Member

Rationale for this change

Existing documentation for this argument was misleading.

What changes are included in this PR?

A change in functionality, matching tests, and updated documentation are included. json_credentials can now either be a literal string containing credentials or a string containing a path to credentials. In the latter case, credentials will be automatically read in from the fileystem.

Are these changes tested?

Yes

Are there any user-facing changes?

Yes, though not breaking. This affects user-facing APIs and documentation and is both a bug fix and new functionality.

Closes#34421
Closes#33106

@github-actions

Copy link
Copy Markdown

@paleolimbotpaleolimbot left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you! Just a note about the encoding you assume and what happens when the file contains more than one line.

Comment threadr/R/filesystem.R Outdated

# Handle reading json_credentials from the filesystem
if ("json_credentials" %in% names(options) && file.exists(options[["json_credentials"]])) {
options[["json_credentials"]] <- paste(readLines(options[["json_credentials"]]), collapse = "")

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I forget the exact details but I think readLines() assumes system encoding (rather than UTF-8, which matters on Windows). Any thought as to which one of those is a better assumption if the value points to a file? (The workaround would be for the user to read in the file themselves first with an explicit encoding).

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, did you want to collapse = "\n"?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I forget the exact details but I think readLines() assumes system encoding (rather than UTF-8, which matters on Windows). Any thought as to which one of those is a better assumption if the value points to a file? (The workaround would be for the user to read in the file themselves first with an explicit encoding).

Thanks for catching this point. You're right about readLines' behavior. To your question, I'm not entirely sure. If I test on my Windows 11 VM, the system-wide encoding is Windows 1252, but JSON files downloaded via Edge produces either ASCII or UTF-8 files. Maybe this just works or maybe just works on newer Win10/11 builds?

Also, did you want to collapse = "\n"?

I suppose that's slightly better, though I think either works just the same. I'll change it.

Comment threadr/tests/testthat/test-gcs.R Outdated
cred_path <- tempfile()
on.exit(unlink(cred_path))

writeLines("fromdisk", cred_path)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe put some non-ASCII text and here? In test-csv there should be an example of how to do this (there are some \u and charToRaw() and writeBin things and I always forget the details).

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done in f3018b0. I didn't go too wild with it.

@github-actionsgithub-actionsBot added awaiting committer review Awaiting committer review and removed awaiting review Awaiting review labels Mar 10, 2023
@amoeba

Copy link
Copy Markdown
MemberAuthor

Thanks for the review @paleolimbot. Let me know what you think about the readLines and encoding thing. Other than that I think this is good to go.

Comment threadr/tests/testthat/test-gcs.R Outdated

# This calls readLines which complains about embedded nuls and missing a
# final newline (See ?readLines)
suppressWarnings({

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Rather than suppress this warning, you could (1) use something other than readLines() or (2) include a final newline in your test data. I'm guessing these are files downloaded from the google cloud console 99% of the time, so including a final newline would probably be sufficient.

(otherwise we might suppress warnings that are actual problems)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good point. I found I had to run the character vector through iconv to get exactly the content into the file (via writeBin). See 617d8b3. Otherwise, you always get a \00 (which R calls an embedded nul) at the end.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

...in case it's helpful: https://github.com/apache/arrow/blob/main/r/tests/testthat/test-csv.R#L318-L328

...and

read_utf8 <- function(file) {
res <- readBin(file, "raw", n = file.info(file)$size)
res <- rawToChar(res)
Encoding(res) <- "UTF-8"
res
}

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for this. I tried a few combinations that still used readLines and couldn't get something I liked that also passes CI. Even after ensuring the the test file has the exact UTF-8 bytes I want, readLines(path, encoding = "UTF-8") seems to still decode as Latin1. I stopped short of using a connection or mutating options. I can't reproduce this on my own Windows VM so testing solutions in CI is slow.

I ended up swapping out readLines for your above read_utf8 helper and previously updated the docs to indicate that the file must be UTF-8 encoded. I'll check CI later tonight/tomorrow.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey @paleolimbot this is ready for a review now that all checks pass.

@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting committer review Awaiting committer review labels Mar 20, 2023
This fixes two issues that using writeBin directly on a character vector has (embedded nul, no final newline)
@github-actionsgithub-actionsBot added awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Mar 20, 2023
@amoeba

Copy link
Copy Markdown
MemberAuthor

CI failure is real failure,

-- Failure ('test-gcs.R:107:3'): GcsFileSystem$create() can read json_credentials --
`object` (`actual`) not equal to `expected` (`expected`).
`actual`: "{\"key\" : \"valué\"}"
`expected`: "{\"key\" : \"valué\"}" Backtrace:
x
1. \-arrow:::expect_equal(fs$options$json_credentials, "{\"key\" : \"valué\"}") at test-gcs.R:107:2
2. \-testthat::expect_equal(...) at D:\a\arrow\arrow\r\check\arrow.Rcheck\tests\testthat\helper-expectation.R:42:4

I'll look into this and ping you again when it's ready for review.

@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting change review Awaiting change review labels Mar 20, 2023
@github-actionsgithub-actionsBot added awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Mar 20, 2023

@paleolimbotpaleolimbot left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for staying with me on the "non-ASCII" rabbit hole!

@github-actionsgithub-actionsBot added awaiting merge Awaiting merge and removed awaiting change review Awaiting change review labels Mar 22, 2023
@amoeba

Copy link
Copy Markdown
MemberAuthor

Glad you caught it, thanks again!

@paleolimbot
paleolimbot merged commit d526fd9 into apache:mainMar 22, 2023
@ursabot

Copy link
Copy Markdown

Benchmark runs are scheduled for baseline = ce0d20c and contender = d526fd9. d526fd9 is a master commit associated with this PR. Results will be available as each benchmark for each run completes.
Conbench compare runs links:
[Finished ⬇️0.0% ⬆️0.0%] ec2-t3-xlarge-us-east-2
[Finished ⬇️0.42% ⬆️0.03%] test-mac-arm
[Finished ⬇️0.0% ⬆️0.0%] ursa-i9-9960x
[Finished ⬇️0.03% ⬆️0.0%] ursa-thinkcentre-m75q
Buildkite builds:
[Finished] d526fd9d ec2-t3-xlarge-us-east-2
[Finished] d526fd9d test-mac-arm
[Finished] d526fd9d ursa-i9-9960x
[Finished] d526fd9d ursa-thinkcentre-m75q
[Finished] ce0d20c0 ec2-t3-xlarge-us-east-2
[Finished] ce0d20c0 test-mac-arm
[Finished] ce0d20c0 ursa-i9-9960x
[Finished] ce0d20c0 ursa-thinkcentre-m75q
Supported benchmarks:
ec2-t3-xlarge-us-east-2: Supported benchmark langs: Python, R. Runs only benchmarks with cloud = True
test-mac-arm: Supported benchmark langs: C++, Python, R
ursa-i9-9960x: Supported benchmark langs: Python, R, JavaScript
ursa-thinkcentre-m75q: Supported benchmark langs: C++, Java

ArgusLi pushed a commit to Bit-Quill/arrow that referenced this pull request May 15, 2023
apache#34524)
### Rationale for this change
Existing documentation for this argument was misleading.
### What changes are included in this PR?
A change in functionality, matching tests, and updated documentation are included. `json_credentials` can now either be a literal string containing credentials or a string containing a path to credentials. In the latter case, credentials will be automatically read in from the fileystem.
### Are these changes tested?
Yes
### Are there any user-facing changes?
Yes, though not breaking. This affects user-facing APIs and documentation and is both a bug fix and new functionality.
Closesapache#34421Closesapache#33106
* Closes: apache#34421
Authored-by: Bryce Mecum <petridish@gmail.com>
Signed-off-by: Dewey Dunnington <dewey@fishandwhistle.net>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[R] Allow GcsFileSystem$create to accept a path to json_credentials [R] Documentation for json_credentials is misleading

3 participants

@amoeba@ursabot@paleolimbot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

GH-34421: [R] Let GcsFileSystem take a path for json_credentials - #34524

Merged
paleolimbot merged 11 commits into
apache:mainfrom
amoeba:gh-34421-gcs-credentials-path
Mar 22, 2023
Merged

GH-34421: [R] Let GcsFileSystem take a path for json_credentials#34524
paleolimbot merged 11 commits into
apache:mainfrom
amoeba:gh-34421-gcs-credentials-path

Conversation

@amoeba

@amoebaamoeba commented Mar 9, 2023

Copy link
Copy Markdown
Member

Rationale for this change

Existing documentation for this argument was misleading.

What changes are included in this PR?

A change in functionality, matching tests, and updated documentation are included. json_credentials can now either be a literal string containing credentials or a string containing a path to credentials. In the latter case, credentials will be automatically read in from the fileystem.

Are these changes tested?

Yes

Are there any user-facing changes?

Yes, though not breaking. This affects user-facing APIs and documentation and is both a bug fix and new functionality.

Closes#34421
Closes#33106

@github-actions

Copy link
Copy Markdown

@paleolimbotpaleolimbot left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you! Just a note about the encoding you assume and what happens when the file contains more than one line.

Comment threadr/R/filesystem.R Outdated

# Handle reading json_credentials from the filesystem
if ("json_credentials" %in% names(options) && file.exists(options[["json_credentials"]])) {
options[["json_credentials"]] <- paste(readLines(options[["json_credentials"]]), collapse = "")

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I forget the exact details but I think readLines() assumes system encoding (rather than UTF-8, which matters on Windows). Any thought as to which one of those is a better assumption if the value points to a file? (The workaround would be for the user to read in the file themselves first with an explicit encoding).

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, did you want to collapse = "\n"?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I forget the exact details but I think readLines() assumes system encoding (rather than UTF-8, which matters on Windows). Any thought as to which one of those is a better assumption if the value points to a file? (The workaround would be for the user to read in the file themselves first with an explicit encoding).

Thanks for catching this point. You're right about readLines' behavior. To your question, I'm not entirely sure. If I test on my Windows 11 VM, the system-wide encoding is Windows 1252, but JSON files downloaded via Edge produces either ASCII or UTF-8 files. Maybe this just works or maybe just works on newer Win10/11 builds?

Also, did you want to collapse = "\n"?

I suppose that's slightly better, though I think either works just the same. I'll change it.

Comment threadr/tests/testthat/test-gcs.R Outdated
cred_path <- tempfile()
on.exit(unlink(cred_path))

writeLines("fromdisk", cred_path)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe put some non-ASCII text and here? In test-csv there should be an example of how to do this (there are some \u and charToRaw() and writeBin things and I always forget the details).

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done in f3018b0. I didn't go too wild with it.

@github-actionsgithub-actionsBot added awaiting committer review Awaiting committer review and removed awaiting review Awaiting review labels Mar 10, 2023
@amoeba

Copy link
Copy Markdown
MemberAuthor

Thanks for the review @paleolimbot. Let me know what you think about the readLines and encoding thing. Other than that I think this is good to go.

Comment threadr/tests/testthat/test-gcs.R Outdated

# This calls readLines which complains about embedded nuls and missing a
# final newline (See ?readLines)
suppressWarnings({

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Rather than suppress this warning, you could (1) use something other than readLines() or (2) include a final newline in your test data. I'm guessing these are files downloaded from the google cloud console 99% of the time, so including a final newline would probably be sufficient.

(otherwise we might suppress warnings that are actual problems)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good point. I found I had to run the character vector through iconv to get exactly the content into the file (via writeBin). See 617d8b3. Otherwise, you always get a \00 (which R calls an embedded nul) at the end.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

...in case it's helpful: https://github.com/apache/arrow/blob/main/r/tests/testthat/test-csv.R#L318-L328

...and

read_utf8 <- function(file) {
res <- readBin(file, "raw", n = file.info(file)$size)
res <- rawToChar(res)
Encoding(res) <- "UTF-8"
res
}

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for this. I tried a few combinations that still used readLines and couldn't get something I liked that also passes CI. Even after ensuring the the test file has the exact UTF-8 bytes I want, readLines(path, encoding = "UTF-8") seems to still decode as Latin1. I stopped short of using a connection or mutating options. I can't reproduce this on my own Windows VM so testing solutions in CI is slow.

I ended up swapping out readLines for your above read_utf8 helper and previously updated the docs to indicate that the file must be UTF-8 encoded. I'll check CI later tonight/tomorrow.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey @paleolimbot this is ready for a review now that all checks pass.

@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting committer review Awaiting committer review labels Mar 20, 2023
This fixes two issues that using writeBin directly on a character vector has (embedded nul, no final newline)
@github-actionsgithub-actionsBot added awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Mar 20, 2023
@amoeba

Copy link
Copy Markdown
MemberAuthor

CI failure is real failure,

-- Failure ('test-gcs.R:107:3'): GcsFileSystem$create() can read json_credentials --
`object` (`actual`) not equal to `expected` (`expected`).
`actual`: "{\"key\" : \"valué\"}"
`expected`: "{\"key\" : \"valué\"}" Backtrace:
x
1. \-arrow:::expect_equal(fs$options$json_credentials, "{\"key\" : \"valué\"}") at test-gcs.R:107:2
2. \-testthat::expect_equal(...) at D:\a\arrow\arrow\r\check\arrow.Rcheck\tests\testthat\helper-expectation.R:42:4

I'll look into this and ping you again when it's ready for review.

@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting change review Awaiting change review labels Mar 20, 2023
@github-actionsgithub-actionsBot added awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Mar 20, 2023

@paleolimbotpaleolimbot left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for staying with me on the "non-ASCII" rabbit hole!

@github-actionsgithub-actionsBot added awaiting merge Awaiting merge and removed awaiting change review Awaiting change review labels Mar 22, 2023
@amoeba

Copy link
Copy Markdown
MemberAuthor

Glad you caught it, thanks again!

@paleolimbot
paleolimbot merged commit d526fd9 into apache:mainMar 22, 2023
@ursabot

Copy link
Copy Markdown

Benchmark runs are scheduled for baseline = ce0d20c and contender = d526fd9. d526fd9 is a master commit associated with this PR. Results will be available as each benchmark for each run completes.
Conbench compare runs links:
[Finished ⬇️0.0% ⬆️0.0%] ec2-t3-xlarge-us-east-2
[Finished ⬇️0.42% ⬆️0.03%] test-mac-arm
[Finished ⬇️0.0% ⬆️0.0%] ursa-i9-9960x
[Finished ⬇️0.03% ⬆️0.0%] ursa-thinkcentre-m75q
Buildkite builds:
[Finished] d526fd9d ec2-t3-xlarge-us-east-2
[Finished] d526fd9d test-mac-arm
[Finished] d526fd9d ursa-i9-9960x
[Finished] d526fd9d ursa-thinkcentre-m75q
[Finished] ce0d20c0 ec2-t3-xlarge-us-east-2
[Finished] ce0d20c0 test-mac-arm
[Finished] ce0d20c0 ursa-i9-9960x
[Finished] ce0d20c0 ursa-thinkcentre-m75q
Supported benchmarks:
ec2-t3-xlarge-us-east-2: Supported benchmark langs: Python, R. Runs only benchmarks with cloud = True
test-mac-arm: Supported benchmark langs: C++, Python, R
ursa-i9-9960x: Supported benchmark langs: Python, R, JavaScript
ursa-thinkcentre-m75q: Supported benchmark langs: C++, Java

ArgusLi pushed a commit to Bit-Quill/arrow that referenced this pull request May 15, 2023
apache#34524)
### Rationale for this change
Existing documentation for this argument was misleading.
### What changes are included in this PR?
A change in functionality, matching tests, and updated documentation are included. `json_credentials` can now either be a literal string containing credentials or a string containing a path to credentials. In the latter case, credentials will be automatically read in from the fileystem.
### Are these changes tested?
Yes
### Are there any user-facing changes?
Yes, though not breaking. This affects user-facing APIs and documentation and is both a bug fix and new functionality.
Closesapache#34421Closesapache#33106
* Closes: apache#34421
Authored-by: Bryce Mecum <petridish@gmail.com>
Signed-off-by: Dewey Dunnington <dewey@fishandwhistle.net>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[R] Allow GcsFileSystem$create to accept a path to json_credentials [R] Documentation for json_credentials is misleading

3 participants

@amoeba@ursabot@paleolimbot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

GH-34421: [R] Let GcsFileSystem take a path for json_credentials - #34524

Merged
paleolimbot merged 11 commits into
apache:mainfrom
amoeba:gh-34421-gcs-credentials-path
Mar 22, 2023
Merged

GH-34421: [R] Let GcsFileSystem take a path for json_credentials#34524
paleolimbot merged 11 commits into
apache:mainfrom
amoeba:gh-34421-gcs-credentials-path

Conversation

@amoeba

@amoebaamoeba commented Mar 9, 2023

Copy link
Copy Markdown
Member

Rationale for this change

Existing documentation for this argument was misleading.

What changes are included in this PR?

A change in functionality, matching tests, and updated documentation are included. json_credentials can now either be a literal string containing credentials or a string containing a path to credentials. In the latter case, credentials will be automatically read in from the fileystem.

Are these changes tested?

Yes

Are there any user-facing changes?

Yes, though not breaking. This affects user-facing APIs and documentation and is both a bug fix and new functionality.

Closes#34421
Closes#33106

@github-actions

Copy link
Copy Markdown

@paleolimbotpaleolimbot left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you! Just a note about the encoding you assume and what happens when the file contains more than one line.

Comment threadr/R/filesystem.R Outdated

# Handle reading json_credentials from the filesystem
if ("json_credentials" %in% names(options) && file.exists(options[["json_credentials"]])) {
options[["json_credentials"]] <- paste(readLines(options[["json_credentials"]]), collapse = "")

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I forget the exact details but I think readLines() assumes system encoding (rather than UTF-8, which matters on Windows). Any thought as to which one of those is a better assumption if the value points to a file? (The workaround would be for the user to read in the file themselves first with an explicit encoding).

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, did you want to collapse = "\n"?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I forget the exact details but I think readLines() assumes system encoding (rather than UTF-8, which matters on Windows). Any thought as to which one of those is a better assumption if the value points to a file? (The workaround would be for the user to read in the file themselves first with an explicit encoding).

Thanks for catching this point. You're right about readLines' behavior. To your question, I'm not entirely sure. If I test on my Windows 11 VM, the system-wide encoding is Windows 1252, but JSON files downloaded via Edge produces either ASCII or UTF-8 files. Maybe this just works or maybe just works on newer Win10/11 builds?

Also, did you want to collapse = "\n"?

I suppose that's slightly better, though I think either works just the same. I'll change it.

Comment threadr/tests/testthat/test-gcs.R Outdated
cred_path <- tempfile()
on.exit(unlink(cred_path))

writeLines("fromdisk", cred_path)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe put some non-ASCII text and here? In test-csv there should be an example of how to do this (there are some \u and charToRaw() and writeBin things and I always forget the details).

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done in f3018b0. I didn't go too wild with it.

@github-actionsgithub-actionsBot added awaiting committer review Awaiting committer review and removed awaiting review Awaiting review labels Mar 10, 2023
@amoeba

Copy link
Copy Markdown
MemberAuthor

Thanks for the review @paleolimbot. Let me know what you think about the readLines and encoding thing. Other than that I think this is good to go.

Comment threadr/tests/testthat/test-gcs.R Outdated

# This calls readLines which complains about embedded nuls and missing a
# final newline (See ?readLines)
suppressWarnings({

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Rather than suppress this warning, you could (1) use something other than readLines() or (2) include a final newline in your test data. I'm guessing these are files downloaded from the google cloud console 99% of the time, so including a final newline would probably be sufficient.

(otherwise we might suppress warnings that are actual problems)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good point. I found I had to run the character vector through iconv to get exactly the content into the file (via writeBin). See 617d8b3. Otherwise, you always get a \00 (which R calls an embedded nul) at the end.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

...in case it's helpful: https://github.com/apache/arrow/blob/main/r/tests/testthat/test-csv.R#L318-L328

...and

read_utf8 <- function(file) {
res <- readBin(file, "raw", n = file.info(file)$size)
res <- rawToChar(res)
Encoding(res) <- "UTF-8"
res
}

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for this. I tried a few combinations that still used readLines and couldn't get something I liked that also passes CI. Even after ensuring the the test file has the exact UTF-8 bytes I want, readLines(path, encoding = "UTF-8") seems to still decode as Latin1. I stopped short of using a connection or mutating options. I can't reproduce this on my own Windows VM so testing solutions in CI is slow.

I ended up swapping out readLines for your above read_utf8 helper and previously updated the docs to indicate that the file must be UTF-8 encoded. I'll check CI later tonight/tomorrow.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey @paleolimbot this is ready for a review now that all checks pass.

@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting committer review Awaiting committer review labels Mar 20, 2023
This fixes two issues that using writeBin directly on a character vector has (embedded nul, no final newline)
@github-actionsgithub-actionsBot added awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Mar 20, 2023
@amoeba

Copy link
Copy Markdown
MemberAuthor

CI failure is real failure,

-- Failure ('test-gcs.R:107:3'): GcsFileSystem$create() can read json_credentials --
`object` (`actual`) not equal to `expected` (`expected`).
`actual`: "{\"key\" : \"valué\"}"
`expected`: "{\"key\" : \"valué\"}" Backtrace:
x
1. \-arrow:::expect_equal(fs$options$json_credentials, "{\"key\" : \"valué\"}") at test-gcs.R:107:2
2. \-testthat::expect_equal(...) at D:\a\arrow\arrow\r\check\arrow.Rcheck\tests\testthat\helper-expectation.R:42:4

I'll look into this and ping you again when it's ready for review.

@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting change review Awaiting change review labels Mar 20, 2023
@github-actionsgithub-actionsBot added awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Mar 20, 2023

@paleolimbotpaleolimbot left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for staying with me on the "non-ASCII" rabbit hole!

@github-actionsgithub-actionsBot added awaiting merge Awaiting merge and removed awaiting change review Awaiting change review labels Mar 22, 2023
@amoeba

Copy link
Copy Markdown
MemberAuthor

Glad you caught it, thanks again!

@paleolimbot
paleolimbot merged commit d526fd9 into apache:mainMar 22, 2023
@ursabot

Copy link
Copy Markdown

Benchmark runs are scheduled for baseline = ce0d20c and contender = d526fd9. d526fd9 is a master commit associated with this PR. Results will be available as each benchmark for each run completes.
Conbench compare runs links:
[Finished ⬇️0.0% ⬆️0.0%] ec2-t3-xlarge-us-east-2
[Finished ⬇️0.42% ⬆️0.03%] test-mac-arm
[Finished ⬇️0.0% ⬆️0.0%] ursa-i9-9960x
[Finished ⬇️0.03% ⬆️0.0%] ursa-thinkcentre-m75q
Buildkite builds:
[Finished] d526fd9d ec2-t3-xlarge-us-east-2
[Finished] d526fd9d test-mac-arm
[Finished] d526fd9d ursa-i9-9960x
[Finished] d526fd9d ursa-thinkcentre-m75q
[Finished] ce0d20c0 ec2-t3-xlarge-us-east-2
[Finished] ce0d20c0 test-mac-arm
[Finished] ce0d20c0 ursa-i9-9960x
[Finished] ce0d20c0 ursa-thinkcentre-m75q
Supported benchmarks:
ec2-t3-xlarge-us-east-2: Supported benchmark langs: Python, R. Runs only benchmarks with cloud = True
test-mac-arm: Supported benchmark langs: C++, Python, R
ursa-i9-9960x: Supported benchmark langs: Python, R, JavaScript
ursa-thinkcentre-m75q: Supported benchmark langs: C++, Java

ArgusLi pushed a commit to Bit-Quill/arrow that referenced this pull request May 15, 2023
apache#34524)
### Rationale for this change
Existing documentation for this argument was misleading.
### What changes are included in this PR?
A change in functionality, matching tests, and updated documentation are included. `json_credentials` can now either be a literal string containing credentials or a string containing a path to credentials. In the latter case, credentials will be automatically read in from the fileystem.
### Are these changes tested?
Yes
### Are there any user-facing changes?
Yes, though not breaking. This affects user-facing APIs and documentation and is both a bug fix and new functionality.
Closesapache#34421Closesapache#33106
* Closes: apache#34421
Authored-by: Bryce Mecum <petridish@gmail.com>
Signed-off-by: Dewey Dunnington <dewey@fishandwhistle.net>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[R] Allow GcsFileSystem$create to accept a path to json_credentials [R] Documentation for json_credentials is misleading

3 participants

@amoeba@ursabot@paleolimbot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

GH-34421: [R] Let GcsFileSystem take a path for json_credentials - #34524

Merged
paleolimbot merged 11 commits into
apache:mainfrom
amoeba:gh-34421-gcs-credentials-path
Mar 22, 2023
Merged

GH-34421: [R] Let GcsFileSystem take a path for json_credentials#34524
paleolimbot merged 11 commits into
apache:mainfrom
amoeba:gh-34421-gcs-credentials-path

Conversation

@amoeba

@amoebaamoeba commented Mar 9, 2023

Copy link
Copy Markdown
Member

Rationale for this change

Existing documentation for this argument was misleading.

What changes are included in this PR?

A change in functionality, matching tests, and updated documentation are included. json_credentials can now either be a literal string containing credentials or a string containing a path to credentials. In the latter case, credentials will be automatically read in from the fileystem.

Are these changes tested?

Yes

Are there any user-facing changes?

Yes, though not breaking. This affects user-facing APIs and documentation and is both a bug fix and new functionality.

Closes#34421
Closes#33106

@github-actions

Copy link
Copy Markdown

@paleolimbotpaleolimbot left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you! Just a note about the encoding you assume and what happens when the file contains more than one line.

Comment threadr/R/filesystem.R Outdated

# Handle reading json_credentials from the filesystem
if ("json_credentials" %in% names(options) && file.exists(options[["json_credentials"]])) {
options[["json_credentials"]] <- paste(readLines(options[["json_credentials"]]), collapse = "")

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I forget the exact details but I think readLines() assumes system encoding (rather than UTF-8, which matters on Windows). Any thought as to which one of those is a better assumption if the value points to a file? (The workaround would be for the user to read in the file themselves first with an explicit encoding).

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, did you want to collapse = "\n"?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I forget the exact details but I think readLines() assumes system encoding (rather than UTF-8, which matters on Windows). Any thought as to which one of those is a better assumption if the value points to a file? (The workaround would be for the user to read in the file themselves first with an explicit encoding).

Thanks for catching this point. You're right about readLines' behavior. To your question, I'm not entirely sure. If I test on my Windows 11 VM, the system-wide encoding is Windows 1252, but JSON files downloaded via Edge produces either ASCII or UTF-8 files. Maybe this just works or maybe just works on newer Win10/11 builds?

Also, did you want to collapse = "\n"?

I suppose that's slightly better, though I think either works just the same. I'll change it.

Comment threadr/tests/testthat/test-gcs.R Outdated
cred_path <- tempfile()
on.exit(unlink(cred_path))

writeLines("fromdisk", cred_path)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe put some non-ASCII text and here? In test-csv there should be an example of how to do this (there are some \u and charToRaw() and writeBin things and I always forget the details).

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done in f3018b0. I didn't go too wild with it.

@github-actionsgithub-actionsBot added awaiting committer review Awaiting committer review and removed awaiting review Awaiting review labels Mar 10, 2023
@amoeba

Copy link
Copy Markdown
MemberAuthor

Thanks for the review @paleolimbot. Let me know what you think about the readLines and encoding thing. Other than that I think this is good to go.

Comment threadr/tests/testthat/test-gcs.R Outdated

# This calls readLines which complains about embedded nuls and missing a
# final newline (See ?readLines)
suppressWarnings({

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Rather than suppress this warning, you could (1) use something other than readLines() or (2) include a final newline in your test data. I'm guessing these are files downloaded from the google cloud console 99% of the time, so including a final newline would probably be sufficient.

(otherwise we might suppress warnings that are actual problems)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good point. I found I had to run the character vector through iconv to get exactly the content into the file (via writeBin). See 617d8b3. Otherwise, you always get a \00 (which R calls an embedded nul) at the end.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

...in case it's helpful: https://github.com/apache/arrow/blob/main/r/tests/testthat/test-csv.R#L318-L328

...and

read_utf8 <- function(file) {
res <- readBin(file, "raw", n = file.info(file)$size)
res <- rawToChar(res)
Encoding(res) <- "UTF-8"
res
}

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for this. I tried a few combinations that still used readLines and couldn't get something I liked that also passes CI. Even after ensuring the the test file has the exact UTF-8 bytes I want, readLines(path, encoding = "UTF-8") seems to still decode as Latin1. I stopped short of using a connection or mutating options. I can't reproduce this on my own Windows VM so testing solutions in CI is slow.

I ended up swapping out readLines for your above read_utf8 helper and previously updated the docs to indicate that the file must be UTF-8 encoded. I'll check CI later tonight/tomorrow.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey @paleolimbot this is ready for a review now that all checks pass.

@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting committer review Awaiting committer review labels Mar 20, 2023
This fixes two issues that using writeBin directly on a character vector has (embedded nul, no final newline)
@github-actionsgithub-actionsBot added awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Mar 20, 2023
@amoeba

Copy link
Copy Markdown
MemberAuthor

CI failure is real failure,

-- Failure ('test-gcs.R:107:3'): GcsFileSystem$create() can read json_credentials --
`object` (`actual`) not equal to `expected` (`expected`).
`actual`: "{\"key\" : \"valué\"}"
`expected`: "{\"key\" : \"valué\"}" Backtrace:
x
1. \-arrow:::expect_equal(fs$options$json_credentials, "{\"key\" : \"valué\"}") at test-gcs.R:107:2
2. \-testthat::expect_equal(...) at D:\a\arrow\arrow\r\check\arrow.Rcheck\tests\testthat\helper-expectation.R:42:4

I'll look into this and ping you again when it's ready for review.

@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting change review Awaiting change review labels Mar 20, 2023
@github-actionsgithub-actionsBot added awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Mar 20, 2023

@paleolimbotpaleolimbot left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for staying with me on the "non-ASCII" rabbit hole!

@github-actionsgithub-actionsBot added awaiting merge Awaiting merge and removed awaiting change review Awaiting change review labels Mar 22, 2023
@amoeba

Copy link
Copy Markdown
MemberAuthor

Glad you caught it, thanks again!

@paleolimbot
paleolimbot merged commit d526fd9 into apache:mainMar 22, 2023
@ursabot

Copy link
Copy Markdown

Benchmark runs are scheduled for baseline = ce0d20c and contender = d526fd9. d526fd9 is a master commit associated with this PR. Results will be available as each benchmark for each run completes.
Conbench compare runs links:
[Finished ⬇️0.0% ⬆️0.0%] ec2-t3-xlarge-us-east-2
[Finished ⬇️0.42% ⬆️0.03%] test-mac-arm
[Finished ⬇️0.0% ⬆️0.0%] ursa-i9-9960x
[Finished ⬇️0.03% ⬆️0.0%] ursa-thinkcentre-m75q
Buildkite builds:
[Finished] d526fd9d ec2-t3-xlarge-us-east-2
[Finished] d526fd9d test-mac-arm
[Finished] d526fd9d ursa-i9-9960x
[Finished] d526fd9d ursa-thinkcentre-m75q
[Finished] ce0d20c0 ec2-t3-xlarge-us-east-2
[Finished] ce0d20c0 test-mac-arm
[Finished] ce0d20c0 ursa-i9-9960x
[Finished] ce0d20c0 ursa-thinkcentre-m75q
Supported benchmarks:
ec2-t3-xlarge-us-east-2: Supported benchmark langs: Python, R. Runs only benchmarks with cloud = True
test-mac-arm: Supported benchmark langs: C++, Python, R
ursa-i9-9960x: Supported benchmark langs: Python, R, JavaScript
ursa-thinkcentre-m75q: Supported benchmark langs: C++, Java

ArgusLi pushed a commit to Bit-Quill/arrow that referenced this pull request May 15, 2023
apache#34524)
### Rationale for this change
Existing documentation for this argument was misleading.
### What changes are included in this PR?
A change in functionality, matching tests, and updated documentation are included. `json_credentials` can now either be a literal string containing credentials or a string containing a path to credentials. In the latter case, credentials will be automatically read in from the fileystem.
### Are these changes tested?
Yes
### Are there any user-facing changes?
Yes, though not breaking. This affects user-facing APIs and documentation and is both a bug fix and new functionality.
Closesapache#34421Closesapache#33106
* Closes: apache#34421
Authored-by: Bryce Mecum <petridish@gmail.com>
Signed-off-by: Dewey Dunnington <dewey@fishandwhistle.net>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[R] Allow GcsFileSystem$create to accept a path to json_credentials [R] Documentation for json_credentials is misleading

3 participants

@amoeba@ursabot@paleolimbot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

GH-34421: [R] Let GcsFileSystem take a path for json_credentials - #34524

Merged
paleolimbot merged 11 commits into
apache:mainfrom
amoeba:gh-34421-gcs-credentials-path
Mar 22, 2023
Merged

GH-34421: [R] Let GcsFileSystem take a path for json_credentials#34524
paleolimbot merged 11 commits into
apache:mainfrom
amoeba:gh-34421-gcs-credentials-path

Conversation

@amoeba

@amoebaamoeba commented Mar 9, 2023

Copy link
Copy Markdown
Member

Rationale for this change

Existing documentation for this argument was misleading.

What changes are included in this PR?

A change in functionality, matching tests, and updated documentation are included. json_credentials can now either be a literal string containing credentials or a string containing a path to credentials. In the latter case, credentials will be automatically read in from the fileystem.

Are these changes tested?

Yes

Are there any user-facing changes?

Yes, though not breaking. This affects user-facing APIs and documentation and is both a bug fix and new functionality.

Closes#34421
Closes#33106

@github-actions

Copy link
Copy Markdown

@paleolimbotpaleolimbot left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you! Just a note about the encoding you assume and what happens when the file contains more than one line.

Comment threadr/R/filesystem.R Outdated

# Handle reading json_credentials from the filesystem
if ("json_credentials" %in% names(options) && file.exists(options[["json_credentials"]])) {
options[["json_credentials"]] <- paste(readLines(options[["json_credentials"]]), collapse = "")

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I forget the exact details but I think readLines() assumes system encoding (rather than UTF-8, which matters on Windows). Any thought as to which one of those is a better assumption if the value points to a file? (The workaround would be for the user to read in the file themselves first with an explicit encoding).

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, did you want to collapse = "\n"?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I forget the exact details but I think readLines() assumes system encoding (rather than UTF-8, which matters on Windows). Any thought as to which one of those is a better assumption if the value points to a file? (The workaround would be for the user to read in the file themselves first with an explicit encoding).

Thanks for catching this point. You're right about readLines' behavior. To your question, I'm not entirely sure. If I test on my Windows 11 VM, the system-wide encoding is Windows 1252, but JSON files downloaded via Edge produces either ASCII or UTF-8 files. Maybe this just works or maybe just works on newer Win10/11 builds?

Also, did you want to collapse = "\n"?

I suppose that's slightly better, though I think either works just the same. I'll change it.

Comment threadr/tests/testthat/test-gcs.R Outdated
cred_path <- tempfile()
on.exit(unlink(cred_path))

writeLines("fromdisk", cred_path)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe put some non-ASCII text and here? In test-csv there should be an example of how to do this (there are some \u and charToRaw() and writeBin things and I always forget the details).

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done in f3018b0. I didn't go too wild with it.

@github-actionsgithub-actionsBot added awaiting committer review Awaiting committer review and removed awaiting review Awaiting review labels Mar 10, 2023
@amoeba

Copy link
Copy Markdown
MemberAuthor

Thanks for the review @paleolimbot. Let me know what you think about the readLines and encoding thing. Other than that I think this is good to go.

Comment threadr/tests/testthat/test-gcs.R Outdated

# This calls readLines which complains about embedded nuls and missing a
# final newline (See ?readLines)
suppressWarnings({

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Rather than suppress this warning, you could (1) use something other than readLines() or (2) include a final newline in your test data. I'm guessing these are files downloaded from the google cloud console 99% of the time, so including a final newline would probably be sufficient.

(otherwise we might suppress warnings that are actual problems)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good point. I found I had to run the character vector through iconv to get exactly the content into the file (via writeBin). See 617d8b3. Otherwise, you always get a \00 (which R calls an embedded nul) at the end.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

...in case it's helpful: https://github.com/apache/arrow/blob/main/r/tests/testthat/test-csv.R#L318-L328

...and

read_utf8 <- function(file) {
res <- readBin(file, "raw", n = file.info(file)$size)
res <- rawToChar(res)
Encoding(res) <- "UTF-8"
res
}

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for this. I tried a few combinations that still used readLines and couldn't get something I liked that also passes CI. Even after ensuring the the test file has the exact UTF-8 bytes I want, readLines(path, encoding = "UTF-8") seems to still decode as Latin1. I stopped short of using a connection or mutating options. I can't reproduce this on my own Windows VM so testing solutions in CI is slow.

I ended up swapping out readLines for your above read_utf8 helper and previously updated the docs to indicate that the file must be UTF-8 encoded. I'll check CI later tonight/tomorrow.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey @paleolimbot this is ready for a review now that all checks pass.

@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting committer review Awaiting committer review labels Mar 20, 2023
This fixes two issues that using writeBin directly on a character vector has (embedded nul, no final newline)
@github-actionsgithub-actionsBot added awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Mar 20, 2023
@amoeba

Copy link
Copy Markdown
MemberAuthor

CI failure is real failure,

-- Failure ('test-gcs.R:107:3'): GcsFileSystem$create() can read json_credentials --
`object` (`actual`) not equal to `expected` (`expected`).
`actual`: "{\"key\" : \"valué\"}"
`expected`: "{\"key\" : \"valué\"}" Backtrace:
x
1. \-arrow:::expect_equal(fs$options$json_credentials, "{\"key\" : \"valué\"}") at test-gcs.R:107:2
2. \-testthat::expect_equal(...) at D:\a\arrow\arrow\r\check\arrow.Rcheck\tests\testthat\helper-expectation.R:42:4

I'll look into this and ping you again when it's ready for review.

@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting change review Awaiting change review labels Mar 20, 2023
@github-actionsgithub-actionsBot added awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Mar 20, 2023

@paleolimbotpaleolimbot left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for staying with me on the "non-ASCII" rabbit hole!

@github-actionsgithub-actionsBot added awaiting merge Awaiting merge and removed awaiting change review Awaiting change review labels Mar 22, 2023
@amoeba

Copy link
Copy Markdown
MemberAuthor

Glad you caught it, thanks again!

@paleolimbot
paleolimbot merged commit d526fd9 into apache:mainMar 22, 2023
@ursabot

Copy link
Copy Markdown

Benchmark runs are scheduled for baseline = ce0d20c and contender = d526fd9. d526fd9 is a master commit associated with this PR. Results will be available as each benchmark for each run completes.
Conbench compare runs links:
[Finished ⬇️0.0% ⬆️0.0%] ec2-t3-xlarge-us-east-2
[Finished ⬇️0.42% ⬆️0.03%] test-mac-arm
[Finished ⬇️0.0% ⬆️0.0%] ursa-i9-9960x
[Finished ⬇️0.03% ⬆️0.0%] ursa-thinkcentre-m75q
Buildkite builds:
[Finished] d526fd9d ec2-t3-xlarge-us-east-2
[Finished] d526fd9d test-mac-arm
[Finished] d526fd9d ursa-i9-9960x
[Finished] d526fd9d ursa-thinkcentre-m75q
[Finished] ce0d20c0 ec2-t3-xlarge-us-east-2
[Finished] ce0d20c0 test-mac-arm
[Finished] ce0d20c0 ursa-i9-9960x
[Finished] ce0d20c0 ursa-thinkcentre-m75q
Supported benchmarks:
ec2-t3-xlarge-us-east-2: Supported benchmark langs: Python, R. Runs only benchmarks with cloud = True
test-mac-arm: Supported benchmark langs: C++, Python, R
ursa-i9-9960x: Supported benchmark langs: Python, R, JavaScript
ursa-thinkcentre-m75q: Supported benchmark langs: C++, Java

ArgusLi pushed a commit to Bit-Quill/arrow that referenced this pull request May 15, 2023
apache#34524)
### Rationale for this change
Existing documentation for this argument was misleading.
### What changes are included in this PR?
A change in functionality, matching tests, and updated documentation are included. `json_credentials` can now either be a literal string containing credentials or a string containing a path to credentials. In the latter case, credentials will be automatically read in from the fileystem.
### Are these changes tested?
Yes
### Are there any user-facing changes?
Yes, though not breaking. This affects user-facing APIs and documentation and is both a bug fix and new functionality.
Closesapache#34421Closesapache#33106
* Closes: apache#34421
Authored-by: Bryce Mecum <petridish@gmail.com>
Signed-off-by: Dewey Dunnington <dewey@fishandwhistle.net>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[R] Allow GcsFileSystem$create to accept a path to json_credentials [R] Documentation for json_credentials is misleading

3 participants

@amoeba@ursabot@paleolimbot