standard library: add log commands (#8448)

# Description

```nushell
log critical "this is a critical message"
log error "this is an error message"
log warning "this is a warning message"
log info "this is an info message"
log debug "this is a debug message"
```


![image](https://user-images.githubusercontent.com/282320/225071852-1ddf0e87-d12b-452d-9598-5122df7123ab.png)

# Tests + Formatting

Tests are written. To run automatically, #8443 needs to be merged before
or after this PR.

---------

Co-authored-by: Mate Farkas <Mate.Farkas@oneidentity.com>
This commit is contained in:
Máté FARKAS 2023-03-18 14:19:54 +01:00 committed by GitHub
parent c66bd5e809
commit 10a42de64f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 106 additions and 5 deletions

View File

@ -60,13 +60,13 @@ use /path/to/standard_library/std.nu
### :test_tube: run the tests
the following call should return no errors
```bash
nu /path/to/standard_library/tests.nu
NU_LOG_LEVEL=DEBUG nu /path/to/standard_library/tests.nu
```
> #### :mag: a concrete example
> with `STD_LIB` defined as in the example above
> ```bash
> nu ($env.STD_LIB | path join "tests.nu")
> NU_LOG_LEVEL=DEBUG nu ($env.STD_LIB | path join "tests.nu")
> ```
[REPL]: https://en.wikipedia.org/wiki/Read%E2%80%93eval%E2%80%93print_loop

View File

@ -236,3 +236,63 @@ def-env _fetch [
cd ($env.DIRS_LIST | get $pos )
}
def CRITICAL_LEVEL [] { 50 }
def ERROR_LEVEL [] { 40 }
def WARNING_LEVEL [] { 30 }
def INFO_LEVEL [] { 20 }
def DEBUG_LEVEL [] { 10 }
def parse-string-level [level: string] {
(
if $level == "CRITICAL" { (CRITICAL_LEVEL)}
else if $level == "CRIT" { (CRITICAL_LEVEL)}
else if $level == "ERROR" { (ERROR_LEVEL) }
else if $level == "WARNING" { (WARNING_LEVEL) }
else if $level == "WARN" { (WARNING_LEVEL) }
else if $level == "INFO" { (INFO_LEVEL) }
else if $level == "DEBUG" { (DEBUG_LEVEL) }
else { (INFO_LEVEL) }
)
}
def current-log-level [] {
let env_level = ($env | get -i NU_LOG_LEVEL | default (INFO_LEVEL))
try {
($env_level | into int)
} catch {
parse-string-level $env_level
}
}
# Log critical message
export def "log critical" [message: string] {
if (current-log-level) > (CRITICAL_LEVEL) { return }
print --stderr $"(ansi red_bold)CRIT ($message)(ansi reset)"
}
# Log error message
export def "log error" [message: string] {
if (current-log-level) > (ERROR_LEVEL) { return }
print --stderr $"(ansi red)ERROR ($message)(ansi reset)"
}
# Log warning message
export def "log warning" [message: string] {
if (current-log-level) > (WARNING_LEVEL) { return }
print --stderr $"(ansi yellow)WARN ($message)(ansi reset)"
}
# Log info message
export def "log info" [message: string] {
if (current-log-level) > (INFO_LEVEL) { return }
print --stderr $"(ansi white)INFO ($message)(ansi reset)"
}
# Log debug message
export def "log debug" [message: string] {
if (current-log-level) > (DEBUG_LEVEL) { return }
print --stderr $"(ansi default_dimmed)DEBUG ($message)(ansi reset)"
}

View File

@ -0,0 +1,39 @@
use std.nu *
def run [system_level, message_level] {
cd $env.FILE_PWD
do {
nu -c $'use std.nu; NU_LOG_LEVEL=($system_level) std log ($message_level) "test message"'
} | complete | get -i stderr
}
def "assert no message" [system_level, message_level] {
let output = (run $system_level $message_level)
assert eq $output ""
}
def "assert message" [system_level, message_level, message_level_str] {
let output = (run $system_level $message_level)
assert ($output | str contains $message_level_str)
assert ($output | str contains "test message")
}
export def test_critical [] {
assert no message 99 critical
assert message CRITICAL critical CRIT
}
export def test_error [] {
assert no message CRITICAL error
assert message ERROR error ERROR
}
export def test_warning [] {
assert no message ERROR warning
assert message WARNING warning WARN
}
export def test_info [] {
assert no message WARNING info
assert message INFO info INFO
}
export def test_debug [] {
assert no message INFO debug
assert message DEBUG debug DEBUG
}

View File

@ -1,10 +1,12 @@
use std.nu *
def main [] {
for test_file in (ls ($env.FILE_PWD | path join "test_*.nu") -f | get name) {
let $module_name = ($test_file | path parse).stem
echo $"(ansi default)INFO Run tests in ($module_name)(ansi reset)"
log info $"Run tests in ($module_name) module"
let tests = (
nu -c $'use ($test_file) *; $nu.scope.commands | to nuon'
nu -c $'use ($test_file) *; $nu.scope.commands | select name module_name | to nuon'
| from nuon
| where module_name == $module_name
| where ($it.name | str starts-with "test_")
@ -12,7 +14,7 @@ def main [] {
)
for test_case in $tests {
echo $"(ansi default_dimmed)DEBUG Run test ($module_name)/($test_case)(ansi reset)"
log debug $"Run test ($module_name) ($test_case)"
nu -c $'use ($test_file) ($test_case); ($test_case)'
}
}