From 357f98907b381c3c4365075e1f76a4f6f62a7956 Mon Sep 17 00:00:00 2001 From: Matt Wilson Date: Fri, 11 Sep 2026 05:02:57 +1000 Subject: [PATCH 01/11] core(support files): .gitattributes .gitignore .vscode/settings.json --- .gitattributes | 70 ++++++++++++++++++++++++++++++++++++++++--- .gitignore | 52 ++++++++++++++++++++++++++++++-- .vimrc | 32 ++++++++++---------- .vscode/settings.json | 24 ++++++++++----- 4 files changed, 148 insertions(+), 30 deletions(-) diff --git a/.gitattributes b/.gitattributes index a74c4ff..5a8705b 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,6 +1,68 @@ +# .gitattributes — Rust (GitHub-hosted) +# +# Sources: GitHub Docs (line endings), git-scm gitattributes (diff=rust), +# gitattributes/gitattributes Rust.gitattributes + Common.gitattributes, +# github-linguist overrides. -*.rs linguist-language=Rust +# Default: detect text, normalize to LF in the repository +* text=auto -*.html linguist-detectable=false -*.sh linguist-detectable=false -*.vimrc linguist-detectable=false +# --- Source --- +*.rs text eol=lf diff=rust +*.toml text +Cargo.lock text +Cargo.toml text +rust-toolchain text +rust-toolchain.toml text + +# --- Scripts --- +*.bash text eol=lf +*.bat text eol=crlf +*.cmd text eol=crlf +*.ps1 text eol=crlf +*.sh text eol=lf +*.zsh text eol=lf + +# --- Docs / meta --- +*.adoc text +*.markdown text diff=markdown +*.md text diff=markdown +*.txt text +AUTHORS text +CHANGELOG text +CHANGES text +CONTRIBUTING text +COPYING text +LICENSE text +NEWS text +README text +TODO text +.gitattributes text +.gitignore text + +# --- Serialisation --- +*.json text +*.xml text +*.yaml text +*.yml text + +# --- Binary --- +*.a binary +*.dll binary +*.dylib binary +*.exe binary +*.rlib binary +*.so binary + +# --- Archives / images (common) --- +*.gif binary +*.gz binary +*.ico binary +*.jpeg binary +*.jpg binary +*.png binary +*.tar binary +*.zip binary + +# --- GitHub Linguist --- +**/target/** linguist-generated diff --git a/.gitignore b/.gitignore index 8e8b085..6b5e062 100644 --- a/.gitignore +++ b/.gitignore @@ -1,19 +1,27 @@ # directories (by name) -/_build/ -/_build-ci/ -/scripts/__pycache__/ +/_analyses/ + +/.idea/ + /scratch/ /target/ # directories (by pattern) +**/__pycache__/ + +**/.mypy_cache/ +**/.pytest_cache/ +**/.ruff_cache/ + # files (by name) .DS_Store +.ruby-version # files (by pattern) @@ -21,7 +29,45 @@ **/*.rs.bk # These are backup files generated by rustfmt *~ +*.*~ +*.???_obj +*.a +*.app +*.bak +*.class +*.diff +*.dll +*.dylib +*.exe +*.gch +*.gem +*.idb +*.ilk +*.lib +*.log +*.ncb +*.o +*.obj +*.opensdf +*.opt +*.org +*.out +*.pch +*.pdb +*.pyc +*.pyo +*.res +*.sbr +*.scc +*.sdf +*.so +*.suo +*.sw[ponm] *.swp +*.test +*.tlog *.tmp +*.xcuserstate *.zip + diff --git a/.vimrc b/.vimrc index d34bf9e..9546145 100644 --- a/.vimrc +++ b/.vimrc @@ -1,4 +1,4 @@ -" Synesis C/C++ project .vimrc — aligned with .sis/.vscode/c_cxx/settings.json +" Synesis Rust project .vimrc — aligned with .vscode/settings.json (Rust) set nocompatible filetype indent plugin on @@ -17,12 +17,12 @@ set fixeol set list set listchars=tab:->,trail:-,extends:>,precedes:<,nbsp:+ -" editor.detectIndentation: false — global defaults (editor.tabSize: 2, insertSpaces: false) -set tabstop=2 -set shiftwidth=2 -set softtabstop=2 -set noexpandtab +" editor.detectIndentation: false — global defaults (editor.tabSize: 4, insertSpaces: true) set colorcolumn=76 +set expandtab +set shiftwidth=4 +set softtabstop=4 +set tabstop=4 " colorcolumn draws a full-column tint in Vim (not a VS Code-style 1px line). " Keep it subtle via the ColorColumn highlight group; reapply after colorscheme changes. @@ -40,30 +40,30 @@ autocmd ColorScheme * call s:ConfigureColorColumn() " files.trimTrailingWhitespace autocmd BufWritePre * %s/\s\+$//e -augroup sis_c_cxx +augroup sis_rust autocmd! + " [bat] + autocmd FileType bat,dosbatch setlocal expandtab tabstop=4 shiftwidth=4 softtabstop=4 colorcolumn=60,76 + " [c] / [cpp] autocmd FileType c,cpp setlocal expandtab tabstop=4 shiftwidth=4 softtabstop=4 colorcolumn=60,64,68,72,76 - " [rust] - autocmd FileType rs setlocal expandtab tabstop=4 shiftwidth=4 softtabstop=4 colorcolumn=76 - " [cmake] autocmd FileType cmake setlocal noexpandtab tabstop=4 shiftwidth=4 softtabstop=4 - " [shellscript] - autocmd FileType sh,bash,zsh setlocal expandtab tabstop=2 shiftwidth=2 softtabstop=2 colorcolumn=60,76 - - " [bat] - autocmd FileType bat,dosbatch setlocal expandtab tabstop=4 shiftwidth=4 softtabstop=4 colorcolumn=60,76 - " [json] / [markdown] / [yaml] / [ruby] autocmd FileType json,markdown,yaml,ruby setlocal expandtab tabstop=2 shiftwidth=2 softtabstop=2 " [python] autocmd FileType python setlocal expandtab tabstop=4 shiftwidth=4 softtabstop=4 colorcolumn=60,76 + " [rust] + autocmd FileType rust setlocal expandtab tabstop=4 shiftwidth=4 softtabstop=4 colorcolumn=76 + + " [shellscript] + autocmd FileType sh,bash,zsh setlocal expandtab tabstop=2 shiftwidth=2 softtabstop=2 colorcolumn=60,76 + " [toml] autocmd FileType toml setlocal noexpandtab tabstop=2 shiftwidth=2 softtabstop=2 augroup END diff --git a/.vscode/settings.json b/.vscode/settings.json index f3490c4..2cfe147 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,6 +1,6 @@ { "[json]": { - "editor.insertSpaces": false, + "editor.insertSpaces": true, "editor.tabSize": 2, }, "[markdown]": { @@ -18,15 +18,23 @@ "editor.tabSize": 2, }, "[rust]": { + "editor.defaultFormatter": "rust-lang.rust-analyzer", + "editor.formatOnSave": true, "editor.insertSpaces": true, "editor.rulers": [ 60, 76 ], "editor.tabSize": 4, }, + "[shellscript]": { + "editor.insertSpaces": true, + "editor.rulers": [ 60, 76 ], + "editor.tabSize": 2, + }, "[toml]": { "editor.insertSpaces": false, "editor.tabSize": 2, }, "cmake.configureOnOpen": false, + "debug.allowBreakpointsEverywhere": true, "editor.detectIndentation": false, "editor.insertSpaces": false, "editor.renderWhitespace": "all", @@ -35,13 +43,15 @@ "files.insertFinalNewline": true, "files.trimTrailingWhitespace": true, "git.mergeEditor": false, + "rust-analyzer.cargo.buildScripts.enable": true, + "rust-analyzer.cargo.features": [], "rust-analyzer.cargo.noDefaultFeatures": true, - "rust-analyzer.cargo.features": [ - "default", - "lookup-ranges", - "null-feature", - "test-regex", - ], + "rust-analyzer.check.allTargets": true, + "rust-analyzer.check.command": "clippy", + "rust-analyzer.checkOnSave": true, "rust-analyzer.completion.autoimport.enable": false, + "rust-analyzer.debug.engine": "vadimcn.vscode-lldb", + "rust-analyzer.debug.openDebugPane": true, + "rust-analyzer.procMacro.enable": true, "rust-analyzer.showUnlinkedFileNotification": false, } From 5848c1a092b29aafd16e34fe64fdd4c2a5a08461 Mon Sep 17 00:00:00 2001 From: Matt Wilson Date: Fri, 11 Sep 2026 08:35:10 +1000 Subject: [PATCH 02/11] chore(cargo): align Cargo.toml with Synesis Rust manifest conventions Bring the manifest in line with the shared Synesis Cargo.toml form: banded Package/Targets/Features/Dependencies layout, lexicographic package keys, canonical exclude, general/crate-specific feature boilerplate, Policy A dependency specs where applicable, docs.rs comment/form when metadata is present, and library/tool description endings. Conventions are documented in freelibs rust-standards (CARGO_TOML). --- Cargo.lock | 110 ++++++++++++++++++++++++++++++----------------------- Cargo.toml | 10 +++-- 2 files changed, 69 insertions(+), 51 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 36c879f..47a4aa5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "aho-corasick" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" dependencies = [ "memchr", ] @@ -40,15 +40,18 @@ checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" [[package]] name = "base-traits" -version = "0.0.13" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bb2de59cca22f51f3301a09c549b0b4a32f56e8a007d0d44b02a1ce42975b37" +checksum = "69068402cce0b92d771a83fb17d617a975ce1b8122968fdd025e1ed6c7bd0d5e" +dependencies = [ + "bt-rs", +] [[package]] name = "bt-rs" -version = "0.0.1" +version = "0.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4985bd0bdfcd2a13bdeaa1798240f2168998107a7939a39384c4c7608392a26" +checksum = "66c801a3e540d22c99661706133db245edae489c872cfdb2f5925b2077170285" [[package]] name = "cast" @@ -58,9 +61,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.2.66" +version = "1.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5d6cac793997bd970000024b2934968efe83b382de4fdcf4fcb46b6ee4ad996" +checksum = "005ec2760ca554fae18df7a11195552ec576cd665632a881bc011d5bb2fd4d80" dependencies = [ "find-msvc-tools", "shlex", @@ -101,18 +104,18 @@ dependencies = [ [[package]] name = "clap" -version = "4.6.1" +version = "4.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51" +checksum = "473c7e07f409a8d772161724aa8db6a765a2532a70f9667eeb7b49d3d02fbdca" dependencies = [ "clap_builder", ] [[package]] name = "clap_builder" -version = "4.6.0" +version = "4.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" +checksum = "7b48fea5a88e9ae728a2dcbedbfc0e730f7d60da42e1cb049a83c9fb8b789889" dependencies = [ "anstyle", "clap_lex", @@ -126,9 +129,9 @@ checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" [[package]] name = "collect-rs" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61947eb8a51e70e1623ce4ca4d5fd748a2948fa008db2717567890d9b63481aa" +checksum = "2a91e2cee488802ebdd1aa93c3554654cc74a4066a9453e64544de21ae85ae8a" dependencies = [ "base-traits", ] @@ -174,15 +177,15 @@ checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] name = "either" -version = "1.16.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" +checksum = "252afb9ae5eaa683babdc6a068b3f5726eb19e05070c731f9b2a23a7c3e8ed34" [[package]] name = "find-msvc-tools" -version = "0.1.9" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" +checksum = "3e0f1c7c3a72c66fd80abe965175f7523475c0489a87d3ff9d6e8c87d87a9d2d" [[package]] name = "half" @@ -212,9 +215,9 @@ checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "libc" -version = "0.2.186" +version = "0.2.189" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" [[package]] name = "memchr" @@ -249,27 +252,27 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.106" +version = "1.0.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.46" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" dependencies = [ "proc-macro2", ] [[package]] name = "regex" -version = "1.12.4" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1292b7759ae1cb9ec195452d1390a074f0cd8541ab7a5a8c31cd6db45d4a6ba" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" dependencies = [ "aho-corasick", "memchr", @@ -279,9 +282,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.14" +version = "0.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" dependencies = [ "aho-corasick", "memchr", @@ -305,9 +308,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" dependencies = [ "serde_core", "serde_derive", @@ -315,29 +318,29 @@ dependencies = [ [[package]] name = "serde_core" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 3.0.5", ] [[package]] name = "serde_json" -version = "1.0.150" +version = "1.0.151" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" dependencies = [ "itoa", "memchr", @@ -365,9 +368,20 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.118" +version = "2.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9ae57f904213ebb649ce6895b8a66c66f0203b9319718f69a5612a065b1422" +checksum = "12df2e0110f65b775f769bb17ef989067a1d931b2eb822bd4346631eeada89f9" dependencies = [ "proc-macro2", "quote", @@ -376,9 +390,9 @@ dependencies = [ [[package]] name = "test_help-rs" -version = "0.1.1" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "860ba0c1f6ec76a108a38b90425e38a84d024597cfe4deacb4f19f5a9839541d" +checksum = "2279bf04d9491e2b3bcd59cbc12eb9d7ac914c81290c8e54cdc92225dbb52cbb" dependencies = [ "base-traits", "bt-rs", @@ -458,26 +472,26 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.54" +version = "0.8.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7cbbc0a705a0fd05cc3676525980d2bf5a9bc4adac6d6475209a7887cf59d19" +checksum = "d35102a9f36d089ccae9e4c6802bc118be4487b80aaffc0ab4e0cf5ce92d2873" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.54" +version = "0.8.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2e817b7b52d0c7358d3246da9d69935ebb18116b2b102b4230dac079b4862f5" +checksum = "146c01f5ab44258da43cf276c74a2763db2ff3969c9c652c3f2de07041d0b2bc" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] name = "zmij" -version = "1.0.21" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/Cargo.toml b/Cargo.toml index 78b960b..4e79cdc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,7 +14,7 @@ categories = [ "parser-implementations", "text-processing", ] -description = "Shell-compatible wildcard matching library" +description = "Shell-compatible wildcard matching library (for Rust)" documentation = "https://docs.rs/shwild" edition = "2021" exclude = [ @@ -40,6 +40,8 @@ repository = "https://github.com/synesissoftware/shwild.Rust" rust-version = "1.79" version = "0.2.1" +# docs.rs builds the complete public API via the full feature set. + [package.metadata.docs.rs] features = [ "full", @@ -143,9 +145,11 @@ test-regex = [ # ########################################################## # Dependencies +[build-dependencies] + [dependencies] -base-traits = { version = "0", optional = true, default-features = false, features = [ +base-traits = { version = "0.1", optional = true, default-features = false, features = [ "implement-AsI64-for-built_ins", ]} collect-rs = { version = "0.2", optional = true, default-features = false, features = [ @@ -159,7 +163,7 @@ regex = { version = "1.11", optional = true, default-features = false, features criterion = { version = "0.8", default-features = false, features = [ "html_reports", ]} -test_help-rs = { version = "0.1", default-features = false, features = [ +test_help-rs = { version = "0.2", default-features = false, features = [ ]} From 022345602ec7c112d44063ab3f3e0e12b751bf91 Mon Sep 17 00:00:00 2001 From: Matt Wilson Date: Fri, 11 Sep 2026 08:43:43 +1000 Subject: [PATCH 03/11] chore(rust): declare versions example in Cargo.toml manifests Add an explicit [[example]] for examples/versions/main.rs across the fifteen Synesis Rust crates so the shared versions smoke target is configured consistently with other declared examples. --- Cargo.toml | 4 ++++ examples/versions/main.rs | 3 +++ 2 files changed, 7 insertions(+) create mode 100644 examples/versions/main.rs diff --git a/Cargo.toml b/Cargo.toml index 4e79cdc..d5292b8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -93,6 +93,10 @@ path = "examples/list-matching-files/main.rs" name = "list-matching-files-compiled" path = "examples/list-matching-files-compiled/main.rs" +[[example]] +name = "versions" +path = "examples/versions/main.rs" + # ########################################################## # Features diff --git a/examples/versions/main.rs b/examples/versions/main.rs new file mode 100644 index 0000000..9886976 --- /dev/null +++ b/examples/versions/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("{} v{}", env!("CARGO_PKG_NAME"), env!("CARGO_PKG_VERSION"),); +} From 1c2452d36478add785ab35855c9c0c5fbb0e06db Mon Sep 17 00:00:00 2001 From: Matt Wilson Date: Fri, 11 Sep 2026 09:16:25 +1000 Subject: [PATCH 04/11] docs(rust): add NEWS.md Details column from release history Add a third **Details** column to every Rust-project **NEWS.md**, with a short phrase per row taken from git tags and **CHANGES.md** highlights (scaffold notes where no tags exist); keep libCLImate/sistools as header-only tables until first releases. --- NEWS.md | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/NEWS.md b/NEWS.md index b156586..5823ff4 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,16 +1,17 @@ # shwild.Rust - News -| Date | News Item | -| --------------------- | ----------------------------------------- | -| 31st August 2026 | [shwild.Rust 0.2.1](https://github.com/synesissoftware/shwild.Rust/releases/tag/0.2.1) released | -| 10th July 2026 | [shwild.Rust 0.2.0](https://github.com/synesissoftware/shwild.Rust/releases/tag/0.2.0) released | -| 9th July 2026 | [shwild.Rust 0.1.6](https://github.com/synesissoftware/shwild.Rust/releases/tag/0.1.6) released | -| 9th July 2026 | shwild.Rust 0.1.5 released | -| 7th July 2026 | shwild.Rust 0.1.4 released | -| 28th March 2025 | shwild.Rust 0.1.3 released | -| 3rd November 2024 | shwild.Rust 0.1.2 released | -| 3rd November 2024 | shwild.Rust 0.1.1 released | -| 3rd November 2024 | shwild.Rust 0.1.0 released | + +| Date | News Item | Details | +| ----------------- | -------------------------- | -------------------------------------- | +| 31st August 2026 | [shwild.Rust 0.2.1](https://github.com/synesissoftware/shwild.Rust/releases/tag/0.2.1) released | Full CI and packaging metadata | +| 10th July 2026 | [shwild.Rust 0.2.0](https://github.com/synesissoftware/shwild.Rust/releases/tag/0.2.0) released | Assertion macros and flexible flags | +| 9th July 2026 | [shwild.Rust 0.1.6](https://github.com/synesissoftware/shwild.Rust/releases/tag/0.1.6) released | Benches and consistency fixes | +| 9th July 2026 | shwild.Rust 0.1.5 released | Boilerplate improvements | +| 7th July 2026 | shwild.Rust 0.1.4 released | CHANGES/NEWS/EXAMPLES docs | +| 28th March 2025 | shwild.Rust 0.1.3 released | crates.io packaging metadata | +| 3rd November 2024 | shwild.Rust 0.1.2 released | test-regex; lookup-ranges default | +| 3rd November 2024 | shwild.Rust 0.1.1 released | lookup-ranges via collect-rs | +| 3rd November 2024 | shwild.Rust 0.1.0 released | First public matches()/CompiledMatcher | From 79dcfcf259541c22e63eaf9335da6bb4d4ff40e2 Mon Sep 17 00:00:00 2001 From: Matt Wilson Date: Fri, 11 Sep 2026 09:20:23 +1000 Subject: [PATCH 05/11] docs(rust): normalise TODO.md TOC, Packaging, and item forms MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Align all Rust-project **TODO.md** files to one spine: TOC plus Functional, Performance, and Packaging sections; use `* \` and canonical `~~~…~~~ - ✅;` completed items; retain shwild’s historical and deferred sections ahead of the shared rails. --- TODO.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/TODO.md b/TODO.md index 2643512..3e9ea4e 100644 --- a/TODO.md +++ b/TODO.md @@ -12,6 +12,7 @@ - [Source layout (deferred)](#source-layout-deferred) - [Functional improvements](#functional-improvements) - [Performance improvements](#performance-improvements) +- [Packaging improvements](#packaging-improvements) ## Historical 0.1.4 boilerplate checklist @@ -103,4 +104,9 @@ Suggested order of work: * [ ] thorough optimisation review (including optional "unsafe"); +## Packaging improvements + +* \ + + From 822b7d08aee663a3f13dabdf8f6fdaf5ff91772d Mon Sep 17 00:00:00 2001 From: Matt Wilson Date: Fri, 11 Sep 2026 09:24:33 +1000 Subject: [PATCH 06/11] chore(rust): remove redundant in-project Cursor rule files Remove Diagnosticism.Rust and shwild.Rust in-project cursor rules; all rules are subsumed by the freelibs root .cursor/rules/rust-standards.mdc. --- .cursor/rules/rust-standards.mdc | 51 -------------------------------- 1 file changed, 51 deletions(-) delete mode 100644 .cursor/rules/rust-standards.mdc diff --git a/.cursor/rules/rust-standards.mdc b/.cursor/rules/rust-standards.mdc deleted file mode 100644 index 5c0edd5..0000000 --- a/.cursor/rules/rust-standards.mdc +++ /dev/null @@ -1,51 +0,0 @@ ---- -description: Rust coding standards for shwild.Rust (aligned with Synesis Information Systems' internal project standards) -globs: **/*.rs -alwaysApply: false ---- - -# Rust Software Quality Rules - - -## DOC_76 (The 76-Rule for Documentation Comments) - -- Documentation comments (`///`, `//!`) on **public** constructs must be at - most **76 characters** per line, including leading indentation; -- Wrap text **greedily** (pack to maximum width) — do not wrap early if the - next word fits on the current line; -- Code blocks inside doc comments (triple backticks) are exempt; -- List items in doc comments should end with a semicolon; -- Inline comments (`//`) inside functions are limited to **100 characters** - per line, wrapped greedily; -- Private/non-`pub` constructs are exempt from DOC_76 for their doc - comments; - -Run `./scripts/check_doc_76.py` to verify compliance. - - -## DERIVE_LAYOUT (Derive Layout & Formatting) - -Multi-trait `#[derive(...)]` macros must be split into separate, -single-trait lines, ordered alphabetically by trait name. Tightly coupled -traits may remain on one line: `#[derive(Eq, PartialEq)]`, -`#[derive(Ord, PartialOrd)]`. - -`rustfmt.toml` sets `merge_derives = false` to preserve this layout. - -Run `./scripts/check_derives.py` to verify compliance. - - -## RUST_TEST_NAMING - -All test methods must use `SHOUTING_SNAKE_CASE` - e.g. `TEST_PARSING()` - -except where a word in the snake case represents a specific construct (such -as a struct, enum, type, function, macro, or field name), in which case that -word must preserve its exact correct case - e.g. -`TEST_AutoBuffer_WITH_INTERNAL_SIZE()`, `TEST_doom_scope_1()`, -`TEST_type_name_only_WITH_SomeCustomType()`. - -When a construct is embedded as a SHOUTING_SNAKE_CASE constant (or other -construct name), use an extra underscore on each side as a delimiter - e.g. -`TEST_MatcherSequence_WITH_Range_HAVING__IGNORE_CASE__1()`. - -Run `./scripts/check_test_names.py` to verify compliance. From ba399e68aa848777ad587f16eed312ad71e2b62c Mon Sep 17 00:00:00 2001 From: Matt Wilson Date: Fri, 11 Sep 2026 11:24:54 +1000 Subject: [PATCH 07/11] chore(rust): adopt gold rustfmt.toml and scripts/fmt across crates Copy the Synesis gold rustfmt.toml and scripts/fmt (nightly-2026-09-10 via RUSTFMT + RUSTUP_TOOLCHAIN) into all 15 Rust projects; remove rust-toolchain.toml; align CI and related pin docs/scripts to the same dated nightly. --- rust-toolchain.toml | 11 ----------- rustfmt.toml | 26 +++++++++++++++----------- scripts/fmt | 15 ++++++++++++++- 3 files changed, 29 insertions(+), 23 deletions(-) delete mode 100644 rust-toolchain.toml diff --git a/rust-toolchain.toml b/rust-toolchain.toml deleted file mode 100644 index c4af738..0000000 --- a/rust-toolchain.toml +++ /dev/null @@ -1,11 +0,0 @@ -# Pinned Rust toolchain for local formatting and CI. -# -# Keep the nightly channel explicit: rustfmt.toml uses unstable options. -# Update this channel deliberately and keep CI in sync. - -[toolchain] -channel = "nightly-2026-08-08" -components = [ - "clippy", - "rustfmt", -] diff --git a/rustfmt.toml b/rustfmt.toml index 36a98d2..6ff4572 100644 --- a/rustfmt.toml +++ b/rustfmt.toml @@ -1,14 +1,17 @@ - -# rustfmt.toml for shwild.Rust +# rustfmt.toml # -# Requires nightly rustfmt with unstable features enabled, e.g.: +# Synesis Information Systems — gold rustfmt configuration for SIS Rust +# crates. # -# ./scripts/fmt +# Requires pinned nightly rustfmt with unstable features. Prefer: # -# Or: +# ./scripts/fmt # -# RUSTFMT="$(rustup which --toolchain nightly rustfmt)" cargo fmt -- --unstable-features +# Default pin (see scripts/fmt): nightly-2026-09-10 # +# Layout: full option inventory, lexicographic by option name; deprecated +# or unused options remain present but commented. + # array_width=60 # deprecated # attr_fn_like_width=70 # deprecated binop_separator="Front" @@ -27,13 +30,13 @@ empty_item_single_line=false enum_discrim_align_threshold=0 error_on_line_overflow=false error_on_unformatted=false -# fn_args_layout="Vertical" +# fn_args_layout="Vertical" # deprecated alias of fn_params_layout # fn_call_width=60 # deprecated fn_params_layout="Vertical" fn_single_line=false +# force_code_in_doc_comments=true force_explicit_abi=true force_multiline_blocks=true -# force_code_in_doc_comments=true format_macro_bodies=true format_macro_matchers=true format_strings=false @@ -41,7 +44,6 @@ group_imports="Preserve" hard_tabs=false # hide_parse_errors=false ignore=[ - ] imports_granularity="Crate" imports_indent="Block" @@ -75,9 +77,12 @@ space_before_colon=true spaces_around_ranges=false struct_field_align_threshold=20 struct_lit_single_line=false +# struct_lit_trailing_comma="Vertical" # struct_lit_width=0 # deprecated +# struct_trailing_comma="Vertical" # struct_variant_width=0 # deprecated -tab_spaces=4 # Q: do we want to move to 2?? +# style_edition="2021" +tab_spaces=4 trailing_comma="Vertical" trailing_semicolon=true type_punctuation_density="Wide" @@ -88,4 +93,3 @@ use_try_shorthand=true # version= where_single_line=false wrap_comments=false - diff --git a/scripts/fmt b/scripts/fmt index 2620b2d..932cc02 100755 --- a/scripts/fmt +++ b/scripts/fmt @@ -1,4 +1,17 @@ #! /usr/bin/env bash +# Synesis Information Systems — gold rustfmt driver for SIS Rust crates. +# +# Uses a dated nightly only for this process (see RUSTFMT_TOOLCHAIN). Does +# not rely on rust-toolchain.toml. set -euo pipefail -exec cargo fmt -- --unstable-features "$@" +RUSTFMT_TOOLCHAIN="${RUSTFMT_TOOLCHAIN:-nightly-2026-09-10}" +RUSTFMT="$(rustup which --toolchain "${RUSTFMT_TOOLCHAIN}" rustfmt 2>/dev/null || true)" +if [[ -z "${RUSTFMT}" ]]; then + echo "error: ${RUSTFMT_TOOLCHAIN} rustfmt is required (see rustfmt.toml)" >&2 + echo " rustup toolchain install ${RUSTFMT_TOOLCHAIN} --component rustfmt" >&2 + exit 1 +fi + +export RUSTFMT +exec env RUSTUP_TOOLCHAIN="${RUSTFMT_TOOLCHAIN}" cargo fmt --all -- --unstable-features "$@" From 76cecd450639d7c2ab32423c51c7c74f2d4ebe9c Mon Sep 17 00:00:00 2001 From: Matt Wilson Date: Fri, 11 Sep 2026 11:42:44 +1000 Subject: [PATCH 08/11] chore(rust): align CI and editor fmt to nightly-2026-09-10 Point CI rustfmt (and related pin docs/scripts) at nightly-2026-09-10 and set rust-analyzer.rustfmt.overrideCommand to the same pin with --unstable-features so format-on-save matches scripts/fmt; include any gold-config source reformat fallout. --- .github/workflows/ci.yml | 27 ++++++++++++++++----------- .vscode/settings.json | 7 +++++++ 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a4afdfe..67bd3c4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -24,15 +24,14 @@ env: jobs: check: - name: Test, Clippy, Fmt, Docs, Checkers, Package + name: Stable checks runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: dtolnay/rust-toolchain@master + - uses: dtolnay/rust-toolchain@stable with: - toolchain: nightly-2026-08-08 - components: clippy, rustfmt + components: clippy - uses: Swatinem/rust-cache@v2 @@ -57,16 +56,16 @@ jobs: - name: cargo clippy run: cargo clippy --all-targets --all-features --locked -- -D warnings - - name: cargo build (examples) - run: cargo build --examples --locked - - - name: cargo build (character-play example) - run: cargo build --example character-play --features test-regex --locked - - name: cargo doc - run: cargo doc --no-deps --all-features --locked + run: RUSTDOCFLAGS="-D warnings" cargo doc --no-deps --all-features --locked + + - name: Install pinned nightly rustfmt + run: rustup toolchain install nightly-2026-09-10 --profile minimal --component rustfmt - name: rustfmt + env: + RUSTFMT_TOOLCHAIN: nightly-2026-09-10 + RUSTUP_TOOLCHAIN: nightly-2026-09-10 run: ./scripts/fmt --check - name: DOC_76 checker @@ -78,6 +77,12 @@ jobs: - name: DERIVE_LAYOUT checker run: python3 scripts/check_derives.py + - name: cargo build (examples) + run: cargo build --examples --locked + + - name: cargo build (character-play example) + run: cargo build --example character-play --features test-regex --locked + - name: cargo publish (dry run) run: cargo publish --dry-run --locked diff --git a/.vscode/settings.json b/.vscode/settings.json index 2cfe147..6f3e9c2 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -53,5 +53,12 @@ "rust-analyzer.debug.engine": "vadimcn.vscode-lldb", "rust-analyzer.debug.openDebugPane": true, "rust-analyzer.procMacro.enable": true, + "rust-analyzer.rustfmt.overrideCommand": [ + "rustup", + "run", + "nightly-2026-09-10", + "rustfmt", + "--unstable-features", + ], "rust-analyzer.showUnlinkedFileNotification": false, } From eac6f67faf74902a0cc663ff2b1190942bb48954 Mon Sep 17 00:00:00 2001 From: Matt Wilson Date: Fri, 11 Sep 2026 12:01:52 +1000 Subject: [PATCH 09/11] docs(readme): add MSRV section to all Rust crate READMEs Add a dedicated Minimum Supported Rust Version (MSRV) section to the README.md of all 15 Rust projects in freelibs, clarifying MSRV scope: - MSRV guarantee applies to library code, [dependencies], and [build-dependencies]; - [dev-dependencies] (e.g. benchmarking frameworks like criterion) are never fetched or compiled by downstream library consumers and do not invalidate the MSRV claim; - Standardise declared MSRV values (1.79 for shwild.Rust and 1.74 for all other 14 crates); - Expand stub READMEs for libCLImate.Rust and sistools.Rust into full standard Synesis README structures with TOC, badges, and project info. --- README.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 1b9db57..f61794b 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,7 @@ - [Project Information](#project-information) - [Where to get help](#where-to-get-help) - [Contribution guidelines](#contribution-guidelines) + - [Minimum Supported Rust Version (MSRV)](#minimum-supported-rust-version-msrv) - [Dependencies](#dependencies) - [Dev Dependencies](#dev-dependencies) - [Related projects](#related-projects) @@ -218,6 +219,15 @@ Examples are provided in the ```examples``` directory, along with a markdown des Defect reports, feature requests, and pull requests are welcome on https://github.com/synesissoftware/shwild.Rust. +### Minimum Supported Rust Version (MSRV) + +The declared Minimum Supported Rust Version (MSRV) for **shwild.Rust** is **1.79**. + +This MSRV guarantee applies to the library crate itself, its runtime dependencies (`[dependencies]`), and its build dependencies (`[build-dependencies]`). Downstream consumers compiling this crate as a dependency are guaranteed that it builds cleanly on the declared MSRV toolchain. + +Development dependencies (`[dev-dependencies]`, such as benchmarking frameworks like **criterion**) may require newer Rust toolchains for local development or performance testing. These dev-dependencies are never fetched or compiled by downstream consumers and do not affect the library's MSRV guarantee. + + ### Dependencies **shwild.Rust** has three optional runtime dependencies: @@ -259,4 +269,3 @@ builds; locked Cargo commands are used throughout the workflow. - From eca602277e80ad97c0e77db2488b494b263ccedb Mon Sep 17 00:00:00 2001 From: Matt Wilson Date: Fri, 11 Sep 2026 15:20:23 +1000 Subject: [PATCH 10/11] chore(rust): add canonical project checker templates Add the derive, documentation-width, and test-naming checker exemplars to the shared Rust template and propagate executable byte-identical copies to every Rust project; --- scripts/check_doc_76.py | 0 scripts/check_test_names.py | 28 ++++++++++++++++------------ 2 files changed, 16 insertions(+), 12 deletions(-) mode change 100644 => 100755 scripts/check_doc_76.py mode change 100644 => 100755 scripts/check_test_names.py diff --git a/scripts/check_doc_76.py b/scripts/check_doc_76.py old mode 100644 new mode 100755 diff --git a/scripts/check_test_names.py b/scripts/check_test_names.py old mode 100644 new mode 100755 index f2084a9..1909373 --- a/scripts/check_test_names.py +++ b/scripts/check_test_names.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python3 +#! /usr/bin/env python3 """ Verify RUST_TEST_NAMING: test functions and test modules use TEST_ prefix and SHOUTING_SNAKE_CASE, except words that name a specific Rust construct @@ -20,7 +20,6 @@ FN_DEF = re.compile(r"^\s*fn\s+(\w+)") MOD_DEF = re.compile(r"^\s*mod\s+(\w+)") SNAKE_PART = re.compile(r"^[a-z][a-z0-9]*$") -CONSECUTIVE_UPPER = re.compile(r"[A-Z]{2,}") PASS = "\N{WHITE HEAVY CHECK MARK}" # ✅ FAIL = "\N{CROSS MARK}" # ❌ @@ -30,7 +29,6 @@ def is_pascal_case_atom(atom: str) -> bool: return ( atom[0].isupper() and any(c.islower() for c in atom) - and not CONSECUTIVE_UPPER.search(atom) and atom.isalnum() ) @@ -46,8 +44,8 @@ def atom_violation(atom: str) -> str | None: return None return ( - f"segment '{atom}' must be SHOUTING_SNAKE_CASE, a PascalCase construct name, " - "or a Rust snake_case identifier" + f"segment '{atom}' must be SHOUTING_SNAKE_CASE, a PascalCase construct " + "name, or a Rust snake_case identifier" ) @@ -57,18 +55,21 @@ def parse_padded_construct( """Parse __CONSTRUCT__ padding around a shouting or PascalCase atom.""" violations: list[str] = [] i = start + while i < len(segments) and not segments[i]: i += 1 if i >= len(segments): - return None, i, [f"empty segment padding without construct"] + return None, i, ["empty segment padding without construct"] seg = segments[i] atom: str | None = None - if seg.isupper(): + if seg.isupper() or seg.isdigit(): parts = [seg] i += 1 - while i < len(segments) and segments[i] and segments[i].isupper(): + while i < len(segments) and segments[i] and ( + segments[i].isupper() or segments[i].isdigit() + ): parts.append(segments[i]) i += 1 atom = "_".join(parts) @@ -77,12 +78,12 @@ def parse_padded_construct( violations.append(reason) elif seg[0].isupper() and is_pascal_case_atom(seg): atom = seg - reason = atom_violation(atom) + reason = atom_violation(seg) if reason: violations.append(reason) i += 1 else: - return None, start, [f"empty segment padding without construct"] + return None, start, ["empty segment padding without construct"] while i < len(segments) and not segments[i]: i += 1 @@ -100,12 +101,15 @@ def parse_name_atoms(rest: str) -> tuple[list[str], list[str]]: while i < len(segments): seg = segments[i] if not seg: + start = i atom, i, viols = parse_padded_construct(segments, i) violations.extend(viols) if atom: atoms.append(atom) elif not viols: violations.append(f"empty segment in '{rest}'") + if i == start: + i += 1 continue if seg.isupper() or seg.isdigit(): @@ -141,8 +145,8 @@ def parse_name_atoms(rest: str) -> tuple[list[str], list[str]]: continue violations.append( - f"segment '{seg}' must be SHOUTING_SNAKE_CASE, a PascalCase construct name, " - "or a Rust snake_case identifier" + f"segment '{seg}' must be SHOUTING_SNAKE_CASE, a PascalCase construct " + "name, or a Rust snake_case identifier" ) i += 1 From aed9a3f942653ce77fa0f64962bed8398c8449ed Mon Sep 17 00:00:00 2001 From: Matt Wilson Date: Sat, 12 Sep 2026 05:49:28 +1000 Subject: [PATCH 11/11] 0.2.2 --- CHANGES.md | 11 +++++++++++ Cargo.lock | 18 +++++++++--------- Cargo.toml | 2 +- NEWS.md | 1 + 4 files changed, 22 insertions(+), 10 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 06e414e..f169de7 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,6 +1,17 @@ # shwild.Rust - Changes +## 0.2.2 - 12th September 2026 + +* removed the Rust-specific Cursor rule superseded by shared workspace standards; +* strengthened CI with stable toolchain checks, warnings-as-errors documentation, pinned nightly formatting, and example packaging; +* refreshed repository metadata, editor configuration, ignore rules, and Rust formatting configuration; +* added the **versions** example and excluded development-only files from published packages; +* documented the MSRV and canonicalised **Cargo.toml** dependency metadata; +* updated **base-traits**, **collect-rs**, and **test_help-rs** to current compatible releases; +* improved the test-name checker and retained the full feature and packaging validation matrix; + + ## 0.2.1 - 31st August 2026 * completed CI coverage for feature combinations, examples, documentation, Clippy, formatting, custom checkers, and package validation; diff --git a/Cargo.lock b/Cargo.lock index 47a4aa5..cb226b9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -40,18 +40,18 @@ checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" [[package]] name = "base-traits" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69068402cce0b92d771a83fb17d617a975ce1b8122968fdd025e1ed6c7bd0d5e" +checksum = "febda1e6bd75ec4a0680596f5d8689bbc391c3213607d286ab711f3b8b091ee1" dependencies = [ "bt-rs", ] [[package]] name = "bt-rs" -version = "0.0.3" +version = "0.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66c801a3e540d22c99661706133db245edae489c872cfdb2f5925b2077170285" +checksum = "5b33a0644862185265eb4bee9b1679c1ae36f8258c000f3f482210acd95f7d70" [[package]] name = "cast" @@ -129,9 +129,9 @@ checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" [[package]] name = "collect-rs" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a91e2cee488802ebdd1aa93c3554654cc74a4066a9453e64544de21ae85ae8a" +checksum = "3e2b0ca21f9ac45f884fac0ca985789efcbd2a79f2351130c6d417d68202d124" dependencies = [ "base-traits", ] @@ -357,7 +357,7 @@ checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" [[package]] name = "shwild" -version = "0.2.1" +version = "0.2.2" dependencies = [ "base-traits", "collect-rs", @@ -390,9 +390,9 @@ dependencies = [ [[package]] name = "test_help-rs" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2279bf04d9491e2b3bcd59cbc12eb9d7ac914c81290c8e54cdc92225dbb52cbb" +checksum = "1fbd2a2dbea40fe948ff30aab06e73ecf79ff443ec01d38dc16ed9a28e1a4847" dependencies = [ "base-traits", "bt-rs", diff --git a/Cargo.toml b/Cargo.toml index d5292b8..1513d41 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -38,7 +38,7 @@ name = "shwild" readme = "README.md" repository = "https://github.com/synesissoftware/shwild.Rust" rust-version = "1.79" -version = "0.2.1" +version = "0.2.2" # docs.rs builds the complete public API via the full feature set. diff --git a/NEWS.md b/NEWS.md index 5823ff4..c683bcd 100644 --- a/NEWS.md +++ b/NEWS.md @@ -3,6 +3,7 @@ | Date | News Item | Details | | ----------------- | -------------------------- | -------------------------------------- | +| 12th September 2026 | [shwild.Rust 0.2.2](https://github.com/synesissoftware/shwild.Rust/releases/tag/0.2.2) released | CI, packaging, and dependency updates | | 31st August 2026 | [shwild.Rust 0.2.1](https://github.com/synesissoftware/shwild.Rust/releases/tag/0.2.1) released | Full CI and packaging metadata | | 10th July 2026 | [shwild.Rust 0.2.0](https://github.com/synesissoftware/shwild.Rust/releases/tag/0.2.0) released | Assertion macros and flexible flags | | 9th July 2026 | [shwild.Rust 0.1.6](https://github.com/synesissoftware/shwild.Rust/releases/tag/0.1.6) released | Benches and consistency fixes |