#spec #utility #file-content #specification #dev #file-path

specker

简化文件与多个模板匹配的测试实用程序

10 个版本

使用旧的 Rust 2015

0.3.5 2018年4月8日
0.3.4 2018年3月27日
0.3.1 2017年2月16日
0.2.0 2017年2月16日
0.1.2 2017年2月12日

#262 in 测试

MIT/Apache

76KB
2K SLoC

Specker

Build Status

检查任意数量的文件是否与某些规范匹配。适用于测试文件生成。

假设我们有以下规范

## file: output/index.html
..
<body>
..
## file: output/style.css
..
body {
..
}
..

Specker 可以检查是否存在名为 output/index.html 的文件,其中包含 <body> 的某些行,以及文件 output/style.css 包含 body {} 行。符号 .. 匹配任意数量的行。

如果存在匹配错误,Specker 可以打印出如下的友好信息

1 | <bddy>
  | ^^^^^^
  | Expected "<body>", found "<bddy>"

它还提供了迭代器,可以批量运行许多此类规范测试。

以下是一个示例代码,它会迭代 "spec" 目录,收集所有 "txt" 规范并检查它们

extern crate specker;

use std::fs;
use std::env;
use std::path::PathBuf;
use std::collections::HashMap;

#[test]
fn check_specifications() {
    let src_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap());

    for maybe_spec in specker::walk_spec_dir(&spec_dir, "txt", specker::Options {
        skip_lines: "..",
        marker: "##",
        var_start: "${",
        var_end: "}",
    }) {
        let spec_path = maybe_spec.unwrap_or_else(|e| {
            // print nicely formatted error
            panic!("\n{}", specker::display_error(&e));
        });

        // go over spec items and check if file contents match
        for (item, input_file_name) in spec_path.spec.iter()
            .filter_map(
                |item| item.get_param("file")
                    .map(|param_value| (item, param_value))
            )
            {
                let path = spec_dir.join(input_file_name);
                let mut file = fs::File::open(&path)
                    .expect(&format!("failed to open file {:?}", &path));

                if let Err(e) = item.match_contents(&mut file, &HashMap::new()) {
                    // print nicely formatted error
                    println!("{}", specker::display_error_for_file(&path, &e));
                    // print one-liner error
                    panic!("{}", e);
                }
            }
    }
}

许可证

许可协议为以下之一

您可选择。

贡献

除非您明确说明,否则根据 Apache-2.0 许可证定义,您提交给作品中的任何有意贡献,均应按照上述方式双重许可,不附加任何额外条款或条件。

依赖关系

~0.1–7MB
~40K SLoC