From 18ffe5b321783ab15ebaaacff37211e82f28bc5b Mon Sep 17 00:00:00 2001 From: Kogia-sima Date: Wed, 16 Dec 2020 13:38:17 +0900 Subject: [PATCH] Remove benchmarks Remove benchmark programs in favor of https://github.com/djc/template-benchmarks-rs * Quite similar contents * Some library has too heavy dependencies and frequently cause breaking changes (which always results in tiny performance difference) * Some benchmark implementation is out of date * There is a persistent complaint that the benchmark is wrong (although I'm not still convinced) cc #28 #37 --- Cargo.toml | 1 - README.md | 2 +- benches/Cargo.lock | 2610 --------------------- benches/Cargo.toml | 35 - benches/README.md | 49 +- benches/benches/all.rs | 48 - benches/bigtable.png | Bin 46540 -> 0 bytes benches/src/askama_bench.rs | 58 - benches/src/build.rs | 11 - benches/src/fomat.rs | 76 - benches/src/handlebars.rs | 89 - benches/src/horrorshow_bench.rs | 92 - benches/src/lib.rs | 19 - benches/src/liquid.rs | 75 - benches/src/markup_bench.rs | 83 - benches/src/maud_bench.rs | 92 - benches/src/ramhorns.rs | 89 - benches/src/ructe.rs | 48 - benches/src/sailfish.rs | 73 - benches/src/std_write.rs | 97 - benches/src/tera.rs | 84 - benches/src/yarte_bench.rs | 58 - benches/src/yarte_bytes.rs | 59 - benches/src/yarte_fixed.rs | 64 - benches/teams.png | Bin 56122 -> 0 bytes benches/templates/big-table.hbs | 1 - benches/templates/big-table.html | 5 - benches/templates/big-table.stpl | 3 - benches/templates/teams.hbs | 1 - benches/templates/teams.html | 15 - benches/templates/teams.stpl | 11 - benches/templates_ructe/big_table.rs.html | 11 - benches/templates_ructe/teams.rs.html | 18 - 33 files changed, 2 insertions(+), 3975 deletions(-) delete mode 100644 benches/Cargo.lock delete mode 100644 benches/Cargo.toml delete mode 100644 benches/benches/all.rs delete mode 100644 benches/bigtable.png delete mode 100644 benches/src/askama_bench.rs delete mode 100644 benches/src/build.rs delete mode 100644 benches/src/fomat.rs delete mode 100644 benches/src/handlebars.rs delete mode 100644 benches/src/horrorshow_bench.rs delete mode 100644 benches/src/lib.rs delete mode 100644 benches/src/liquid.rs delete mode 100644 benches/src/markup_bench.rs delete mode 100644 benches/src/maud_bench.rs delete mode 100644 benches/src/ramhorns.rs delete mode 100644 benches/src/ructe.rs delete mode 100644 benches/src/sailfish.rs delete mode 100644 benches/src/std_write.rs delete mode 100644 benches/src/tera.rs delete mode 100644 benches/src/yarte_bench.rs delete mode 100644 benches/src/yarte_bytes.rs delete mode 100644 benches/src/yarte_fixed.rs delete mode 100644 benches/teams.png delete mode 100644 benches/templates/big-table.hbs delete mode 100644 benches/templates/big-table.html delete mode 100644 benches/templates/big-table.stpl delete mode 100644 benches/templates/teams.hbs delete mode 100644 benches/templates/teams.html delete mode 100644 benches/templates/teams.stpl delete mode 100644 benches/templates_ructe/big_table.rs.html delete mode 100644 benches/templates_ructe/teams.rs.html diff --git a/Cargo.toml b/Cargo.toml index a2dd99c..37bbf86 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,6 +7,5 @@ members = [ ] exclude = [ "sailfish-tests/fuzzing-tests", - "benches", "examples" ] diff --git a/README.md b/README.md index 7dc9c0f..833fca6 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ Simple, small, and extremely fast template engine for Rust - Simple and intuitive syntax inspired by [EJS](https://ejs.co/) - Relatively small number of dependencies (<15 crates in total) -- Extremely fast (See [benchmarks](./benches/README.md)) +- Extremely fast (See [benchmarks](https://github.com/djc/template-benchmarks-rs)) - Better error message - Template rendering NEVER fails unless you explicitly return error. - Syntax highlighting support ([vscode](./syntax/vscode), [vim](./syntax/vim)) diff --git a/benches/Cargo.lock b/benches/Cargo.lock deleted file mode 100644 index db4fca8..0000000 --- a/benches/Cargo.lock +++ /dev/null @@ -1,2610 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -[[package]] -name = "adler" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccc9a9dd069569f212bc4330af9f17c4afb5e8ce185e83dbb14f1349dda18b10" - -[[package]] -name = "ahash" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8fd72866655d1904d6b0997d0b07ba561047d070fbe29de039031c641b61217" -dependencies = [ - "const-random", -] - -[[package]] -name = "aho-corasick" -version = "0.7.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "043164d8ba5c4c3035fec9bbee8647c0261d788f3474306f93bb65901cae0e86" -dependencies = [ - "memchr", -] - -[[package]] -name = "annotate-snippets" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c96c3d1062ea7101741480185a6a1275eab01cbe8b20e378d1311bc056d2e08" -dependencies = [ - "unicode-width", - "yansi-term", -] - -[[package]] -name = "ansi_colours" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d0f302a81afc6a7f4350c04f0ba7cfab529cc009bca3324b3fb5764e6add8b6" -dependencies = [ - "cc", -] - -[[package]] -name = "ansi_term" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" -dependencies = [ - "winapi", -] - -[[package]] -name = "ansi_term" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" -dependencies = [ - "winapi", -] - -[[package]] -name = "anymap" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33954243bd79057c2de7338850b85983a44588021f8a5fee574a8888c6de4344" - -[[package]] -name = "arrayref" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" - -[[package]] -name = "arrayvec" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cff77d8686867eceff3105329d4698d96c2391c176d5d03adc90c7389162b5b8" - -[[package]] -name = "askama" -version = "0.10.0" -source = "git+https://github.com/djc/askama#0a6284aa91e1eb8da81d7b317fb539653e519d0a" -dependencies = [ - "askama_derive", - "askama_escape", - "askama_shared", -] - -[[package]] -name = "askama_derive" -version = "0.10.0" -source = "git+https://github.com/djc/askama#0a6284aa91e1eb8da81d7b317fb539653e519d0a" -dependencies = [ - "askama_shared", - "proc-macro2 1.0.18", - "quote 1.0.7", - "syn 1.0.33", -] - -[[package]] -name = "askama_escape" -version = "0.10.1" -source = "git+https://github.com/djc/askama#0a6284aa91e1eb8da81d7b317fb539653e519d0a" - -[[package]] -name = "askama_shared" -version = "0.10.2" -source = "git+https://github.com/djc/askama#0a6284aa91e1eb8da81d7b317fb539653e519d0a" -dependencies = [ - "askama_escape", - "humansize", - "nom 5.1.2", - "num-traits", - "percent-encoding 2.1.0", - "proc-macro2 1.0.18", - "quote 1.0.7", - "serde", - "syn 1.0.33", - "toml", -] - -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi", - "libc", - "winapi", -] - -[[package]] -name = "autocfg" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" - -[[package]] -name = "base64" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b41b7ea54a0c9d92199de89e20e58d49f02f8e699814ef3fdf266f6f748d15c7" - -[[package]] -name = "base64" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" - -[[package]] -name = "bat" -version = "0.15.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91f17c2d9e1cee447a788a15fa6819c0cb488fb2935e3e8c4e7120e1678b7aa8" -dependencies = [ - "ansi_colours", - "ansi_term 0.12.1", - "atty", - "clap", - "console", - "content_inspector", - "dirs 2.0.2", - "encoding", - "error-chain", - "git2", - "globset", - "lazy_static", - "liquid 0.20.1", - "path_abs", - "semver", - "serde", - "serde_yaml", - "shell-words", - "syntect", - "unicode-width", - "wild", -] - -[[package]] -name = "beef" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "474a626a67200bd107d44179bb3d4fc61891172d11696609264589be6a0e6a43" - -[[package]] -name = "benches" -version = "0.2.1" -dependencies = [ - "askama", - "bytes", - "criterion", - "fomat-macros", - "handlebars", - "horrorshow", - "liquid 0.19.0", - "markup", - "maud", - "ramhorns", - "ructe", - "sailfish", - "sailfish-macros", - "serde", - "serde_derive", - "serde_json", - "serde_yaml", - "tera", - "v_htmlescape 0.9.1", - "yarte", -] - -[[package]] -name = "bincode" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30d3a39baa26f9651f17b375061f3233dde33424a8b72b0dbe93a68a0bc896d" -dependencies = [ - "byteorder", - "serde", -] - -[[package]] -name = "bitflags" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" - -[[package]] -name = "blake2b_simd" -version = "0.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8fb2d74254a3a0b5cac33ac9f8ed0e44aa50378d9dbb2e5d83bd21ed1dc2c8a" -dependencies = [ - "arrayref", - "arrayvec", - "constant_time_eq", -] - -[[package]] -name = "block-buffer" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" -dependencies = [ - "block-padding", - "byte-tools", - "byteorder", - "generic-array", -] - -[[package]] -name = "block-padding" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" -dependencies = [ - "byte-tools", -] - -[[package]] -name = "bstr" -version = "0.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31accafdb70df7871592c058eca3985b71104e15ac32f64706022c58867da931" -dependencies = [ - "lazy_static", - "memchr", - "regex-automata", - "serde", -] - -[[package]] -name = "buf-min" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c4ab58c23b5bf0d27713787d5dcd5f62c2260ca172d5af24b7de706bcc2897f" -dependencies = [ - "bytes", -] - -[[package]] -name = "bumpalo" -version = "3.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e8c087f005730276d1096a652e92a8bacee2e2472bcc9715a74d2bec38b5820" - -[[package]] -name = "byte-tools" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" - -[[package]] -name = "bytecount" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0017894339f586ccb943b01b9555de56770c11cda818e7e3d8bd93f4ed7f46e" - -[[package]] -name = "byteorder" -version = "1.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de" - -[[package]] -name = "bytes" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "118cf036fbb97d0816e3c34b2d7a1e8cfc60f68fcf63d550ddbe9bd5f59c213b" -dependencies = [ - "loom", -] - -[[package]] -name = "cast" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b9434b9a5aa1450faa3f9cb14ea0e8c53bb5d2b3c1bfd1ab4fc03e9f33fbfb0" -dependencies = [ - "rustc_version", -] - -[[package]] -name = "cc" -version = "1.0.56" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77c1f1d60091c1b73e2b1f4560ab419204b178e625fa945ded7b660becd2bd46" -dependencies = [ - "jobserver", -] - -[[package]] -name = "cfg-if" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" - -[[package]] -name = "chrono" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0fee792e164f78f5fe0c296cc2eb3688a2ca2b70cdff33040922d298203f0c4" -dependencies = [ - "num-integer", - "num-traits", - "time", -] - -[[package]] -name = "chrono-tz" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65d96be7c3e993c9ee4356442db24ba364c924b6b8331866be6b6952bfe74b9d" -dependencies = [ - "chrono", - "parse-zoneinfo", -] - -[[package]] -name = "clap" -version = "2.33.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdfa80d47f954d53a35a64987ca1422f495b8d6483c0fe9f7117b36c2a792129" -dependencies = [ - "ansi_term 0.11.0", - "atty", - "bitflags", - "strsim", - "term_size", - "textwrap", - "unicode-width", - "vec_map", -] - -[[package]] -name = "console" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c0994e656bba7b922d8dd1245db90672ffb701e684e45be58f20719d69abc5a" -dependencies = [ - "encode_unicode", - "lazy_static", - "libc", - "regex", - "terminal_size", - "termios", - "unicode-width", - "winapi", - "winapi-util", -] - -[[package]] -name = "const-random" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f1af9ac737b2dd2d577701e59fd09ba34822f6f2ebdb30a7647405d9e55e16a" -dependencies = [ - "const-random-macro", - "proc-macro-hack", -] - -[[package]] -name = "const-random-macro" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25e4c606eb459dd29f7c57b2e0879f2b6f14ee130918c2b78ccb58a9624e6c7a" -dependencies = [ - "getrandom", - "proc-macro-hack", -] - -[[package]] -name = "constant_time_eq" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" - -[[package]] -name = "content_inspector" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7bda66e858c683005a53a9a60c69a4aca7eeaa45d124526e389f7aec8e62f38" -dependencies = [ - "memchr", -] - -[[package]] -name = "crc32fast" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "criterion" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70daa7ceec6cf143990669a04c7df13391d55fb27bd4079d252fca774ba244d8" -dependencies = [ - "atty", - "cast", - "clap", - "criterion-plot", - "csv", - "itertools 0.9.0", - "lazy_static", - "num-traits", - "oorandom", - "plotters", - "rayon", - "regex", - "serde", - "serde_cbor", - "serde_derive", - "serde_json", - "tinytemplate", - "walkdir", -] - -[[package]] -name = "criterion-plot" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e022feadec601fba1649cfa83586381a4ad31c6bf3a9ab7d408118b05dd9889d" -dependencies = [ - "cast", - "itertools 0.9.0", -] - -[[package]] -name = "crossbeam-deque" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f02af974daeee82218205558e51ec8768b48cf524bd01d550abe5573a608285" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", - "maybe-uninit", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "058ed274caafc1f60c4997b5fc07bf7dc7cca454af7c6e81edffe5f33f70dace" -dependencies = [ - "autocfg", - "cfg-if", - "crossbeam-utils", - "lazy_static", - "maybe-uninit", - "memoffset", - "scopeguard", -] - -[[package]] -name = "crossbeam-queue" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "774ba60a54c213d409d5353bda12d49cd68d14e45036a285234c8d6f91f92570" -dependencies = [ - "cfg-if", - "crossbeam-utils", - "maybe-uninit", -] - -[[package]] -name = "crossbeam-utils" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8" -dependencies = [ - "autocfg", - "cfg-if", - "lazy_static", -] - -[[package]] -name = "csv" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00affe7f6ab566df61b4be3ce8cf16bc2576bca0963ceb0955e45d514bf9a279" -dependencies = [ - "bstr", - "csv-core", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "csv-core" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90" -dependencies = [ - "memchr", -] - -[[package]] -name = "derive_more" -version = "0.99.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "298998b1cf6b5b2c8a7b023dfd45821825ce3ba8a8af55c921a0e734e4653f76" -dependencies = [ - "proc-macro2 1.0.18", - "quote 1.0.7", - "syn 1.0.33", -] - -[[package]] -name = "deunicode" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "850878694b7933ca4c9569d30a34b55031b9b139ee1fc7b94a527c4ef960d690" - -[[package]] -name = "deunicode" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80115a2dfde04491e181c2440a39e4be26e52d9ca4e92bed213f65b94e0b8db1" - -[[package]] -name = "digest" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" -dependencies = [ - "generic-array", -] - -[[package]] -name = "dirs" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fd78930633bd1c6e35c4b42b1df7b0cbc6bc191146e512bb3bedf243fcc3901" -dependencies = [ - "libc", - "redox_users", - "winapi", -] - -[[package]] -name = "dirs" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13aea89a5c93364a98e9b37b2fa237effbb694d5cfe01c5b70941f7eb087d5e3" -dependencies = [ - "cfg-if", - "dirs-sys", -] - -[[package]] -name = "dirs-sys" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e93d7f5705de3e49895a2b5e0b8855a1c27f080192ae9c32a6432d50741a57a" -dependencies = [ - "libc", - "redox_users", - "winapi", -] - -[[package]] -name = "doc-comment" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" - -[[package]] -name = "dtoa" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134951f4028bdadb9b84baf4232681efbf277da25144b9b0ad65df75946c422b" - -[[package]] -name = "either" -version = "1.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb1f6b1ce1c140482ea30ddd3335fc0024ac7ee112895426e0a629a6c20adfe3" - -[[package]] -name = "encode_unicode" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" - -[[package]] -name = "encoding" -version = "0.2.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b0d943856b990d12d3b55b359144ff341533e516d94098b1d3fc1ac666d36ec" -dependencies = [ - "encoding-index-japanese", - "encoding-index-korean", - "encoding-index-simpchinese", - "encoding-index-singlebyte", - "encoding-index-tradchinese", -] - -[[package]] -name = "encoding-index-japanese" -version = "1.20141219.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04e8b2ff42e9a05335dbf8b5c6f7567e5591d0d916ccef4e0b1710d32a0d0c91" -dependencies = [ - "encoding_index_tests", -] - -[[package]] -name = "encoding-index-korean" -version = "1.20141219.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dc33fb8e6bcba213fe2f14275f0963fd16f0a02c878e3095ecfdf5bee529d81" -dependencies = [ - "encoding_index_tests", -] - -[[package]] -name = "encoding-index-simpchinese" -version = "1.20141219.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d87a7194909b9118fc707194baa434a4e3b0fb6a5a757c73c3adb07aa25031f7" -dependencies = [ - "encoding_index_tests", -] - -[[package]] -name = "encoding-index-singlebyte" -version = "1.20141219.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3351d5acffb224af9ca265f435b859c7c01537c0849754d3db3fdf2bfe2ae84a" -dependencies = [ - "encoding_index_tests", -] - -[[package]] -name = "encoding-index-tradchinese" -version = "1.20141219.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd0e20d5688ce3cab59eb3ef3a2083a5c77bf496cb798dc6fcdb75f323890c18" -dependencies = [ - "encoding_index_tests", -] - -[[package]] -name = "encoding_index_tests" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a246d82be1c9d791c5dfde9a2bd045fc3cbba3fa2b11ad558f27d01712f00569" - -[[package]] -name = "error-chain" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d371106cc88ffdfb1eabd7111e432da544f16f3e2d7bf1dfe8bf575f1df045cd" -dependencies = [ - "version_check 0.9.2", -] - -[[package]] -name = "fake-simd" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" - -[[package]] -name = "flate2" -version = "1.0.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68c90b0fc46cf89d227cc78b40e494ff81287a92dd07631e5af0d06fe3cf885e" -dependencies = [ - "cfg-if", - "crc32fast", - "libc", - "miniz_oxide", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "fomat-macros" -version = "0.3.1" -source = "git+https://github.com/krdln/fomat-macros#7e790d5cf205f05ed8c5ce2c81f4eb39de68b457" - -[[package]] -name = "generator" -version = "0.6.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "add72f17bb81521258fcc8a7a3245b1e184e916bfbe34f0ea89558f440df5c68" -dependencies = [ - "cc", - "libc", - "log", - "rustc_version", - "winapi", -] - -[[package]] -name = "generic-array" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c68f0274ae0e023facc3c97b2e00f076be70e254bc851d972503b328db79b2ec" -dependencies = [ - "typenum", -] - -[[package]] -name = "getopts" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14dbbfd5c71d70241ecf9e6f13737f7b5ce823821063188d7e46c41d371eebd5" -dependencies = [ - "unicode-width", -] - -[[package]] -name = "getrandom" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - -[[package]] -name = "git2" -version = "0.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11e4b2082980e751c4bf4273e9cbb4a02c655729c8ee8a79f66cad03c8f4d31e" -dependencies = [ - "bitflags", - "libc", - "libgit2-sys", - "log", - "url 2.1.1", -] - -[[package]] -name = "glob" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" - -[[package]] -name = "globset" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ad1da430bd7281dde2576f44c84cc3f0f7b475e7202cd503042dff01a8c8120" -dependencies = [ - "aho-corasick", - "bstr", - "fnv", - "log", - "regex", -] - -[[package]] -name = "globwalk" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "178270263374052c40502e9f607134947de75302c1348d1a0e31db67c1691446" -dependencies = [ - "bitflags", - "ignore", - "walkdir", -] - -[[package]] -name = "half" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d36fab90f82edc3c747f9d438e06cf0a491055896f2a279638bb5beed6c40177" - -[[package]] -name = "handlebars" -version = "3.2.2-alpha.0" -source = "git+https://github.com/sunng87/handlebars-rust#5d9710c16218967026f1c1b44ac95f8d8063d4ea" -dependencies = [ - "log", - "pest", - "pest_derive", - "quick-error", - "serde", - "serde_json", -] - -[[package]] -name = "hermit-abi" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9586eedd4ce6b3c498bc3b4dd92fc9f11166aa908a914071953768066c67909" -dependencies = [ - "libc", -] - -[[package]] -name = "home" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2456aef2e6b6a9784192ae780c0f15bc57df0e918585282325e8c8ac27737654" -dependencies = [ - "winapi", -] - -[[package]] -name = "horrorshow" -version = "0.8.3" -source = "git+https://github.com/Stebalien/horrorshow-rs#36c6e95f62ed2c7eef8174a9a3df4d6d87661cf4" - -[[package]] -name = "humansize" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6cab2627acfc432780848602f3f558f7e9dd427352224b0d9324025796d2a5e" - -[[package]] -name = "idna" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" -dependencies = [ - "matches", - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "idna" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02e2673c30ee86b5b96a9cb52ad15718aa1f966f5ab9ad54a8b95d5ca33120a9" -dependencies = [ - "matches", - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "ignore" -version = "0.4.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22dcbf2a4a289528dbef21686354904e1c694ac642610a9bff9e7df730d9ec72" -dependencies = [ - "crossbeam-utils", - "globset", - "lazy_static", - "log", - "memchr", - "regex", - "same-file", - "thread_local", - "walkdir", - "winapi-util", -] - -[[package]] -name = "indexmap" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c398b2b113b55809ceb9ee3e753fcbac793f1956663f3c36549c1346015c2afe" -dependencies = [ - "autocfg", -] - -[[package]] -name = "itertools" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f56a2d0bc861f9165be4eb3442afd3c236d8a98afd426f65d92324ae1091a484" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc6f3ad7b9d11a0c00842ff8de1b60ee58661048eb8049ed33c73594f359d7e6" - -[[package]] -name = "itoap" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e804a5759b475f44377998918a7e3be9da3767056f5e77751ef7803893db0e9" - -[[package]] -name = "jobserver" -version = "0.1.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c71313ebb9439f74b00d9d2dcec36440beaf57a6aa0623068441dd7cd81a7f2" -dependencies = [ - "libc", -] - -[[package]] -name = "js-sys" -version = "0.3.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4b9172132a62451e56142bff9afc91c8e4a4500aa5b847da36815b63bfda916" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "kstring" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbbc30beb80d56ddf6346e935c7abcba96329ee5c5a4cde8984a4e6b6f18b58e" -dependencies = [ - "serde", -] - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" - -[[package]] -name = "lazycell" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" - -[[package]] -name = "lexical-core" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db65c6da02e61f55dae90a0ae427b2a5f6b3e8db09f58d10efab23af92592616" -dependencies = [ - "arrayvec", - "bitflags", - "cfg-if", - "ryu", - "static_assertions", -] - -[[package]] -name = "libc" -version = "0.2.71" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9457b06509d27052635f90d6466700c65095fdf75409b3fbdd903e988b886f49" - -[[package]] -name = "libgit2-sys" -version = "0.12.7+1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcd07968649bcb7b9351ecfde53ca4d27673cccfdf57c84255ec18710f3153e0" -dependencies = [ - "cc", - "libc", - "libz-sys", - "pkg-config", -] - -[[package]] -name = "libz-sys" -version = "1.0.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2eb5e43362e38e2bca2fd5f5134c4d4564a23a5c28e9b95411652021a8675ebe" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "line-wrap" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30344350a2a51da54c1d53be93fade8a237e545dbcc4bdbe635413f2117cab9" -dependencies = [ - "safemem", -] - -[[package]] -name = "linked-hash-map" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8dd5a6d5999d9907cda8ed67bbd137d3af8085216c2ac62de5be860bd41f304a" - -[[package]] -name = "liquid" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7cf7f28965f50ff06e2e9f26162f6d944b71f976506a7a01a6308ddebd36155" -dependencies = [ - "chrono", - "deunicode 1.1.1", - "doc-comment", - "itertools 0.8.2", - "lazy_static", - "liquid-compiler", - "liquid-derive 0.19.0", - "liquid-error", - "liquid-interpreter", - "liquid-value", - "regex", - "serde", - "unicode-segmentation", - "url 1.7.2", -] - -[[package]] -name = "liquid" -version = "0.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "503b7cd741bf1a6c01bfdf697ba13f67e2c8e152920af25596763bb0dbcd6215" -dependencies = [ - "doc-comment", - "kstring", - "liquid-core", - "liquid-derive 0.20.1", - "liquid-lib", - "serde", -] - -[[package]] -name = "liquid-compiler" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd195c00674a2dc811b07969358c97c0639db4a73bc61514db48609d110356f" -dependencies = [ - "itertools 0.8.2", - "liquid-error", - "liquid-interpreter", - "liquid-value", - "pest", - "pest_derive", -] - -[[package]] -name = "liquid-core" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dc58422728185d54cd044bba4d45a2ef2a7111a421f84d344f65629949de4f1" -dependencies = [ - "anymap", - "chrono", - "itertools 0.9.0", - "kstring", - "liquid-derive 0.20.1", - "num-traits", - "pest", - "pest_derive", - "serde", -] - -[[package]] -name = "liquid-derive" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0faadd0dd1a7cf38390316c36a9a741949462750f9833b794ac6d7de145218" -dependencies = [ - "liquid-compiler", - "liquid-error", - "liquid-interpreter", - "liquid-value", - "proc-macro2 0.4.30", - "proc-quote 0.2.2", - "syn 0.15.44", -] - -[[package]] -name = "liquid-derive" -version = "0.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfef35f37f019e5dfc550517045078317f5d37afa64cbf246ecde616a7091cb0" -dependencies = [ - "proc-macro2 1.0.18", - "proc-quote 0.3.2", - "syn 1.0.33", -] - -[[package]] -name = "liquid-error" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d5c0851812322e87dcf67c2d7e520c3efd8651bd44eb8d0c0246e6dfb94d481" - -[[package]] -name = "liquid-interpreter" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "998e0411b8cb6210bb0729ccbb15abd2a1c8ef7e318c97511ae5a741c817c63e" -dependencies = [ - "anymap", - "itertools 0.8.2", - "liquid-error", - "liquid-value", -] - -[[package]] -name = "liquid-lib" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c4aa47dc08fd8c6c8aea70a0da2a98c0f0416d49e8b03c5c46354ef559bee3c" -dependencies = [ - "chrono", - "itertools 0.9.0", - "kstring", - "liquid-core", - "once_cell", - "percent-encoding 2.1.0", - "regex", - "unicode-segmentation", -] - -[[package]] -name = "liquid-value" -version = "0.19.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f56016187fb289186fccf44a9ae840f7b9ba35a04fd611e591aed2a1f53c265" -dependencies = [ - "chrono", - "itertools 0.8.2", - "liquid-error", - "num-traits", - "serde", -] - -[[package]] -name = "log" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "logos" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b91c49573597a5d6c094f9031617bb1fed15c0db68c81e6546d313414ce107e4" -dependencies = [ - "logos-derive", -] - -[[package]] -name = "logos-derive" -version = "0.11.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "797b1f8a0571b331c1b47e7db245af3dc634838da7a92b3bef4e30376ae1c347" -dependencies = [ - "beef", - "fnv", - "proc-macro2 1.0.18", - "quote 1.0.7", - "regex-syntax", - "syn 1.0.33", - "utf8-ranges", -] - -[[package]] -name = "loom" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ecc775857611e1df29abba5c41355cdf540e7e9d4acfdf0f355eefee82330b7" -dependencies = [ - "cfg-if", - "generator", - "scoped-tls", -] - -[[package]] -name = "maplit" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" - -[[package]] -name = "markup" -version = "0.4.1" -source = "git+https://github.com/utkarshkukreti/markup.rs#2699be6bfc4204da29b29a4e5dada1c961e98b0a" -dependencies = [ - "markup-proc-macro", -] - -[[package]] -name = "markup-proc-macro" -version = "0.4.1" -source = "git+https://github.com/utkarshkukreti/markup.rs#2699be6bfc4204da29b29a4e5dada1c961e98b0a" -dependencies = [ - "proc-macro2 1.0.18", - "quote 1.0.7", - "syn 1.0.33", -] - -[[package]] -name = "matches" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" - -[[package]] -name = "maud" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00e51ec55a4a151ecd3e05a66e591541b9a137e1b43f265cca028b12d421c71d" -dependencies = [ - "maud_htmlescape", - "maud_macros", -] - -[[package]] -name = "maud_htmlescape" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0fb85bccffc42302ad1e1ed8679f6a39d1317f775a37fbc3f79bdfbe054bfb7" - -[[package]] -name = "maud_macros" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62ae0fd1d7057a6ad57caf8f85257fcae575f70ecbaee5e7d7401f3c033ad931" -dependencies = [ - "matches", - "maud_htmlescape", - "syn 0.15.44", -] - -[[package]] -name = "maybe-uninit" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" - -[[package]] -name = "md5" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "490cc448043f947bae3cbee9c203358d62dbee0db12107a74be5c30ccfd09771" - -[[package]] -name = "memchr" -version = "2.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3728d817d99e5ac407411fa471ff9800a778d88a24685968b36824eaf4bee400" - -[[package]] -name = "memoffset" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c198b026e1bbf08a937e94c6c60f9ec4a2267f5b0d2eec9c1b21b061ce2be55f" -dependencies = [ - "autocfg", -] - -[[package]] -name = "miniz_oxide" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be0f75932c1f6cfae3c04000e40114adf955636e19040f9c0a2c380702aa1c7f" -dependencies = [ - "adler", -] - -[[package]] -name = "nom" -version = "4.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6" -dependencies = [ - "memchr", - "version_check 0.1.5", -] - -[[package]] -name = "nom" -version = "5.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffb4262d26ed83a1c0a33a38fe2bb15797329c85770da05e6b828ddb782627af" -dependencies = [ - "lexical-core", - "memchr", - "version_check 0.9.2", -] - -[[package]] -name = "num-integer" -version = "0.1.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d59457e662d541ba17869cf51cf177c0b5f0cbf476c66bdc90bf1edac4f875b" -dependencies = [ - "autocfg", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac267bcc07f48ee5f8935ab0d24f316fb722d7a1292e2913f0cc196b29ffd611" -dependencies = [ - "autocfg", -] - -[[package]] -name = "num_cpus" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "once_cell" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b631f7e854af39a1739f401cf34a8a013dfe09eac4fa4dba91e9768bd28168d" - -[[package]] -name = "onig" -version = "6.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd91ccd8a02fce2f7e8a86655aec67bc6c171e6f8e704118a0e8c4b866a05a8a" -dependencies = [ - "bitflags", - "lazy_static", - "libc", - "onig_sys", -] - -[[package]] -name = "onig_sys" -version = "69.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3814583fad89f3c60ae0701d80e87e1fd3028741723deda72d0d4a0ecf0cb0db" -dependencies = [ - "cc", - "pkg-config", -] - -[[package]] -name = "oorandom" -version = "11.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a170cebd8021a008ea92e4db85a72f80b35df514ec664b296fdcbb654eac0b2c" - -[[package]] -name = "opaque-debug" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" - -[[package]] -name = "parse-zoneinfo" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c705f256449c60da65e11ff6626e0c16a0a0b96aaa348de61376b249bc340f41" -dependencies = [ - "regex", -] - -[[package]] -name = "path_abs" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb6b8e6dede0bf94e9300e669f335ba92d5fc9fc8be7f4b1ca8a05206489388c" -dependencies = [ - "std_prelude", -] - -[[package]] -name = "percent-encoding" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" - -[[package]] -name = "percent-encoding" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" - -[[package]] -name = "pest" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10f4872ae94d7b90ae48754df22fd42ad52ce740b8f370b03da4835417403e53" -dependencies = [ - "ucd-trie", -] - -[[package]] -name = "pest_derive" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "833d1ae558dc601e9a60366421196a8d94bc0ac980476d0b67e1d0988d72b2d0" -dependencies = [ - "pest", - "pest_generator", -] - -[[package]] -name = "pest_generator" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99b8db626e31e5b81787b9783425769681b347011cc59471e33ea46d2ea0cf55" -dependencies = [ - "pest", - "pest_meta", - "proc-macro2 1.0.18", - "quote 1.0.7", - "syn 1.0.33", -] - -[[package]] -name = "pest_meta" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54be6e404f5317079812fc8f9f5279de376d8856929e21c184ecf6bbd692a11d" -dependencies = [ - "maplit", - "pest", - "sha-1", -] - -[[package]] -name = "pkg-config" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05da548ad6865900e60eaba7f589cc0783590a92e940c26953ff81ddbab2d677" - -[[package]] -name = "plist" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b336d94e8e4ce29bf15bba393164629764744c567e8ad306cc1fdd0119967fd" -dependencies = [ - "base64 0.12.3", - "chrono", - "indexmap", - "line-wrap", - "serde", - "xml-rs", -] - -[[package]] -name = "plotters" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d1685fbe7beba33de0330629da9d955ac75bd54f33d7b79f9a895590124f6bb" -dependencies = [ - "js-sys", - "num-traits", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "ppv-lite86" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "237a5ed80e274dbc66f86bd59c1e25edc039660be53194b5fe0a482e0f2612ea" - -[[package]] -name = "proc-macro-hack" -version = "0.5.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e0456befd48169b9f13ef0f0ad46d492cf9d2dbb918bcf38e01eed4ce3ec5e4" - -[[package]] -name = "proc-macro2" -version = "0.4.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" -dependencies = [ - "unicode-xid 0.1.0", -] - -[[package]] -name = "proc-macro2" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "beae6331a816b1f65d04c45b078fd8e6c93e8071771f41b8163255bbd8d7c8fa" -dependencies = [ - "unicode-xid 0.2.1", -] - -[[package]] -name = "proc-quote" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa612543f23fda013e1e6ce30b5285a9d313c6e582e57b4ceca74eb5b85685b5" -dependencies = [ - "proc-macro-hack", - "proc-macro2 0.4.30", - "proc-quote-impl 0.2.2", - "quote 0.6.13", - "syn 0.15.44", -] - -[[package]] -name = "proc-quote" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea4226882439d07839be9c7f683e13d6d69d9c2fe960d61f637d1e2fa4c081" -dependencies = [ - "proc-macro-hack", - "proc-macro2 1.0.18", - "proc-quote-impl 0.3.2", - "quote 1.0.7", - "syn 1.0.33", -] - -[[package]] -name = "proc-quote-impl" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f785f0f8cd00b7945efc3f3bdf8205eb06af5aacec598d83e67f41dc8d101fda" -dependencies = [ - "proc-macro-hack", - "proc-macro2 0.4.30", - "quote 0.6.13", -] - -[[package]] -name = "proc-quote-impl" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fb3ec628b063cdbcf316e06a8b8c1a541d28fa6c0a8eacd2bfb2b7f49e88aa0" -dependencies = [ - "proc-macro-hack", - "proc-macro2 1.0.18", - "quote 1.0.7", -] - -[[package]] -name = "pulldown-cmark" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e142c3b8f49d2200605ee6ba0b1d757310e9e7a72afe78c36ee2ef67300ee00" -dependencies = [ - "bitflags", - "getopts", - "memchr", - "unicase", -] - -[[package]] -name = "quick-error" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" - -[[package]] -name = "quote" -version = "0.6.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1" -dependencies = [ - "proc-macro2 0.4.30", -] - -[[package]] -name = "quote" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa563d17ecb180e500da1cfd2b028310ac758de548efdd203e18f283af693f37" -dependencies = [ - "proc-macro2 1.0.18", -] - -[[package]] -name = "ramhorns" -version = "0.9.4" -source = "git+https://github.com/maciejhirsz/ramhorns#49af427194beefeb83075f82be157771e3eb4cc8" -dependencies = [ - "ahash", - "arrayvec", - "beef", - "fnv", - "logos", - "pulldown-cmark", - "ramhorns-derive", -] - -[[package]] -name = "ramhorns-derive" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "924203f57d2674133836b9ff263cebd35fcb9ca396c1c1c7190a5c76a927446e" -dependencies = [ - "fnv", - "proc-macro2 1.0.18", - "quote 1.0.7", - "syn 1.0.33", -] - -[[package]] -name = "rand" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" -dependencies = [ - "getrandom", - "libc", - "rand_chacha", - "rand_core", - "rand_hc", -] - -[[package]] -name = "rand_chacha" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -dependencies = [ - "getrandom", -] - -[[package]] -name = "rand_hc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -dependencies = [ - "rand_core", -] - -[[package]] -name = "rayon" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62f02856753d04e03e26929f820d0a0a337ebe71f849801eea335d464b349080" -dependencies = [ - "autocfg", - "crossbeam-deque", - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e92e15d89083484e11353891f1af602cc661426deb9564c298b270c726973280" -dependencies = [ - "crossbeam-deque", - "crossbeam-queue", - "crossbeam-utils", - "lazy_static", - "num_cpus", -] - -[[package]] -name = "redox_syscall" -version = "0.1.56" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84" - -[[package]] -name = "redox_users" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09b23093265f8d200fa7b4c2c76297f47e681c655f6f1285a8780d6a022f7431" -dependencies = [ - "getrandom", - "redox_syscall", - "rust-argon2", -] - -[[package]] -name = "regex" -version = "1.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3780fcf44b193bc4d09f36d2a3c87b251da4a046c87795a0d35f4f927ad8e6" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", - "thread_local", -] - -[[package]] -name = "regex-automata" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae1ded71d66a4a97f5e961fd0cb25a5f366a42a41570d16a763a69c092c26ae4" -dependencies = [ - "byteorder", -] - -[[package]] -name = "regex-syntax" -version = "0.6.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26412eb97c6b088a6997e05f69403a802a92d520de2f8e63c2b65f9e0f47c4e8" - -[[package]] -name = "remove_dir_all" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" -dependencies = [ - "winapi", -] - -[[package]] -name = "ructe" -version = "0.11.5-PRE" -source = "git+https://github.com/kaj/ructe#d93df0a07b5ef297f5255501a9ca7f448ad8b7b8" -dependencies = [ - "base64 0.12.3", - "bytecount", - "itertools 0.9.0", - "md5", - "nom 5.1.2", -] - -[[package]] -name = "rust-argon2" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bc8af4bda8e1ff4932523b94d3dd20ee30a87232323eda55903ffd71d2fb017" -dependencies = [ - "base64 0.11.0", - "blake2b_simd", - "constant_time_eq", - "crossbeam-utils", -] - -[[package]] -name = "rustc_version" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -dependencies = [ - "semver", -] - -[[package]] -name = "ryu" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" - -[[package]] -name = "safemem" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" - -[[package]] -name = "sailfish" -version = "0.2.1" -dependencies = [ - "itoap", - "ryu", - "version_check 0.9.2", -] - -[[package]] -name = "sailfish-compiler" -version = "0.2.1" -dependencies = [ - "home", - "memchr", - "proc-macro2 1.0.18", - "quote 1.0.7", - "syn 1.0.33", - "yaml-rust", -] - -[[package]] -name = "sailfish-macros" -version = "0.2.1" -dependencies = [ - "proc-macro2 1.0.18", - "sailfish-compiler", -] - -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "scoped-tls" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "332ffa32bf586782a3efaeb58f127980944bbc8c4d6913a86107ac2a5ab24b28" - -[[package]] -name = "scopeguard" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" - -[[package]] -name = "semver" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" -dependencies = [ - "semver-parser", -] - -[[package]] -name = "semver-parser" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" - -[[package]] -name = "serde" -version = "1.0.114" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5317f7588f0a5078ee60ef675ef96735a1442132dc645eb1d12c018620ed8cd3" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_cbor" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e18acfa2f90e8b735b2836ab8d538de304cbb6729a7360729ea5a895d15a622" -dependencies = [ - "half", - "serde", -] - -[[package]] -name = "serde_derive" -version = "1.0.114" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0be94b04690fbaed37cddffc5c134bf537c8e3329d53e982fe04c374978f8e" -dependencies = [ - "proc-macro2 1.0.18", - "quote 1.0.7", - "syn 1.0.33", -] - -[[package]] -name = "serde_json" -version = "1.0.56" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3433e879a558dde8b5e8feb2a04899cf34fdde1fafb894687e52105fc1162ac3" -dependencies = [ - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_yaml" -version = "0.8.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae3e2dd40a7cdc18ca80db804b7f461a39bb721160a85c9a1fa30134bf3c02a5" -dependencies = [ - "dtoa", - "linked-hash-map", - "serde", - "yaml-rust", -] - -[[package]] -name = "sha-1" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d94d0bede923b3cea61f3f1ff57ff8cdfd77b400fb8f9998949e0cf04163df" -dependencies = [ - "block-buffer", - "digest", - "fake-simd", - "opaque-debug", -] - -[[package]] -name = "shell-words" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6fa3938c99da4914afedd13bf3d79bcb6c277d1b2c398d23257a304d9e1b074" - -[[package]] -name = "slug" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3bc762e6a4b6c6fcaade73e77f9ebc6991b676f88bb2358bddb56560f073373" -dependencies = [ - "deunicode 0.4.3", -] - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "std_prelude" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8207e78455ffdf55661170876f88daf85356e4edd54e0a3dbc79586ca1e50cbe" - -[[package]] -name = "strsim" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" - -[[package]] -name = "syn" -version = "0.15.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5" -dependencies = [ - "proc-macro2 0.4.30", - "quote 0.6.13", - "unicode-xid 0.1.0", -] - -[[package]] -name = "syn" -version = "1.0.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8d5d96e8cbb005d6959f119f773bfaebb5684296108fb32600c00cde305b2cd" -dependencies = [ - "proc-macro2 1.0.18", - "quote 1.0.7", - "unicode-xid 0.2.1", -] - -[[package]] -name = "syntect" -version = "4.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83b43a6ca1829ccb0c933b615c9ea83ffc8793ae240cecbd15119b13d741161d" -dependencies = [ - "bincode", - "bitflags", - "flate2", - "fnv", - "lazy_static", - "lazycell", - "onig", - "plist", - "regex-syntax", - "serde", - "serde_derive", - "serde_json", - "walkdir", - "yaml-rust", -] - -[[package]] -name = "tempfile" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" -dependencies = [ - "cfg-if", - "libc", - "rand", - "redox_syscall", - "remove_dir_all", - "winapi", -] - -[[package]] -name = "tera" -version = "1.3.1" -source = "git+https://github.com/Keats/tera#5dc12afc4e0e506183898fc56d3bdc9ce6a0b6d7" -dependencies = [ - "chrono", - "chrono-tz", - "globwalk", - "humansize", - "lazy_static", - "percent-encoding 2.1.0", - "pest", - "pest_derive", - "rand", - "regex", - "serde", - "serde_json", - "slug", - "unic-segment", -] - -[[package]] -name = "term_size" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e4129646ca0ed8f45d09b929036bafad5377103edd06e50bf574b353d2b08d9" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "terminal_size" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8038f95fc7a6f351163f4b964af631bd26c9e828f7db085f2a84aca56f70d13b" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "termios" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f0fcee7b24a25675de40d5bb4de6e41b0df07bc9856295e7e2b3a3600c400c2" -dependencies = [ - "libc", -] - -[[package]] -name = "textwrap" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" -dependencies = [ - "term_size", - "unicode-width", -] - -[[package]] -name = "thread_local" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14" -dependencies = [ - "lazy_static", -] - -[[package]] -name = "time" -version = "0.1.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "tinytemplate" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d3dc76004a03cec1c5932bca4cdc2e39aaa798e3f82363dd94f9adf6098c12f" -dependencies = [ - "serde", - "serde_json", -] - -[[package]] -name = "tinyvec" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53953d2d3a5ad81d9f844a32f14ebb121f50b650cd59d0ee2a07cf13c617efed" - -[[package]] -name = "toml" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffc92d160b1eef40665be3a05630d003936a3bc7da7421277846c2613e92c71a" -dependencies = [ - "serde", -] - -[[package]] -name = "toolchain_find" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e458af37ead6107144c2e3bb892f605ddfad20251f12143cda8b9c9072b1ca45" -dependencies = [ - "dirs 1.0.5", - "lazy_static", - "regex", - "semver", - "walkdir", -] - -[[package]] -name = "typenum" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33" - -[[package]] -name = "ucd-trie" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c" - -[[package]] -name = "unic-char-property" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221" -dependencies = [ - "unic-char-range", -] - -[[package]] -name = "unic-char-range" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc" - -[[package]] -name = "unic-common" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc" - -[[package]] -name = "unic-segment" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4ed5d26be57f84f176157270c112ef57b86debac9cd21daaabbe56db0f88f23" -dependencies = [ - "unic-ucd-segment", -] - -[[package]] -name = "unic-ucd-segment" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2079c122a62205b421f499da10f3ee0f7697f012f55b675e002483c73ea34700" -dependencies = [ - "unic-char-property", - "unic-char-range", - "unic-ucd-version", -] - -[[package]] -name = "unic-ucd-version" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4" -dependencies = [ - "unic-common", -] - -[[package]] -name = "unicase" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" -dependencies = [ - "version_check 0.9.2", -] - -[[package]] -name = "unicode-bidi" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" -dependencies = [ - "matches", -] - -[[package]] -name = "unicode-normalization" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fb19cf769fa8c6a80a162df694621ebeb4dafb606470b2b2fce0be40a98a977" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-segmentation" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e83e153d1053cbb5a118eeff7fd5be06ed99153f00dbcd8ae310c5fb2b22edc0" - -[[package]] -name = "unicode-width" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3" - -[[package]] -name = "unicode-xid" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" - -[[package]] -name = "unicode-xid" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" - -[[package]] -name = "url" -version = "1.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" -dependencies = [ - "idna 0.1.5", - "matches", - "percent-encoding 1.0.1", -] - -[[package]] -name = "url" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "829d4a8476c35c9bf0bbce5a3b23f4106f79728039b726d292bb93bc106787cb" -dependencies = [ - "idna 0.2.0", - "matches", - "percent-encoding 2.1.0", -] - -[[package]] -name = "utf8-ranges" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ae116fef2b7fea257ed6440d3cfcff7f190865f170cdad00bb6465bf18ecba" - -[[package]] -name = "v_escape" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32189098aacb5820b08c8cff163c982ff72e88ebd04b6b31944084f57463b774" -dependencies = [ - "bytes", - "v_escape_derive", -] - -[[package]] -name = "v_escape" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b66158ce426982197fd44266d68125fd4000f1d42f5ee33ef02b500b4b6b0024" -dependencies = [ - "buf-min", - "v_escape_derive", -] - -[[package]] -name = "v_escape_derive" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cae7cffca0b1f9af9b20610f6fdeee9ffcce61417b5ad186a5d482dc904e24cd" -dependencies = [ - "nom 4.2.3", - "proc-macro2 1.0.18", - "quote 1.0.7", - "syn 1.0.33", -] - -[[package]] -name = "v_eval" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd8b599d797eb038d0dde9a3860aacb6bbba3bffa4ac64f807c8673820cc9d9" -dependencies = [ - "regex", - "syn 1.0.33", -] - -[[package]] -name = "v_htmlescape" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37981da7d2bd82edc21de370f4d7b010360c8590f70c9f76f5df20e780dc49f2" -dependencies = [ - "cfg-if", - "v_escape 0.11.3", -] - -[[package]] -name = "v_htmlescape" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5fd25529cb2f78527b5ee507bcfb357b26d057b5e480853c26d49a4ead5c629" -dependencies = [ - "cfg-if", - "v_escape 0.12.0", -] - -[[package]] -name = "vcpkg" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6454029bf181f092ad1b853286f23e2c507d8e8194d01d92da4a55c274a5508c" - -[[package]] -name = "vec_map" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" - -[[package]] -name = "version_check" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" - -[[package]] -name = "version_check" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed" - -[[package]] -name = "walkdir" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "777182bc735b6424e1a57516d35ed72cb8019d85c8c9bf536dccb3445c1a2f7d" -dependencies = [ - "same-file", - "winapi", - "winapi-util", -] - -[[package]] -name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" - -[[package]] -name = "wasm-bindgen" -version = "0.2.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a634620115e4a229108b71bde263bb4220c483b3f07f5ba514ee8d15064c4c2" -dependencies = [ - "cfg-if", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e53963b583d18a5aa3aaae4b4c1cb535218246131ba22a71f05b518098571df" -dependencies = [ - "bumpalo", - "lazy_static", - "log", - "proc-macro2 1.0.18", - "quote 1.0.7", - "syn 1.0.33", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fcfd5ef6eec85623b4c6e844293d4516470d8f19cd72d0d12246017eb9060b8" -dependencies = [ - "quote 1.0.7", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9adff9ee0e94b926ca81b57f57f86d5545cdcb1d259e21ec9bdd95b901754c75" -dependencies = [ - "proc-macro2 1.0.18", - "quote 1.0.7", - "syn 1.0.33", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7b90ea6c632dd06fd765d44542e234d5e63d9bb917ecd64d79778a13bd79ae" - -[[package]] -name = "web-sys" -version = "0.3.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "863539788676619aac1a23e2df3655e96b32b0e05eb72ca34ba045ad573c625d" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "wild" -version = "2.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "035793abb854745033f01a07647a79831eba29ec0be377205f2a25b0aa830020" -dependencies = [ - "glob", -] - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-util" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" -dependencies = [ - "winapi", -] - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "xml-rs" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b07db065a5cf61a7e4ba64f29e67db906fb1787316516c4e6e5ff0fea1efcd8a" - -[[package]] -name = "yaml-rust" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39f0c922f1a334134dc2f7a8b67dc5d25f0735263feec974345ff706bcf20b0d" -dependencies = [ - "linked-hash-map", -] - -[[package]] -name = "yansi-term" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe5c30ade05e61656247b2e334a031dfd0cc466fadef865bdcdea8d537951bf1" -dependencies = [ - "winapi", -] - -[[package]] -name = "yarte" -version = "0.12.0" -source = "git+https://github.com/botika/yarte#a39f49d5e2f7826b1be492bca56cd79342369fe3" -dependencies = [ - "buf-min", - "yarte_derive", - "yarte_helpers", -] - -[[package]] -name = "yarte_codegen" -version = "0.12.0" -source = "git+https://github.com/botika/yarte#a39f49d5e2f7826b1be492bca56cd79342369fe3" -dependencies = [ - "proc-macro2 1.0.18", - "quote 1.0.7", - "syn 1.0.33", - "yarte_helpers", - "yarte_hir", -] - -[[package]] -name = "yarte_derive" -version = "0.12.0" -source = "git+https://github.com/botika/yarte#a39f49d5e2f7826b1be492bca56cd79342369fe3" -dependencies = [ - "bat", - "proc-macro2 1.0.18", - "quote 1.0.7", - "syn 1.0.33", - "tempfile", - "toolchain_find", - "yarte_codegen", - "yarte_helpers", - "yarte_hir", - "yarte_parser", -] - -[[package]] -name = "yarte_helpers" -version = "0.12.0" -source = "git+https://github.com/botika/yarte#a39f49d5e2f7826b1be492bca56cd79342369fe3" -dependencies = [ - "buf-min", - "dtoa", - "itoa", - "ryu", - "serde", - "toml", - "v_htmlescape 0.10.0", -] - -[[package]] -name = "yarte_hir" -version = "0.12.0" -source = "git+https://github.com/botika/yarte#a39f49d5e2f7826b1be492bca56cd79342369fe3" -dependencies = [ - "derive_more", - "proc-macro2 1.0.18", - "quote 1.0.7", - "syn 1.0.33", - "v_eval", - "v_htmlescape 0.10.0", - "yarte_helpers", - "yarte_parser", -] - -[[package]] -name = "yarte_parser" -version = "0.12.0" -source = "git+https://github.com/botika/yarte#a39f49d5e2f7826b1be492bca56cd79342369fe3" -dependencies = [ - "annotate-snippets", - "derive_more", - "proc-macro2 1.0.18", - "quote 1.0.7", - "syn 1.0.33", - "unicode-xid 0.2.1", - "yarte_helpers", -] diff --git a/benches/Cargo.toml b/benches/Cargo.toml deleted file mode 100644 index c4da44e..0000000 --- a/benches/Cargo.toml +++ /dev/null @@ -1,35 +0,0 @@ -[package] -name = "benches" -version = "0.2.3" -authors = ["Dirkjan Ochtman ", "Ryohei Machida "] -build = "src/build.rs" -edition = "2018" -publish = false - -[dependencies] -askama = { git = "https://github.com/djc/askama" } -criterion = { version = "0.3", features = ["real_blackbox"] } -fomat-macros = { git = "https://github.com/krdln/fomat-macros" } -handlebars = { git = "https://github.com/sunng87/handlebars-rust" } -horrorshow = { git = "https://github.com/Stebalien/horrorshow-rs" } -liquid = "0.19.0" -markup = { git = "https://github.com/utkarshkukreti/markup.rs" } -maud = "0.21.0" -ramhorns = { git = "https://github.com/maciejhirsz/ramhorns" } -sailfish = { path = "../sailfish" } -sailfish-macros = { path = "../sailfish-macros" } -serde = "1" -serde_derive = "1" -serde_json = "1" -serde_yaml = "0.8" -tera = { git = "https://github.com/Keats/tera" } -v_htmlescape = "0.9.1" -yarte = { git = "https://github.com/botika/yarte", features = ["bytes-buf", "fixed"] } -bytes = "0.5.5" - -[build-dependencies] -ructe = { git = "https://github.com/kaj/ructe" } - -[[bench]] -name = "all" -harness = false diff --git a/benches/README.md b/benches/README.md index 842f1cc..429aa48 100644 --- a/benches/README.md +++ b/benches/README.md @@ -1,48 +1 @@ -# Rust template engine benchmarks - -Performance comparison of template engines for Rust based on [criterion](https://github.com/bheisler/criterion.rs) crate - -## crates - -- [askama](https://github.com/djc/askama): Type-safe, compiled Jinja-like templates for Rust -- [fomat](https://github.com/krdln/fomat-macros): Alternative syntax for printing macros in Rust -- [handlebars](https://github.com/sunng87/handlebars-rust): Handlebars templating language implemented in Rust and for Rust. -- [horrorshow](https://github.com/Stebalien/horrorshow-rs): A macro-based html builder for rust -- [liquid](https://github.com/cobalt-org/liquid-rust): the liquid templating language for Rust -- [markup](https://github.com/utkarshkukreti/markup.rs): A blazing fast, type-safe template engine for Rust. -- [maud](https://github.com/lambda-fairy/maud): Compile-time HTML templates for Rust -- [ramhorns](https://github.com/maciejhirsz/ramhorns): Fast Mustache template engine implementation in pure Rust -- [ructe](https://github.com/kaj/ructe): Rust Compiled Templates with static-file handling -- [std::write!](https://doc.rust-lang.org/std/macro.write.html): the std library `write!` macro -- [tera](https://github.com/Keats/tera): A template engine for Rust based on Jinja2/Django -- [yarte](https://github.com/botika/yarte): Yet Another Rust Template Engine, is the fastest template engine -- [sailfish](https://github.com/Kogia-sima/sailfish): Simple, small, and extremely fast template engine for Rust - -## Running the benchmarks - -```console -$ cargo bench -``` - -## Environment - -- OS: Ubuntu 20.04 LTS -- CPU Model Name: Intel(R) Core(TM) i5-8265U CPU @ 1.60GHz -- BogoMIPS: 3600.00 - -## Results - -- Big table - -![Big table](./bigtable.png) - -- Teams - -![Teams](./teams.png) - -## License - -Copyright (c) 2020 Dirkjan Ochtman and Ryohei Machida - -This benchmark code is distributed under the special permission granted by [Dirkjan Ochtman](https://github.com/djc) (See [this issue](https://github.com/djc/template-benchmarks-rs/issues/26)). -**You cannot modify or redistribute the source code without an explicit permission**. +benchmark programs were removed in favor of https://github.com/djc/template-benchmarks-rs diff --git a/benches/benches/all.rs b/benches/benches/all.rs deleted file mode 100644 index d7a6439..0000000 --- a/benches/benches/all.rs +++ /dev/null @@ -1,48 +0,0 @@ -use benches::{ - askama_bench, fomat, handlebars, horrorshow_bench, liquid, markup_bench, maud_bench, - ramhorns, ructe, sailfish, std_write, tera, yarte_bench, yarte_bytes, yarte_fixed, -}; -use criterion::{criterion_group, criterion_main, Criterion}; - -fn big_table(c: &mut Criterion) { - let mut g = c.benchmark_group("Big table"); - g.bench_function("Askama", |b| askama_bench::big_table(b, &100)); - g.bench_function("fomat", |b| fomat::big_table(b, &100)); - g.bench_function("Handlebars", |b| handlebars::big_table(b, &100)); - g.bench_function("Horrorshow", |b| horrorshow_bench::big_table(b, &100)); - g.bench_function("Liquid", |b| liquid::big_table(b, &100)); - g.bench_function("Markup", |b| markup_bench::big_table(b, &100)); - g.bench_function("Maud", |b| maud_bench::big_table(b, &100)); - g.bench_function("Ramhorns", |b| ramhorns::big_table(b, &100)); - g.bench_function("Ructe", |b| ructe::big_table(b, &100)); - g.bench_function("Sailfish", |b| sailfish::big_table(b, &100)); - g.bench_function("Tera", |b| tera::big_table(b, &100)); - g.bench_function("Yarte", |b| yarte_bench::big_table(b, &100)); - g.bench_function("Yarte Send", |b| yarte_bytes::big_table(b, &100)); - g.bench_function("Yarte ?Send", |b| yarte_fixed::big_table(b, &100)); - g.bench_function("write", |b| std_write::big_table(b, &100)); - g.finish(); -} - -fn teams(c: &mut Criterion) { - let mut g = c.benchmark_group("Teams"); - g.bench_function("Askama", |b| askama_bench::teams(b, &0)); - g.bench_function("fomat", |b| fomat::teams(b, &0)); - g.bench_function("Handlebars", |b| handlebars::teams(b, &0)); - g.bench_function("Horrorshow", |b| horrorshow_bench::teams(b, &0)); - g.bench_function("Liquid", |b| liquid::teams(b, &0)); - g.bench_function("Markup", |b| markup_bench::teams(b, &0)); - g.bench_function("Maud", |b| maud_bench::teams(b, &0)); - g.bench_function("Ramhorns", |b| ramhorns::teams(b)); - g.bench_function("Ructe", |b| ructe::teams(b, &0)); - g.bench_function("Sailfish", |b| sailfish::teams(b)); - g.bench_function("Tera", |b| tera::teams(b, &0)); - g.bench_function("Yarte", |b| yarte_bench::teams(b)); - g.bench_function("Yarte Send", |b| yarte_bytes::teams(b)); - g.bench_function("Yarte ?Send", |b| yarte_fixed::teams(b)); - g.bench_function("write", |b| std_write::teams(b, &0)); - g.finish(); -} - -criterion_group!(benches, big_table, teams); -criterion_main!(benches); diff --git a/benches/bigtable.png b/benches/bigtable.png deleted file mode 100644 index f7d76dce94cafed8565ed7064e408586d35c3fd0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46540 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 BfM@^! diff --git a/benches/src/askama_bench.rs b/benches/src/askama_bench.rs deleted file mode 100644 index fd51f81..0000000 --- a/benches/src/askama_bench.rs +++ /dev/null @@ -1,58 +0,0 @@ -use askama::Template; -use criterion; - -pub fn big_table(b: &mut criterion::Bencher<'_>, size: &usize) { - let mut table = Vec::with_capacity(*size); - for _ in 0..*size { - let mut inner = Vec::with_capacity(*size); - for i in 0..*size { - inner.push(i); - } - table.push(inner); - } - let ctx = BigTable { table }; - b.iter(|| ctx.render().unwrap()); -} - -#[derive(Template)] -#[template(path = "big-table.html")] -struct BigTable { - table: Vec>, -} - -pub fn teams(b: &mut criterion::Bencher<'_>, _: &usize) { - let teams = Teams { - year: 2015, - teams: vec![ - Team { - name: "Jiangsu".into(), - score: 43, - }, - Team { - name: "Beijing".into(), - score: 27, - }, - Team { - name: "Guangzhou".into(), - score: 22, - }, - Team { - name: "Shandong".into(), - score: 12, - }, - ], - }; - b.iter(|| teams.render().unwrap()); -} - -#[derive(Template)] -#[template(path = "teams.html")] -struct Teams { - year: u16, - teams: Vec, -} - -struct Team { - name: String, - score: u8, -} diff --git a/benches/src/build.rs b/benches/src/build.rs deleted file mode 100644 index ade7fb1..0000000 --- a/benches/src/build.rs +++ /dev/null @@ -1,11 +0,0 @@ -use ructe::Ructe; -use std::env; -use std::path::PathBuf; - -fn main() { - let in_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap()).join("templates_ructe"); - Ructe::from_env() - .unwrap() - .compile_templates(&in_dir) - .expect("compile templates"); -} diff --git a/benches/src/fomat.rs b/benches/src/fomat.rs deleted file mode 100644 index c1c72df..0000000 --- a/benches/src/fomat.rs +++ /dev/null @@ -1,76 +0,0 @@ -use criterion; -use fomat_macros::fomat; - -pub fn big_table(b: &mut criterion::Bencher<'_>, size: &usize) { - let mut table = Vec::with_capacity(*size); - for _ in 0..*size { - let mut inner = Vec::with_capacity(*size); - for i in 0..*size { - inner.push(i); - } - table.push(inner); - } - b.iter(|| { - fomat!( - "\n" - for r1 in &table { - "\n" - for r2 in r1 { "" } - "\n\n" - } - "
"(r2)"
" - ) - }); -} - -pub fn teams(b: &mut criterion::Bencher<'_>, _: &usize) { - let teams = Teams { - year: 2015, - teams: vec![ - Team { - name: "Jiangsu".into(), - score: 43, - }, - Team { - name: "Beijing".into(), - score: 27, - }, - Team { - name: "Guangzhou".into(), - score: 22, - }, - Team { - name: "Shandong".into(), - score: 12, - }, - ], - }; - b.iter(|| { - fomat!( -" - - "(teams.year)" - - -

CSL "(teams.year)"

-
    " - for (i,team) in (&teams).teams.iter().enumerate() { - "
  • \n" - " "(team.name)": "(team.score)"\n" - "
  • \n" - } -"\n
- -") - }); -} - -struct Teams { - year: u16, - teams: Vec, -} - -struct Team { - name: String, - score: u8, -} diff --git a/benches/src/handlebars.rs b/benches/src/handlebars.rs deleted file mode 100644 index 26289da..0000000 --- a/benches/src/handlebars.rs +++ /dev/null @@ -1,89 +0,0 @@ -use std::collections::BTreeMap; - -use ::handlebars::{to_json, Handlebars}; -use criterion; -use serde::Serialize; -use serde_json; -use serde_json::value::Value as Json; - -pub fn big_table(b: &mut criterion::Bencher<'_>, size: &usize) { - let mut table = Vec::with_capacity(*size); - for _ in 0..*size { - let mut inner = Vec::with_capacity(*size); - for i in 0..*size { - inner.push(i); - } - table.push(inner); - } - - let ctx = BigTable { table }; - let mut handlebars = Handlebars::new(); - handlebars - .register_template_string("big-table.html", SOURCE) - .unwrap(); - b.iter(|| handlebars.render("big-table.html", &ctx).ok().unwrap()); -} - -#[derive(Serialize)] -struct BigTable { - table: Vec>, -} - -static SOURCE: &'static str = " - {{#each table as |n|}} - {{#each n as |v|}}{{v}}{{/each}} - {{/each}} -"; - -pub fn teams(b: &mut criterion::Bencher<'_>, _: &usize) { - let mut handlebars = Handlebars::new(); - handlebars - .register_template_string("table", TEAMS_TEMPLATE) - .ok() - .expect("Invalid template format"); - - let data = teams_data(); - b.iter(|| handlebars.render("table", &data).ok().unwrap()) -} - -fn teams_data() -> BTreeMap { - let mut data = BTreeMap::new(); - - data.insert("year".to_string(), to_json(&"2015".to_owned())); - - let mut teams = Vec::new(); - - for v in vec![ - ("Jiangsu", 43u16), - ("Beijing", 27u16), - ("Guangzhou", 22u16), - ("Shandong", 12u16), - ] - .iter() - { - let (name, score) = *v; - let mut t = BTreeMap::new(); - t.insert("name".to_string(), to_json(&name)); - t.insert("score".to_string(), to_json(&score)); - teams.push(t) - } - - data.insert("teams".to_string(), to_json(&teams)); - data -} - -static TEAMS_TEMPLATE: &'static str = " - - {{year}} - - -

CSL {{year}}

-
    - {{#each teams}} -
  • - {{name}}: {{score}} -
  • - {{/each}} -
- -"; diff --git a/benches/src/horrorshow_bench.rs b/benches/src/horrorshow_bench.rs deleted file mode 100644 index bfb66b8..0000000 --- a/benches/src/horrorshow_bench.rs +++ /dev/null @@ -1,92 +0,0 @@ -use criterion; -use horrorshow::html; -use horrorshow::prelude::*; -use horrorshow::Error; - -pub fn big_table(b: &mut criterion::Bencher<'_>, size: &usize) { - let mut table = Vec::with_capacity(*size); - for _ in 0..*size { - let mut inner = Vec::with_capacity(*size); - for i in 0..*size { - inner.push(i); - } - table.push(inner); - } - b.iter(|| big_table_render(&table).unwrap()); -} - -fn big_table_render(table: &Vec>) -> Result { - let page = html! { - table { - @ for row in table { - tr { - @ for col in row { - td { : col } - } - } - } - } - }; - page.into_string() -} - -pub fn teams(b: &mut criterion::Bencher<'_>, _: &usize) { - let teams = Teams { - year: 2015, - teams: vec![ - Team { - name: "Jiangsu".into(), - score: 43, - }, - Team { - name: "Beijing".into(), - score: 27, - }, - Team { - name: "Guangzhou".into(), - score: 22, - }, - Team { - name: "Shandong".into(), - score: 12, - }, - ], - }; - - b.iter(|| teams_render(&teams).unwrap()); -} - -fn teams_render(teams: &Teams) -> Result { - let page = html! { - html { - head { - title { : teams.year } - } - body { - h1 { : Raw("CSL "); - : teams.year - } - ul { - @ for (idx, team) in teams.teams.iter().enumerate() { - li(class? = if idx == 0 { Some(Raw("champion")) } else { None }) { - b { : &team.name } - : Raw(": "); - : team.score - } - } - } - } - } - }; - page.into_string() -} - -struct Teams { - year: u16, - teams: Vec, -} - -struct Team { - name: String, - score: u8, -} diff --git a/benches/src/lib.rs b/benches/src/lib.rs deleted file mode 100644 index 7cf17ce..0000000 --- a/benches/src/lib.rs +++ /dev/null @@ -1,19 +0,0 @@ -#![feature(proc_macro_hygiene)] - -pub mod askama_bench; -pub mod fomat; -pub mod handlebars; -pub mod horrorshow_bench; -pub mod liquid; -pub mod markup_bench; -pub mod maud_bench; -pub mod ramhorns; -pub mod ructe; -pub mod sailfish; -pub mod std_write; -pub mod tera; -pub mod yarte_bench; -pub mod yarte_bytes; -pub mod yarte_fixed; - -include!(concat!(env!("OUT_DIR"), "/templates.rs")); diff --git a/benches/src/liquid.rs b/benches/src/liquid.rs deleted file mode 100644 index 1687b89..0000000 --- a/benches/src/liquid.rs +++ /dev/null @@ -1,75 +0,0 @@ -use ::liquid::{ - value::{Object, Value}, - ParserBuilder, -}; -use criterion; -use serde_yaml; - -pub fn big_table(b: &mut criterion::Bencher<'_>, size: &usize) { - let mut table = Vec::with_capacity(*size); - for _ in 0..*size { - let mut inner = Vec::with_capacity(*size); - for i in 0..*size { - inner.push(Value::Scalar((i as i32).into())); - } - table.push(Value::Array(inner)); - } - - let template = ParserBuilder::with_liquid() - .build() - .unwrap() - .parse( - " -{% for row in table %} -{% for col in row %}{% endfor %} -{% endfor %} -
{{ col|escape }}
", - ) - .unwrap(); - - let mut globals = Object::new(); - globals.insert("table".into(), Value::Array(table)); - - b.iter(|| template.render(&globals)); -} - -pub fn teams(b: &mut criterion::Bencher<'_>, _: &usize) { - let parser = ParserBuilder::with_liquid() - .extra_filters() - .build() - .unwrap(); - let template = parser.parse(TEAMS_TEMPLATE).unwrap(); - - let data: Object = self::serde_yaml::from_str(TEAMS_DATA).unwrap(); - - b.iter(|| template.render(&data)); -} - -static TEAMS_TEMPLATE: &'static str = " - - {{year}} - - -

CSL {{year}}

-
    - {% for team in teams %} -
  • - {{team.name}}: {{team.score}} -
  • - {% endfor %} -
- -"; - -static TEAMS_DATA: &'static str = " -year: 2015 -teams: - - name: Jiangsu - score: 43 - - name: Beijing - score: 27 - - name: Guangzhou - score: 22 - - name: Shandong - score: 12 -"; diff --git a/benches/src/markup_bench.rs b/benches/src/markup_bench.rs deleted file mode 100644 index a9c9c23..0000000 --- a/benches/src/markup_bench.rs +++ /dev/null @@ -1,83 +0,0 @@ -use criterion; -use markup::define; - -// TODO: Switch to `markup::define!` when upgrading to Rust 2018. -define! { - BigTable<'a>(table: &'a [Vec]) { - table { - @for r1 in table.iter() { - tr { - @for r2 in r1.iter() { - td { {*r2} } - } - } - } - } - } -} - -pub fn big_table(b: &mut criterion::Bencher<'_>, size: &usize) { - let mut table = Vec::with_capacity(*size); - for _ in 0..*size { - let mut inner = Vec::with_capacity(*size); - for i in 0..*size { - inner.push(i); - } - table.push(inner); - } - b.iter(|| BigTable { table: &table }.to_string()); -} - -pub struct Team { - name: String, - score: u8, -} - -define! { - Teams<'a>(year: u32, teams: &'a [Team]) { - html { - head { - title { {year} } - } - body { - h1 { "CSL " {year} } - ul { - @for (index, team) in teams.iter().enumerate() { - li.{if index == 0 { Some("champion") } else { None }} { - b { {team.name} } ": " {team.score} - } - } - } - } - } - } -} - -pub fn teams(b: &mut criterion::Bencher<'_>, _: &usize) { - let year = 2015; - let teams = vec![ - Team { - name: "Jiangsu".into(), - score: 43, - }, - Team { - name: "Beijing".into(), - score: 27, - }, - Team { - name: "Guangzhou".into(), - score: 22, - }, - Team { - name: "Shandong".into(), - score: 12, - }, - ]; - b.iter(|| { - Teams { - year, - teams: &teams, - } - .to_string() - }); -} diff --git a/benches/src/maud_bench.rs b/benches/src/maud_bench.rs deleted file mode 100644 index 464197f..0000000 --- a/benches/src/maud_bench.rs +++ /dev/null @@ -1,92 +0,0 @@ -use criterion; - -use maud::html; - -pub fn big_table(b: &mut criterion::Bencher, size: &usize) { - let mut table = Vec::with_capacity(*size); - for _ in 0..*size { - let mut inner = Vec::with_capacity(*size); - for i in 0..*size { - inner.push(i); - } - table.push(inner); - } - b.iter(|| big_table_render(&table)); -} - -fn big_table_render(table: &Vec>) -> String { - let page = html! { - table { - @for row in table { - tr { - @for col in row { - td { (col) } - } - } - } - } - }; - page.into_string() -} - -pub fn teams(b: &mut criterion::Bencher, _: &usize) { - let teams = Teams { - year: 2015, - teams: vec![ - Team { - name: "Jiangsu".into(), - score: 43, - }, - Team { - name: "Beijing".into(), - score: 27, - }, - Team { - name: "Guangzhou".into(), - score: 22, - }, - Team { - name: "Shandong".into(), - score: 12, - }, - ], - }; - - b.iter(|| teams_render(&teams)); -} - -fn teams_render(teams: &Teams) -> String { - let page = html! { - html { - head { - title { (teams.year) } - } - body { - h1 { - "CSL " - (teams.year) - } - ul { - @for (idx, team) in teams.teams.iter().enumerate() { - li.champion[idx == 0] { - b { (&team.name) } - ": " - (team.score) - } - } - } - } - } - }; - page.into_string() -} - -struct Teams { - year: u16, - teams: Vec, -} - -struct Team { - name: String, - score: u8, -} diff --git a/benches/src/ramhorns.rs b/benches/src/ramhorns.rs deleted file mode 100644 index d6c907d..0000000 --- a/benches/src/ramhorns.rs +++ /dev/null @@ -1,89 +0,0 @@ -use ramhorns::{Template, Content}; - -pub fn big_table(b: &mut criterion::Bencher<'_>, size: &usize) { - let mut table = Vec::with_capacity(*size); - for _ in 0..*size { - let mut inner = Vec::with_capacity(*size); - for i in 0..*size { - inner.push(i); - } - table.push(inner); - } - let tpl = Template::new(SOURCE).unwrap(); - let ctx = BigTable { table }; - b.iter(|| { - tpl.render(&ctx) - }); -} - -#[derive(Content)] -struct BigTable { - table: Vec>, -} - -static SOURCE: &'static str = " - {{#table}} - {{#.}}{{.}}{{/.}} - {{/table}} -"; - -pub fn teams(b: &mut criterion::Bencher<'_>) { - let tpl = Template::new(TEAMS_TEMPLATE).unwrap(); - let teams = Teams { - year: 2015, - teams: vec![ - Team { - name: "Jiangsu".into(), - class: "champion".into(), - score: 43, - }, - Team { - name: "Beijing".into(), - class: String::new(), - score: 27, - }, - Team { - name: "Guangzhou".into(), - class: String::new(), - score: 22, - }, - Team { - name: "Shandong".into(), - class: String::new(), - score: 12, - }, - ], - }; - b.iter(|| { - tpl.render(&teams) - }); -} - -#[derive(Content)] -struct Teams { - year: u16, - teams: Vec, -} - -#[derive(Content)] -struct Team { - name: String, - class: String, - score: u8, -} - -static TEAMS_TEMPLATE: &'static str = " - - {{year}} - - -

CSL {{year}}

-
    - {{#teams}} -
  • - {{name}}: {{score}} -
  • - {{/teams}} -
- -"; diff --git a/benches/src/ructe.rs b/benches/src/ructe.rs deleted file mode 100644 index 18ea207..0000000 --- a/benches/src/ructe.rs +++ /dev/null @@ -1,48 +0,0 @@ -use crate::templates; -use criterion; - -pub fn big_table(b: &mut criterion::Bencher<'_>, size: &usize) { - let mut table = Vec::with_capacity(*size); - for _ in 0..*size { - let mut inner = Vec::with_capacity(*size); - for i in 0..*size { - inner.push(i); - } - table.push(inner); - } - b.iter(|| { - let mut buf = Vec::new(); - templates::big_table(&mut buf, &table).unwrap(); - }); -} - -pub fn teams(b: &mut criterion::Bencher<'_>, _: &usize) { - let year = 2015; - let teams = vec![ - Team { - name: "Jiangsu".into(), - score: 43, - }, - Team { - name: "Beijing".into(), - score: 27, - }, - Team { - name: "Guangzhou".into(), - score: 22, - }, - Team { - name: "Shandong".into(), - score: 12, - }, - ]; - b.iter(|| { - let mut buf = Vec::new(); - templates::teams(&mut buf, year, &teams).unwrap(); - }); -} - -pub struct Team { - pub name: String, - pub score: u8, -} diff --git a/benches/src/sailfish.rs b/benches/src/sailfish.rs deleted file mode 100644 index 366816f..0000000 --- a/benches/src/sailfish.rs +++ /dev/null @@ -1,73 +0,0 @@ -use sailfish::TemplateOnce; - -pub fn big_table(b: &mut criterion::Bencher<'_>, size: &usize) { - let mut table = Vec::with_capacity(*size); - for _ in 0..*size { - let mut inner = Vec::with_capacity(*size); - for i in 0..*size { - inner.push(i); - } - table.push(inner); - } - b.iter(|| { - let ctx = BigTable { table: &table }; - ctx.render_once().unwrap() - }); -} - -pub fn teams(b: &mut criterion::Bencher<'_>) { - let teams = Teams { - year: 2015, - teams: vec![ - Team { - name: "Jiangsu".into(), - - score: 43, - }, - Team { - name: "Beijing".into(), - score: 27, - }, - Team { - name: "Guangzhou".into(), - score: 22, - }, - Team { - name: "Shandong".into(), - score: 12, - }, - ], - }; - b.iter(|| { - let teams = TeamsTemplate { - year: teams.year, - teams: &teams.teams, - }; - teams.render_once().unwrap() - }); -} - -#[derive(TemplateOnce)] -#[template(path = "big-table.stpl")] -#[template(rm_whitespace = true)] -struct BigTable<'a> { - table: &'a [Vec], -} - -#[derive(TemplateOnce)] -#[template(path = "teams.stpl")] -#[template(rm_whitespace = true)] -struct TeamsTemplate<'a> { - year: u16, - teams: &'a [Team], -} - -struct Teams { - year: u16, - teams: Vec, -} - -struct Team { - name: String, - score: u8, -} diff --git a/benches/src/std_write.rs b/benches/src/std_write.rs deleted file mode 100644 index bc3b112..0000000 --- a/benches/src/std_write.rs +++ /dev/null @@ -1,97 +0,0 @@ -use std::io::Write; -use v_htmlescape::escape; - -use criterion; - -pub fn big_table(b: &mut criterion::Bencher<'_>, size: &usize) { - let mut table = Vec::with_capacity(*size); - for _ in 0..*size { - let mut inner = Vec::with_capacity(*size); - for i in 0..*size { - inner.push(i); - } - table.push(inner); - } - b.iter(|| { - let mut output = Vec::new(); - write!(&mut output, "").unwrap(); - for r1 in &table { - write!(&mut output, "\n").unwrap(); - for r2 in r1 { - write!(&mut output, "", col = r2).unwrap(); - } - write!(&mut output, "\n").unwrap(); - } - write!(&mut output, "
{col}
").unwrap(); - output - }); -} - -pub fn teams(b: &mut criterion::Bencher<'_>, _: &usize) { - let teams = Teams { - year: 2015, - teams: vec![ - Team { - name: "Jiangsu".into(), - score: 43, - }, - Team { - name: "Beijing".into(), - score: 27, - }, - Team { - name: "Guangzhou".into(), - score: 22, - }, - Team { - name: "Shandong".into(), - score: 12, - }, - ], - }; - b.iter(|| { - let mut output = Vec::new(); - write!( - &mut output, - " - - {year} - - -

CSL {year}

-
    ", - year = teams.year - ) - .unwrap(); - for (i, team) in (&teams).teams.iter().enumerate() { - let champion = if i != 0 { "" } else { "champion" }; - write!( - &mut output, - "
  • - {name}: {score}", - champion = escape(champion), - name = escape(&team.name), - score = team.score - ) - .unwrap(); - } - write!( - &mut output, - "
- - " - ) - .unwrap(); - output - }); -} - -struct Teams { - year: u16, - teams: Vec, -} - -struct Team { - name: String, - score: u8, -} diff --git a/benches/src/tera.rs b/benches/src/tera.rs deleted file mode 100644 index 7c7c7f1..0000000 --- a/benches/src/tera.rs +++ /dev/null @@ -1,84 +0,0 @@ -use ::tera::{Context, Tera}; -use criterion; -use serde::Serialize; - -pub fn big_table(b: &mut criterion::Bencher<'_>, size: &usize) { - let mut table = Vec::with_capacity(*size); - for _ in 0..*size { - let mut inner = Vec::with_capacity(*size); - for i in 0..*size { - inner.push(i); - } - table.push(inner); - } - - let mut tera = Tera::default(); - tera.add_raw_templates(vec![("big-table.html", BIG_TABLE_TEMPLATE)]) - .unwrap(); - let mut ctx = Context::new(); - ctx.insert("table", &table); - - let _ = tera.render("big-table.html", &ctx).unwrap(); - b.iter(|| tera.render("big-table.html", &ctx)); -} - -#[derive(Serialize)] -struct Team { - name: String, - score: u8, -} - -// Tera doesn't allow `escape` on number values -static BIG_TABLE_TEMPLATE: &'static str = " -{% for row in table %} -{% for col in row %}{% endfor %} -{% endfor %} -
{{ col }}
"; - -pub fn teams(b: &mut criterion::Bencher<'_>, _: &usize) { - let mut tera = Tera::default(); - tera.add_raw_templates(vec![("teams.html", TEAMS_TEMPLATE)]) - .unwrap(); - let mut ctx = Context::new(); - ctx.insert("year", &2015); - ctx.insert( - "teams", - &vec![ - Team { - name: "Jiangsu".into(), - score: 43, - }, - Team { - name: "Beijing".into(), - score: 27, - }, - Team { - name: "Guangzhou".into(), - score: 22, - }, - Team { - name: "Shandong".into(), - score: 12, - }, - ], - ); - - let _ = tera.render("teams.html", &ctx).unwrap(); - b.iter(|| tera.render("teams.html", &ctx)); -} - -static TEAMS_TEMPLATE: &'static str = " - - {{ year }} - - -

CSL {{ year }}

-
    - {% for team in teams %} -
  • - {{team.name}}: {{team.score}} -
  • - {% endfor %} -
- -"; diff --git a/benches/src/yarte_bench.rs b/benches/src/yarte_bench.rs deleted file mode 100644 index 6678268..0000000 --- a/benches/src/yarte_bench.rs +++ /dev/null @@ -1,58 +0,0 @@ -use yarte::Template; - -pub fn big_table(b: &mut criterion::Bencher<'_>, size: &usize) { - let mut table = Vec::with_capacity(*size); - for _ in 0..*size { - let mut inner = Vec::with_capacity(*size); - for i in 0..*size { - inner.push(i); - } - table.push(inner); - } - let ctx = BigTable { table }; - b.iter(|| ctx.call().unwrap()); -} - -#[derive(Template)] -#[template(path = "big-table.hbs")] -struct BigTable { - table: Vec>, -} - -pub fn teams(b: &mut criterion::Bencher<'_>) { - let teams = Teams { - year: 2015, - teams: vec![ - Team { - name: "Jiangsu".into(), - - score: 43, - }, - Team { - name: "Beijing".into(), - score: 27, - }, - Team { - name: "Guangzhou".into(), - score: 22, - }, - Team { - name: "Shandong".into(), - score: 12, - }, - ], - }; - b.iter(|| teams.call().unwrap()); -} - -#[derive(Template)] -#[template(path = "teams.hbs")] -struct Teams { - year: u16, - teams: Vec, -} - -struct Team { - name: String, - score: u8, -} diff --git a/benches/src/yarte_bytes.rs b/benches/src/yarte_bytes.rs deleted file mode 100644 index 87bf921..0000000 --- a/benches/src/yarte_bytes.rs +++ /dev/null @@ -1,59 +0,0 @@ -use bytes::BytesMut; -use yarte::TemplateBytes; - -pub fn big_table(b: &mut criterion::Bencher<'_>, size: &usize) { - let mut table = Vec::with_capacity(*size); - for _ in 0..*size { - let mut inner = Vec::with_capacity(*size); - for i in 0..*size { - inner.push(i); - } - table.push(inner); - } - let t = BigTable { table }; - b.iter(|| t.call::(109915)); -} - -#[derive(TemplateBytes)] -#[template(path = "big-table")] -struct BigTable { - table: Vec>, -} - -pub fn teams(b: &mut criterion::Bencher<'_>) { - let t = Teams { - year: 2015, - teams: vec![ - Team { - name: "Jiangsu".into(), - - score: 43, - }, - Team { - name: "Beijing".into(), - score: 27, - }, - Team { - name: "Guangzhou".into(), - score: 22, - }, - Team { - name: "Shandong".into(), - score: 12, - }, - ], - }; - b.iter(|| t.call::(239)); -} - -#[derive(TemplateBytes)] -#[template(path = "teams")] -struct Teams { - year: u16, - teams: Vec, -} - -struct Team { - name: String, - score: u8, -} diff --git a/benches/src/yarte_fixed.rs b/benches/src/yarte_fixed.rs deleted file mode 100644 index c733c78..0000000 --- a/benches/src/yarte_fixed.rs +++ /dev/null @@ -1,64 +0,0 @@ -use criterion::black_box; -use std::mem::MaybeUninit; -use yarte::TemplateFixed; - -pub fn big_table(b: &mut criterion::Bencher<'_>, size: &usize) { - let mut table = Vec::with_capacity(*size); - for _ in 0..*size { - let mut inner = Vec::with_capacity(*size); - for i in 0..*size { - inner.push(i); - } - table.push(inner); - } - let t = BigTable { table }; - b.iter(|| { - black_box(unsafe { t.call(&mut [MaybeUninit::uninit(); 109915]) }.unwrap()); - }); -} - -#[derive(TemplateFixed)] -#[template(path = "big-table")] -struct BigTable { - table: Vec>, -} - -pub fn teams(b: &mut criterion::Bencher<'_>) { - let t = Teams { - year: 2015, - teams: vec![ - Team { - name: "Jiangsu".into(), - - score: 43, - }, - Team { - name: "Beijing".into(), - score: 27, - }, - Team { - name: "Guangzhou".into(), - score: 22, - }, - Team { - name: "Shandong".into(), - score: 12, - }, - ], - }; - b.iter(|| { - black_box(unsafe { t.call(&mut [MaybeUninit::uninit(); 239]) }.unwrap()); - }); -} - -#[derive(TemplateFixed)] -#[template(path = "teams")] -struct Teams { - year: u16, - teams: Vec, -} - -struct Team { - name: String, - score: u8, -} diff --git a/benches/teams.png b/benches/teams.png deleted file mode 100644 index 7ec8ab0b847b6132182169528d133220ec43dad0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56122 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 table}}{{#each this}}{{ this }}{{/each }}{{/each }} diff --git a/benches/templates/big-table.html b/benches/templates/big-table.html deleted file mode 100644 index 2fbfce4..0000000 --- a/benches/templates/big-table.html +++ /dev/null @@ -1,5 +0,0 @@ - -{% for row in table %} -{% for col in row %}{% endfor %} -{% endfor %} -
{{ col|escape }}
diff --git a/benches/templates/big-table.stpl b/benches/templates/big-table.stpl deleted file mode 100644 index 52c442f..0000000 --- a/benches/templates/big-table.stpl +++ /dev/null @@ -1,3 +0,0 @@ - - <% for row in table { %><% for col in row { %><% } %><% } %> -
<%= *col %>
diff --git a/benches/templates/teams.hbs b/benches/templates/teams.hbs deleted file mode 100644 index 5bc3f3b..0000000 --- a/benches/templates/teams.hbs +++ /dev/null @@ -1 +0,0 @@ -{{ year }}

CSL {{ year }}

    {{#each teams }}
  • {{ name }}: {{ score }}
  • {{/each }}
diff --git a/benches/templates/teams.html b/benches/templates/teams.html deleted file mode 100644 index cbeaec9..0000000 --- a/benches/templates/teams.html +++ /dev/null @@ -1,15 +0,0 @@ - - - {{ year }} - - -

CSL {{ year }}

-
    - {% for team in teams %} -
  • - {{ team.name }}: {{ team.score }} -
  • - {% endfor %} -
- - diff --git a/benches/templates/teams.stpl b/benches/templates/teams.stpl deleted file mode 100644 index 33cce92..0000000 --- a/benches/templates/teams.stpl +++ /dev/null @@ -1,11 +0,0 @@ - - - <%= year %> - - -

CSL <%= year %>

-
    - <% for (i, team) in teams.iter().enumerate() { %>
  • <%= team.name %>: <%= team.score %>
  • <% } %> -
- - diff --git a/benches/templates_ructe/big_table.rs.html b/benches/templates_ructe/big_table.rs.html deleted file mode 100644 index 99882a2..0000000 --- a/benches/templates_ructe/big_table.rs.html +++ /dev/null @@ -1,11 +0,0 @@ -@(table: &Vec>) - - -@for row in table{ - - @for col in row { - - } - -} -
@col
diff --git a/benches/templates_ructe/teams.rs.html b/benches/templates_ructe/teams.rs.html deleted file mode 100644 index cd544b1..0000000 --- a/benches/templates_ructe/teams.rs.html +++ /dev/null @@ -1,18 +0,0 @@ -@use crate::ructe::Team; -@(year: u16, teams: &Vec) - - - - @year - - -

CSL @year

-
    - @for (i, team) in teams.iter().enumerate(){ -
  • - @team.name: @team.score -
  • - } -
- -