diff --git a/stdlib-candidate/path/mod.nu b/stdlib-candidate/path/mod.nu deleted file mode 100644 index abcc9d6..0000000 --- a/stdlib-candidate/path/mod.nu +++ /dev/null @@ -1,30 +0,0 @@ -# Replace extension of input file paths. -# -# Note that it doesn't change the file name locally. -# -# # Example -# - setting path ext to `rs` -# ```nushell -# > "ab.txt" | path replace-extension "rs" -# ab.rs -# > "ab.txt" | path replace-extension ".rs" -# ab.rs -# -# - setting a list of input path ext to `rs` -# > ["ab.txt", "cd.exe"] | path replace-extension "rs" -# ╭───┬──────────╮ -# │ 0 │ ab.rs │ -# │ 1 │ cd.rs │ -# ╰───┴──────────╯ -# ``` -export def replace-extension [ - ext: string -] { - let path_parsed = $in | path parse - if ($ext | str starts-with ".") { - $path_parsed | update extension ($ext | str substring 1..) | path join - } else { - $path_parsed | update extension $ext | path join - } -} - diff --git a/stdlib-candidate/std-rfc/path/mod.nu b/stdlib-candidate/std-rfc/path/mod.nu new file mode 100644 index 0000000..f3c1e69 --- /dev/null +++ b/stdlib-candidate/std-rfc/path/mod.nu @@ -0,0 +1,71 @@ +# Helper function for `path with` commands +def with-field [field: string, value: string] { + path parse + | update $field $value + | path join +} + +# Replace extension of input file paths. +# +# Note that it doesn't change the file name locally. +# +# # Example +# - setting path ext to `rs` +# ```nushell +# > "ab.txt" | path with-extension "rs" +# ab.rs +# > "ab.txt" | path with-extension ".rs" +# ab.rs +# +# - setting a list of input path ext to `rs` +# > ["ab.txt", "cd.exe"] | path with-extension "rs" +# ╭───┬──────────╮ +# │ 0 │ ab.rs │ +# │ 1 │ cd.rs │ +# ╰───┴──────────╯ +# ``` +export def with-extension [ext: string] { + let path = $in + let ext_trim = if $ext starts-with "." { + $ext | str substring 1.. + } else { + $ext + } + $path | with-field extension $ext_trim +} + +# Replace stem of input file paths. +# +# Note that it doesn't change the file name locally. +# +# # Example +# - replace stem with "share" +# ```nushell +# > "/usr/bin" | path with-stem "share" +# /usr/share +# +# - replace stem with "nushell" +# > ["/home/alice/", "/home/bob/secret.txt"] | path with-stem "nushell" +# ╭───┬───────────────────────╮ +# │ 0 │ /home/nushell │ +# │ 1 │ /home/bob/nushell.txt │ +# ╰───┴───────────────────────╯ +# ``` +export def with-stem [stem: string] { with-field stem $stem } + +# Replace parent field of input file paths. +# +# # Example +# - replace parent path with `/usr/share` +# ```nushell +# > "/etc/foobar" | path with-parent "/usr/share/" +# /usr/share/foobar +# +# - replace parent path with `/root/` for all filenames in list +# > ["/home/rose/meow", "/home/fdncred/"] | path with-parent "/root/" +# ╭───┬────────────╮ +# │ 0 │ /root/meow │ +# │ 1 │ /root/spam │ +# ╰───┴────────────╯ +# ``` +export def with-parent [parent: string] { with-field parent $parent } diff --git a/stdlib-candidate/tests/path.nu b/stdlib-candidate/tests/path.nu index 7cda760..6e894c8 100644 --- a/stdlib-candidate/tests/path.nu +++ b/stdlib-candidate/tests/path.nu @@ -1,21 +1,39 @@ -use path +use std-rfc/path use std/assert #[test] -def path_replace_extension [] { - let new_path = "ab.txt" | path replace-extension "rs" +def path_with_extension [] { + let new_path = "ab.txt" | path with-extension "rs" assert equal $new_path "ab.rs" - let new_path = "ab.txt" | path replace-extension ".rs" + let new_path = "ab.txt" | path with-extension ".rs" assert equal $new_path "ab.rs" } #[test] -def path_replace_extension_for_list [] { - let new_path = ["ab.txt", "cd.exe"] | path replace-extension "rs" +def path_with_extension_for_list [] { + let new_path = ["ab.txt", "cd.exe"] | path with-extension "rs" assert equal $new_path ["ab.rs", "cd.rs"] - let new_path = ["ab.txt", "cd.exe"] | path replace-extension ".rs" + let new_path = ["ab.txt", "cd.exe"] | path with-extension ".rs" assert equal $new_path ["ab.rs", "cd.rs"] } + +#[test] +def path_with_stem [] { + let new_path = "/usr/bin" | path with-stem "share" + assert equal $new_path "/usr/share" + + let new_path = ["/home/alice/", "/home/bob/secret.txt"] | path with-stem "nushell" + assert equal $new_path ["/home/nushell", "/home/bob/nushell.txt"] +} + +#[test] +def path_with_parent [] { + let new_path = "/etc/foobar" | path with-parent "/usr/share/" + assert equal $new_path "/usr/share/foobar" + + let new_path = ["/home/rose/meow", "/home/fdncred/"] | path with-parent "/root/" + assert equal $new_path ["/root/meow", "/root/fdncred"] +}