diff --git a/.gitignore b/.gitignore
index e4541e7..2c681dd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,3 +4,5 @@ pkg-*/
node_modules/
.pnpm-store
*.local
+venv
+.venv
diff --git a/.idea/lib_um_crypto.iml b/.idea/lib_um_crypto.iml
index 3ac3b73..1a5bffc 100644
--- a/.idea/lib_um_crypto.iml
+++ b/.idea/lib_um_crypto.iml
@@ -1,5 +1,10 @@
+
+
+
+
+
@@ -20,8 +25,10 @@
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..8523ab8
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/bump_versions.py b/bump_versions.py
new file mode 100644
index 0000000..fcd2197
--- /dev/null
+++ b/bump_versions.py
@@ -0,0 +1,44 @@
+import argparse
+import glob
+import re
+from typing import Generator
+
+
+def parse_version(text: str) -> str:
+ re_version = re.compile(r'^\d+\.\d+\.\d+(-[-a-zA-Z\d]*)?$')
+ if not re_version.match(text):
+ raise argparse.ArgumentTypeError(f"Invalid version format: '{text}'")
+ return text
+
+def iter_cargo_toml_paths() -> Generator[str, None, None]:
+ yield "um_audio/Cargo.toml"
+ yield "um_wasm/Cargo.toml"
+ yield "um_cli/Cargo.toml"
+ for p in glob.iglob("um_crypto/*/Cargo.toml", recursive=False):
+ yield p
+
+def re_replace_file(path: str, regex: re.Pattern, replacement: str) -> None:
+ print(f"Bumping {path}...")
+ with open(path, "r", encoding='utf-8') as f:
+ content = f.read()
+ content = regex.sub(replacement, content, 1)
+ with open(path, "w", encoding='utf-8', newline='\n') as f:
+ f.write(content)
+
+def main():
+ parser = argparse.ArgumentParser (description="Bump versions")
+ parser.add_argument("version", type=parse_version, help="Version to bump to")
+ args = parser.parse_args()
+
+ re_toml_version = re.compile(r'^\s*(version|"version"|\'version\')\s*=\s*.*$', re.MULTILINE)
+ re_json_version = re.compile(r'^(\s*)"version"\s*:\s*".*?"\s*(,)?\s*$', re.MULTILINE)
+
+ for path in iter_cargo_toml_paths():
+ re_replace_file(path, re_toml_version, f'version = "{args.version}"')
+ re_replace_file("um_wasm_loader/package.json", re_json_version, fr'\1"version": "{args.version}"\2')
+
+
+
+if __name__ == "__main__":
+ main()
+