#spec #testing #utility #dev


Testing utility that simplifies file matching against bunch of templates

10 releases

Uses old Rust 2015

0.3.5 Apr 8, 2018
0.3.4 Mar 27, 2018
0.3.1 Feb 16, 2017
0.2.0 Feb 16, 2017
0.1.2 Feb 12, 2017

#234 in Testing




Build Status

Checks if any number of files match some specification. Designed for testing file generation.

Let's say we have this specification:

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

Specker can check if there is a file named output/index.html containing <body> in some line, as well as file output/style.css containing body { and } lines. Symbol .. matches any number of lines.

If there is a match error, specker can print a nice message like:

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

It also has iterators to run many such specification tests in bulk.

Example code that iterates the "spec" dir, collects all "txt" specifications and checks them:

extern crate specker;

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

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()
                |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);


Licensed under either of

at your option.


Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.