Skip to content

Conversation

librill
Copy link

@librill librill commented Dec 10, 2024

Added 4 functions for common programming use. Closes #573 .

All functions call an existing str_to_*() so locale argument respects the behavior of those functions

Aliases StrToPascal() and strToCamel() exist (str-to-kebab() is not a valid name)

@librill
Copy link
Author

librill commented Dec 10, 2024

CC: @kbodwin

@hadley
Copy link
Member

hadley commented Sep 5, 2025

Sorry for missing this. Are you still interested in finishing it off? No problems if not, as I'm happy to do it myself.

@kbodwin
Copy link

kbodwin commented Sep 5, 2025

We're happy to make changes if needed! But I'm not sure I see what's missing - do you see something more you'd want for this to be ready for review?

@@ -12,11 +12,13 @@ S3method(type,stringr_fixed)
S3method(type,stringr_regex)
export("%>%")
export("str_sub<-")
export(StrToPascal)
Copy link
Member

Choose a reason for hiding this comment

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

Now that I see them, I don't think it's worth having the camel case variants; it feels a bit too clever.

#'
#' * `str_to_upper()` converts to upper case.
#' * `str_to_lower()` converts to lower case.
#' * `str_to_title()` converts to title case, where only the first letter of
#' each word is capitalized.
#' * `str_to_sentence()` convert to sentence case, where only the first letter
#' of sentence is capitalized.
#' * `str_to_pascal()` converts to pascal case, where only the first letter of
Copy link
Member

Choose a reason for hiding this comment

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

I'm not sure Pascal case is particularly well known (at least I didn't recognise it) so how about it make it an argument to str_camel_case(), e.g. first_upper = TRUE?

stopifnot(is.character(string))
string <- string |>
str_replace_all("([a-z])([A-Z])", "\\1 \\2") |>
str_replace_all("([a-zA-Z])([0-9])", "\\1 \\2") |>
Copy link
Member

Choose a reason for hiding this comment

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

I think it would make sense to extract out this code for "break into words" into a separate function since it's reasonably complex and giving it a name would be useful.

strToCamel <- str_to_camel
#' @export
#' @rdname case
str_to_snake <- function(string, separator = "_", locale = "en") {
Copy link
Member

Choose a reason for hiding this comment

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

You could eliminate the separator argument by creating an internal function that both snake and kebab case uses.

@@ -1,21 +1,41 @@
#' Convert string to upper case, lower case, title case, or sentence case
#' Convert string to upper case, lower case, title case, sentence case, pascal
Copy link
Member

Choose a reason for hiding this comment

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

Maybe it would be better to document these new functions in a new documentation topic? Yes, they're are changing case, but you're more likely to be apply them to function names, not regular sentences.

expect_identical(str_to_sentence("a Test"), "A test")
})

test_that("to_pascal converts to pascal case", {
expect_identical(str_to_pascal("This is a sentence."), "ThisIsASentence")
Copy link
Member

Choose a reason for hiding this comment

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

I'd suggest testing cases the exercise each of the different regular expressions. I think that will be easier once you extract out a common "break into words" function.

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

Successfully merging this pull request may close these issues.

Could a str_to_snake function be made to convert strings to snake-case?
3 participants