11 个版本 (5 个重大更新)

0.97.1 2024年8月21日
0.97.0 2024年8月20日
0.96.1 2024年7月29日
0.95.0 2024年6月25日
0.92.2 2024年4月10日

#15 in #nu

Download history 172/week @ 2024-04-29 4/week @ 2024-05-13 23/week @ 2024-05-20 268/week @ 2024-05-27 221/week @ 2024-06-03 26/week @ 2024-06-10 6/week @ 2024-06-17 184/week @ 2024-06-24 12/week @ 2024-07-01 5/week @ 2024-07-15 142/week @ 2024-07-22 168/week @ 2024-07-29 4/week @ 2024-08-05 21/week @ 2024-08-12

335 每月下载量
5 crates 中使用

MIT 和可能 CC-PDDC

2.5MB
57K SLoC

nu-plugin-test-support

此 crate 为运行插件命令的测试提供辅助工具,旨在包含在插件 crates 的 dev-dependencies 中以进行测试。


lib.rs:

Nushell 插件测试支持。

示例

use std::sync::Arc;

use nu_plugin::*;
use nu_plugin_test_support::PluginTest;
use nu_protocol::{
    Example, IntoInterruptiblePipelineData, LabeledError, PipelineData, ShellError, Signals,
    Signature, Span, Type, Value,
};

struct LowercasePlugin;
struct Lowercase;

impl PluginCommand for Lowercase {
    type Plugin = LowercasePlugin;

    fn name(&self) -> &str {
        "lowercase"
    }

    fn usage(&self) -> &str {
        "Convert each string in a stream to lowercase"
    }

    fn signature(&self) -> Signature {
        Signature::build(self.name()).input_output_type(
            Type::List(Type::String.into()),
            Type::List(Type::String.into()),
        )
    }

    fn examples(&self) -> Vec<Example> {
        vec![Example {
            example: r#"[Hello wORLD] | lowercase"#,
            description: "Lowercase a list of strings",
            result: Some(Value::test_list(vec![
                Value::test_string("hello"),
                Value::test_string("world"),
            ])),
        }]
    }

    fn run(
        &self,
        _plugin: &LowercasePlugin,
        _engine: &EngineInterface,
        call: &EvaluatedCall,
        input: PipelineData,
    ) -> Result<PipelineData, LabeledError> {
        let span = call.head;
        Ok(input.map(
            move |value| {
                value
                    .as_str()
                    .map(|string| Value::string(string.to_lowercase(), span))
                    // Errors in a stream should be returned as values.
                    .unwrap_or_else(|err| Value::error(err, span))
            },
            &Signals::empty(),
        )?)
    }
}

impl Plugin for LowercasePlugin {
    fn version(&self) -> String {
        env!("CARGO_PKG_VERSION").into()
    }

    fn commands(&self) -> Vec<Box<dyn PluginCommand<Plugin=Self>>> {
        vec![Box::new(Lowercase)]
    }
}

// #[test]
fn test_examples() -> Result<(), ShellError> {
    PluginTest::new("lowercase", LowercasePlugin.into())?
        .test_command_examples(&Lowercase)
}

// #[test]
fn test_lowercase() -> Result<(), ShellError> {
    let input = vec![Value::test_string("FooBar")].into_pipeline_data(Span::test_data(), Signals::empty());
    let output = PluginTest::new("lowercase", LowercasePlugin.into())?
        .eval_with("lowercase", input)?
        .into_value(Span::test_data())?;

    assert_eq!(
        Value::test_list(vec![
            Value::test_string("foobar")
        ]),
        output
    );
    Ok(())
}
#

依赖项

~24–54MB
~1M SLoC