Skip to content

Nercury/specker-rs

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

50 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Specker

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
..
<body>
..
## 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;

#[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);
                }
            }
    }
}

License

Licensed under either of

at your option.

Contribution

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.

About

Testing utility that simplifies file matching against bunch of templates.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages