diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 0000000..4f4f196 --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,42 @@ +name: Tests + +on: + push: + branches: [main] + pull_request: + +permissions: + contents: read + +jobs: + test: + name: ${{ matrix.os }} / Python ${{ matrix.python-version }} + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + include: + # MLX's Linux CPU build runs the full suite without Apple hardware + - os: ubuntu-latest + python-version: "3.10" + mlx: "mlx[cpu]" + - os: ubuntu-latest + python-version: "3.12" + mlx: "mlx[cpu]" + - os: macos-14 + python-version: "3.12" + mlx: "mlx" + + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + cache: pip + + - name: Install + run: pip install -e ".[dev]" "${{ matrix.mlx }}" + + - name: Run tests + run: pytest -q diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index aedeb3f..53d7feb 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -7,14 +7,16 @@ Thanks for your interest in contributing! ```bash git clone https://github.com/CodeWithBehnam/vayu.git cd vayu -pip install -e ".[dev]" +pip install -e ".[dev]" # or: uv sync --extra dev ``` +The test suite also runs on Linux with MLX's CPU build: `pip install "mlx[cpu]"`. + ## Making changes -1. Fork the repo and create a branch from `master` +1. Fork the repo and create a branch from `main` 2. Make your changes -3. Run tests: `pytest` +3. Run tests: `pytest` (CI runs them on every pull request) 4. Submit a pull request ## Reporting bugs diff --git a/pyproject.toml b/pyproject.toml index 67d5fb8..aae6cc3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -64,8 +64,11 @@ dev = [ "mypy", ] notebook = [ - "ipykernel", + "ipykernel>=7.1.0", + "ipywidgets>=8.1.8", "jupyter", + "matplotlib>=3.10.8", + "psutil>=7.2.1", ] [project.scripts] @@ -97,12 +100,3 @@ line_length = 88 [tool.mypy] python_version = "3.10" ignore_missing_imports = true - -[dependency-groups] -dev = [ - "ipykernel>=7.1.0", - "ipywidgets>=8.1.8", - "matplotlib>=3.10.8", - "psutil>=7.2.1", - "pytest>=9.0.2", -] diff --git a/uv.lock b/uv.lock index acd3418..dc06837 100644 --- a/uv.lock +++ b/uv.lock @@ -3257,44 +3257,8 @@ wheels = [ ] [[package]] -name = "wcwidth" -version = "0.2.14" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/24/30/6b0809f4510673dc723187aeaf24c7f5459922d01e2f794277a3dfb90345/wcwidth-0.2.14.tar.gz", hash = "sha256:4d478375d31bc5395a3c55c40ccdf3354688364cd61c4f6adacaa9215d0b3605", size = 102293, upload-time = "2025-09-22T16:29:53.023Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/af/b5/123f13c975e9f27ab9c0770f514345bd406d0e8d3b7a0723af9d43f710af/wcwidth-0.2.14-py2.py3-none-any.whl", hash = "sha256:a7bb560c8aee30f9957e5f9895805edd20602f2d7f720186dfd906e82b4982e1", size = 37286, upload-time = "2025-09-22T16:29:51.641Z" }, -] - -[[package]] -name = "webcolors" -version = "25.10.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1d/7a/eb316761ec35664ea5174709a68bbd3389de60d4a1ebab8808bfc264ed67/webcolors-25.10.0.tar.gz", hash = "sha256:62abae86504f66d0f6364c2a8520de4a0c47b80c03fc3a5f1815fedbef7c19bf", size = 53491, upload-time = "2025-10-31T07:51:03.977Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl", hash = "sha256:032c727334856fc0b968f63daa252a1ac93d33db2f5267756623c210e57a4f1d", size = 14905, upload-time = "2025-10-31T07:51:01.778Z" }, -] - -[[package]] -name = "webencodings" -version = "0.5.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0b/02/ae6ceac1baeda530866a85075641cec12989bd8d31af6d5ab4a3e8c92f47/webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923", size = 9721, upload-time = "2017-04-05T20:21:34.189Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", size = 11774, upload-time = "2017-04-05T20:21:32.581Z" }, -] - -[[package]] -name = "websocket-client" -version = "1.9.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2c/41/aa4bf9664e4cda14c3b39865b12251e8e7d239f4cd0e3cc1b6c2ccde25c1/websocket_client-1.9.0.tar.gz", hash = "sha256:9e813624b6eb619999a97dc7958469217c3176312b3a16a4bd1bc7e08a46ec98", size = 70576, upload-time = "2025-10-07T21:16:36.495Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl", hash = "sha256:af248a825037ef591efbf6ed20cc5faa03d3b47b9e5a2230a529eeee1c1fc3ef", size = 82616, upload-time = "2025-10-07T21:16:34.951Z" }, -] - -[[package]] -name = "whisper-mlx" -version = "0.5.0" +name = "vayu-whisper" +version = "1.0.0" source = { editable = "." } dependencies = [ { name = "huggingface-hub" }, @@ -3316,30 +3280,27 @@ dev = [ { name = "pytest" }, ] notebook = [ - { name = "ipykernel" }, - { name = "jupyter" }, -] - -[package.dev-dependencies] -dev = [ { name = "ipykernel" }, { name = "ipywidgets" }, + { name = "jupyter" }, { name = "matplotlib" }, { name = "psutil" }, - { name = "pytest" }, ] [package.metadata] requires-dist = [ { name = "black", marker = "extra == 'dev'" }, { name = "huggingface-hub" }, - { name = "ipykernel", marker = "extra == 'notebook'" }, + { name = "ipykernel", marker = "extra == 'notebook'", specifier = ">=7.1.0" }, + { name = "ipywidgets", marker = "extra == 'notebook'", specifier = ">=8.1.8" }, { name = "isort", marker = "extra == 'dev'" }, { name = "jupyter", marker = "extra == 'notebook'" }, + { name = "matplotlib", marker = "extra == 'notebook'", specifier = ">=3.10.8" }, { name = "mlx", specifier = ">=0.11" }, { name = "mypy", marker = "extra == 'dev'" }, { name = "numba" }, { name = "numpy" }, + { name = "psutil", marker = "extra == 'notebook'", specifier = ">=7.2.1" }, { name = "pytest", marker = "extra == 'dev'" }, { name = "scipy" }, { name = "tiktoken" }, @@ -3347,13 +3308,40 @@ requires-dist = [ ] provides-extras = ["dev", "notebook"] -[package.metadata.requires-dev] -dev = [ - { name = "ipykernel", specifier = ">=7.1.0" }, - { name = "ipywidgets", specifier = ">=8.1.8" }, - { name = "matplotlib", specifier = ">=3.10.8" }, - { name = "psutil", specifier = ">=7.2.1" }, - { name = "pytest", specifier = ">=9.0.2" }, +[[package]] +name = "wcwidth" +version = "0.2.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/24/30/6b0809f4510673dc723187aeaf24c7f5459922d01e2f794277a3dfb90345/wcwidth-0.2.14.tar.gz", hash = "sha256:4d478375d31bc5395a3c55c40ccdf3354688364cd61c4f6adacaa9215d0b3605", size = 102293, upload-time = "2025-09-22T16:29:53.023Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/b5/123f13c975e9f27ab9c0770f514345bd406d0e8d3b7a0723af9d43f710af/wcwidth-0.2.14-py2.py3-none-any.whl", hash = "sha256:a7bb560c8aee30f9957e5f9895805edd20602f2d7f720186dfd906e82b4982e1", size = 37286, upload-time = "2025-09-22T16:29:51.641Z" }, +] + +[[package]] +name = "webcolors" +version = "25.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/7a/eb316761ec35664ea5174709a68bbd3389de60d4a1ebab8808bfc264ed67/webcolors-25.10.0.tar.gz", hash = "sha256:62abae86504f66d0f6364c2a8520de4a0c47b80c03fc3a5f1815fedbef7c19bf", size = 53491, upload-time = "2025-10-31T07:51:03.977Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl", hash = "sha256:032c727334856fc0b968f63daa252a1ac93d33db2f5267756623c210e57a4f1d", size = 14905, upload-time = "2025-10-31T07:51:01.778Z" }, +] + +[[package]] +name = "webencodings" +version = "0.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0b/02/ae6ceac1baeda530866a85075641cec12989bd8d31af6d5ab4a3e8c92f47/webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923", size = 9721, upload-time = "2017-04-05T20:21:34.189Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", size = 11774, upload-time = "2017-04-05T20:21:32.581Z" }, +] + +[[package]] +name = "websocket-client" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2c/41/aa4bf9664e4cda14c3b39865b12251e8e7d239f4cd0e3cc1b6c2ccde25c1/websocket_client-1.9.0.tar.gz", hash = "sha256:9e813624b6eb619999a97dc7958469217c3176312b3a16a4bd1bc7e08a46ec98", size = 70576, upload-time = "2025-10-07T21:16:36.495Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl", hash = "sha256:af248a825037ef591efbf6ed20cc5faa03d3b47b9e5a2230a529eeee1c1fc3ef", size = 82616, upload-time = "2025-10-07T21:16:34.951Z" }, ] [[package]]