From bb8949f2b27666cf77a8b7b4412b162fed61c49e Mon Sep 17 00:00:00 2001 From: Antoine Stevan <44101798+amtoine@users.noreply.github.com> Date: Fri, 17 Mar 2023 18:30:35 +0100 Subject: [PATCH] REFACTOR: put all the standard library in `std.nu` (#8489) > **Warning** > this PR is the result of a demand from the core team, to have the simplest structure for the standard library, at least for now :+1: # Description this PR mainly - moved the `dirs.nu` module to the end of `std.nu` - fixed the imports in `test_dirs.nu` # User-Facing Changes ``` $nothing ``` # Tests + Formatting with the new runner from #8443, we get as expected :ok_hand: ``` >_ nu crates/nu-utils/standard_library/tests.nu INFO Run tests in test_dirs DEBUG Run test test_dirs/test_dirs_command INFO Run tests in test_std DEBUG Run test test_std/test_assert DEBUG Run test test_std/test_match DEBUG Run test test_std/test_path_add ``` # After Submitting ``` $nothing ``` --- crates/nu-utils/standard_library/dirs.nu | 83 --------------- crates/nu-utils/standard_library/std.nu | 100 +++++++++++++++--- crates/nu-utils/standard_library/test_dirs.nu | 8 +- 3 files changed, 90 insertions(+), 101 deletions(-) delete mode 100644 crates/nu-utils/standard_library/dirs.nu diff --git a/crates/nu-utils/standard_library/dirs.nu b/crates/nu-utils/standard_library/dirs.nu deleted file mode 100644 index 17681032e5..0000000000 --- a/crates/nu-utils/standard_library/dirs.nu +++ /dev/null @@ -1,83 +0,0 @@ -# Maintain a list of working directories and navigates them - -# the directory stack -export-env { - let-env DIRS_POSITION = 0 - let-env DIRS_LIST = [($env.PWD | path expand)] -} - -# Add one or more directories to the list. -# PWD becomes first of the newly added directories. -export def-env "add" [ - ...paths: string # directory or directories to add to working list - ] { - mut abspaths = [] - for p in $paths { - let exp = ($p | path expand) - if ($exp | path type) != 'dir' { - let span = (metadata $p).span - error make {msg: "not a directory", label: {text: "not a directory", start: $span.start, end: $span.end } } - } - $abspaths = ($abspaths | append $exp) - - } - let-env DIRS_LIST = ($env.DIRS_LIST | insert ($env.DIRS_POSITION + 1) $abspaths | flatten) - let-env DIRS_POSITION = $env.DIRS_POSITION + 1 - - _fetch 0 -} - -# Advance to the next directory in the list or wrap to beginning. -export def-env "next" [ - N:int = 1 # number of positions to move. -] { - _fetch $N -} - -# Back up to the previous directory or wrap to the end. -export def-env "prev" [ - N:int = 1 # number of positions to move. -] { - _fetch (-1 * $N) -} - -# Drop the current directory from the list, if it's not the only one. -# PWD becomes the next working directory -export def-env "drop" [] { - if ($env.DIRS_LIST | length) > 1 { - let-env DIRS_LIST = ( - ($env.DIRS_LIST | take $env.DIRS_POSITION) - | append ($env.DIRS_LIST | skip ($env.DIRS_POSITION + 1)) - ) - } - - _fetch 0 -} - -# Display current working directories. -export def-env "show" [] { - mut out = [] - for $p in ($env.DIRS_LIST | enumerate) { - $out = ($out | append [ - [active, path]; - [($p.index == $env.DIRS_POSITION), $p.item] - ]) - } - - $out -} - -# fetch item helper -def-env _fetch [ - offset: int, # signed change to position -] { - # nushell 'mod' operator is really 'remainder', can return negative values. - # see: https://stackoverflow.com/questions/13683563/whats-the-difference-between-mod-and-remainder - let pos = ($env.DIRS_POSITION - + $offset - + ($env.DIRS_LIST | length) - ) mod ($env.DIRS_LIST | length) - let-env DIRS_POSITION = $pos - - cd ($env.DIRS_LIST | get $pos ) -} diff --git a/crates/nu-utils/standard_library/std.nu b/crates/nu-utils/standard_library/std.nu index fdfed8ec28..ea75fbf3ac 100644 --- a/crates/nu-utils/standard_library/std.nu +++ b/crates/nu-utils/standard_library/std.nu @@ -1,21 +1,5 @@ # std.nu, `used` to load all standard library components -# ----------- sub modules to be loaded as part of stdlib ------------------ -# (choose flavor of import that puts your functions in the right namespace) -# This imports into std top-level namespace: std -# export use dirs.nu * -# This imports into std *sub* namespace: std dirs -# export use dirs.nu -# You could also advise the user to `use` your submodule directly -# to put the subcommands at the top level: dirs - -export use dirs.nu -# the directory stack -- export-env from submodule doesn't work? -export-env { - let-env DIRS_POSITION = 0 - let-env DIRS_LIST = [($env.PWD | path expand)] -} - # ---------------- builtin std functions -------------------- def _assertion-error [start, end, label, message?: string] { @@ -211,3 +195,87 @@ export def-env "path add" [ $env.PATH } } + +# Maintain a list of working directories and navigates them + +# the directory stack +export-env { + let-env DIRS_POSITION = 0 + let-env DIRS_LIST = [($env.PWD | path expand)] +} + +# Add one or more directories to the list. +# PWD becomes first of the newly added directories. +export def-env "dirs add" [ + ...paths: string # directory or directories to add to working list + ] { + mut abspaths = [] + for p in $paths { + let exp = ($p | path expand) + if ($exp | path type) != 'dir' { + let span = (metadata $p).span + error make {msg: "not a directory", label: {text: "not a directory", start: $span.start, end: $span.end } } + } + $abspaths = ($abspaths | append $exp) + + } + let-env DIRS_LIST = ($env.DIRS_LIST | insert ($env.DIRS_POSITION + 1) $abspaths | flatten) + let-env DIRS_POSITION = $env.DIRS_POSITION + 1 + + _fetch 0 +} + +# Advance to the next directory in the list or wrap to beginning. +export def-env "dirs next" [ + N:int = 1 # number of positions to move. +] { + _fetch $N +} + +# Back up to the previous directory or wrap to the end. +export def-env "dirs prev" [ + N:int = 1 # number of positions to move. +] { + _fetch (-1 * $N) +} + +# Drop the current directory from the list, if it's not the only one. +# PWD becomes the next working directory +export def-env "dirs drop" [] { + if ($env.DIRS_LIST | length) > 1 { + let-env DIRS_LIST = ( + ($env.DIRS_LIST | take $env.DIRS_POSITION) + | append ($env.DIRS_LIST | skip ($env.DIRS_POSITION + 1)) + ) + } + + _fetch 0 +} + +# Display current working directories. +export def-env "dirs show" [] { + mut out = [] + for $p in ($env.DIRS_LIST | enumerate) { + $out = ($out | append [ + [active, path]; + [($p.index == $env.DIRS_POSITION), $p.item] + ]) + } + + $out +} + +# fetch item helper +def-env _fetch [ + offset: int, # signed change to position +] { + # nushell 'mod' operator is really 'remainder', can return negative values. + # see: https://stackoverflow.com/questions/13683563/whats-the-difference-between-mod-and-remainder + let pos = ($env.DIRS_POSITION + + $offset + + ($env.DIRS_LIST | length) + ) mod ($env.DIRS_LIST | length) + let-env DIRS_POSITION = $pos + + cd ($env.DIRS_LIST | get $pos ) +} diff --git a/crates/nu-utils/standard_library/test_dirs.nu b/crates/nu-utils/standard_library/test_dirs.nu index bb1f568a83..60f29c9873 100644 --- a/crates/nu-utils/standard_library/test_dirs.nu +++ b/crates/nu-utils/standard_library/test_dirs.nu @@ -25,7 +25,11 @@ export def test_dirs_command [] { try { mkdir $base_path $path_a $path_b cd $base_path - use dirs.nu + use std.nu "dirs next" + use std.nu "dirs prev" + use std.nu "dirs add" + use std.nu "dirs drop" + use std.nu "dirs show" myassert (1 == ($env.DIRS_LIST | length)) "list is just pwd after initialization" myassert ($base_path == $env.DIRS_LIST.0) "list is just pwd after initialization" @@ -60,4 +64,4 @@ export def test_dirs_command [] { cd $base_path cd .. rm -r $base_path -} \ No newline at end of file +}