mirror of
https://github.com/nushell/nushell.git
synced 2025-08-09 10:45:41 +02:00
Custom command attributes (#14906)
# Description Add custom command attributes. - Attributes are placed before a command definition and start with a `@` character. - Attribute invocations consist of const command call. The command's name must start with "attr ", but this prefix is not used in the invocation. - A command named `attr example` is invoked as an attribute as `@example` - Several built-in attribute commands are provided as part of this PR - `attr example`: Attaches an example to the commands help text ```nushell # Double numbers @example "double an int" { 5 | double } --result 10 @example "double a float" { 0.5 | double } --result 1.0 def double []: [number -> number] { $in * 2 } ``` - `attr search-terms`: Adds search terms to a command - ~`attr env`: Equivalent to using `def --env`~ - ~`attr wrapped`: Equivalent to using `def --wrapped`~ shelved for later discussion - several testing related attributes in `std/testing` - If an attribute has no internal/special purpose, it's stored as command metadata that can be obtained with `scope commands`. - This allows having attributes like `@test` which can be used by test runners. - Used the `@example` attribute for `std` examples. - Updated the std tests and test runner to use `@test` attributes - Added completions for attributes # User-Facing Changes Users can add examples to their own command definitions, and add other arbitrary attributes. # Tests + Formatting - 🟢 toolkit fmt - 🟢 toolkit clippy - 🟢 toolkit test - 🟢 toolkit test stdlib # After Submitting - Add documentation about the attribute syntax and built-in attributes - `help attributes` --------- Co-authored-by: 132ikl <132@ikl.sh>
This commit is contained in:
@ -14,43 +14,29 @@ def "nu-complete threads" [] {
|
||||
# test and test-skip annotations may be used multiple times throughout the module as the function names are stored in a list
|
||||
# Other annotations should only be used once within a module file
|
||||
# If you find yourself in need of multiple before- or after- functions it's a sign your test suite probably needs redesign
|
||||
def valid-annotations [] {
|
||||
{
|
||||
"#[test]": "test",
|
||||
"#[ignore]": "test-skip",
|
||||
"#[before-each]": "before-each"
|
||||
"#[before-all]": "before-all"
|
||||
"#[after-each]": "after-each"
|
||||
"#[after-all]": "after-all"
|
||||
}
|
||||
const valid_annotations = {
|
||||
"test": "test",
|
||||
"ignore": "test-skip",
|
||||
"before-each": "before-each"
|
||||
"before-all": "before-all"
|
||||
"after-each": "after-each"
|
||||
"after-all": "after-all"
|
||||
}
|
||||
|
||||
# Returns a table containing the list of function names together with their annotations (comments above the declaration)
|
||||
def get-annotated [
|
||||
file: path
|
||||
]: nothing -> table<function_name: string, annotation: string> {
|
||||
let raw_file = (
|
||||
open $file
|
||||
| lines
|
||||
| enumerate
|
||||
| flatten
|
||||
)
|
||||
|
||||
$raw_file
|
||||
| where item starts-with def and index > 0
|
||||
| insert annotation {|x|
|
||||
$raw_file
|
||||
| get ($x.index - 1)
|
||||
| get item
|
||||
| str trim
|
||||
}
|
||||
| where annotation in (valid-annotations|columns)
|
||||
| reject index
|
||||
| update item {
|
||||
split column --collapse-empty ' '
|
||||
| get column2.0
|
||||
}
|
||||
| rename function_name
|
||||
^$nu.current-exe -c $'
|
||||
source `($file)`
|
||||
scope commands
|
||||
| select name attributes
|
||||
| where attributes != []
|
||||
| to nuon
|
||||
'
|
||||
| from nuon
|
||||
| update attributes { get name | each {|x| $valid_annotations | get -i $x } | first }
|
||||
| rename function_name annotation
|
||||
}
|
||||
|
||||
# Takes table of function names and their annotations such as the one returned by get-annotated
|
||||
@ -72,10 +58,6 @@ def create-test-record []: nothing -> record<before-each: string, after-each: st
|
||||
|
||||
let test_record = (
|
||||
$input
|
||||
| update annotation {|x|
|
||||
valid-annotations
|
||||
| get $x.annotation
|
||||
}
|
||||
| group-by --to-table annotation
|
||||
| update items {|x|
|
||||
$x.items.function_name
|
||||
|
Reference in New Issue
Block a user