From 87609ca5e0a563f40f1949591d50fecb991c31b8 Mon Sep 17 00:00:00 2001 From: gianni-dalerta Date: Fri, 30 Jan 2026 13:36:31 -0500 Subject: [PATCH] Add pyproject.toml, GitHub Actions CI, MIT license - pyproject.toml with proper metadata and optional deps - GitHub Actions workflow: tests on Python 3.10-3.12 - Lint checks (ruff, black) - MIT License --- .github/workflows/test.yml | 74 ++++++++++++++++++++++++++++++++++++++ LICENSE | 21 +++++++++++ pyproject.toml | 70 ++++++++++++++++++++++++++++++++++++ 3 files changed, 165 insertions(+) create mode 100644 .github/workflows/test.yml create mode 100644 LICENSE create mode 100644 pyproject.toml diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..d37b377 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,74 @@ +name: Tests + +on: + push: + branches: [main] + pull_request: + branches: [main] + +jobs: + test: + runs-on: ubuntu-latest + strategy: + matrix: + python-version: ["3.10", "3.11", "3.12"] + + steps: + - uses: actions/checkout@v4 + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + + - name: Install uv + uses: astral-sh/setup-uv@v5 + + - name: Install dependencies + run: | + uv venv + source .venv/bin/activate + uv pip install -e ".[dev,stt]" + + - name: Run unit tests + run: | + source .venv/bin/activate + pytest tests/test_modules.py -v + + - name: Run server tests + run: | + source .venv/bin/activate + pytest tests/test_server.py -v + env: + OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} + + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.12" + + - name: Install uv + uses: astral-sh/setup-uv@v5 + + - name: Install dependencies + run: | + uv venv + source .venv/bin/activate + uv pip install ruff black + + - name: Check formatting + run: | + source .venv/bin/activate + black --check src/ tests/ + continue-on-error: true + + - name: Lint + run: | + source .venv/bin/activate + ruff check src/ tests/ + continue-on-error: true diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..090b4e4 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Purple Horizons LLC + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..2b1b2ab --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,70 @@ +[project] +name = "openclaw-voice" +version = "0.1.0" +description = "Self-hosted browser-based voice interface for AI assistants" +readme = "README.md" +requires-python = ">=3.10,<3.14" +license = {text = "MIT"} +authors = [ + {name = "Purple Horizons", email = "hello@purplehorizons.io"} +] +keywords = ["voice", "ai", "assistant", "whisper", "tts", "stt"] +classifiers = [ + "Development Status :: 3 - Alpha", + "Intended Audience :: Developers", + "License :: OSI Approved :: MIT License", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", +] +dependencies = [ + "fastapi>=0.109.0", + "uvicorn[standard]>=0.27.0", + "websockets>=12.0", + "pydantic>=2.5.0", + "pydantic-settings>=2.1.0", + "numpy>=1.26.0", + "openai>=1.6.0", + "httpx>=0.26.0", + "loguru>=0.7.2", + "python-dotenv>=1.0.0", +] + +[project.optional-dependencies] +stt = [ + "faster-whisper>=1.0.0", +] +tts = [ + "torch>=2.1.0", + "torchaudio>=2.1.0", +] +all = [ + "openclaw-voice[stt,tts]", +] +dev = [ + "pytest>=7.4.0", + "pytest-asyncio>=0.23.0", + "black>=23.12.0", + "ruff>=0.1.0", +] + +[project.urls] +Homepage = "https://github.com/Purple-Horizons/openclaw-voice" +Repository = "https://github.com/Purple-Horizons/openclaw-voice" +Issues = "https://github.com/Purple-Horizons/openclaw-voice/issues" + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.pytest.ini_options] +asyncio_mode = "auto" +testpaths = ["tests"] + +[tool.ruff] +line-length = 100 +target-version = "py310" + +[tool.black] +line-length = 100 +target-version = ["py310", "py311", "py312"]