diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6dff74e..99a6173 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,20 +2,16 @@ name: CI on: push: - branches: - - main pull_request: - branches: - - main jobs: test: strategy: fail-fast: false matrix: - python-version: [ '3.10', '3.11', '3.12', '3.13' ] - os: [ ubuntu-latest ] - vaultwarden-version: [ '1.32.7', '1.33.2' , '1.34.3'] + python-version: ["3.10", "3.11", "3.12", "3.13"] + os: [ubuntu-latest] + vaultwarden-version: ["1.32.7", "1.33.2", "1.34.3"] runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v3 @@ -54,7 +50,7 @@ jobs: - name: Setup Python uses: actions/setup-python@v4 with: - python-version: '3.13' + python-version: "3.13" - name: Install Python dependencies run: | python -m pip install --upgrade hatch @@ -75,10 +71,11 @@ jobs: - name: Setup Python uses: actions/setup-python@v4 with: - python-version: '3.10' + python-version: "3.10" - name: Install Hatch run: | python -m pip install -U hatch - name: Build package run: | - hatch build \ No newline at end of file + hatch build + diff --git a/README.md b/README.md index 3ca8ffe..01d0dc4 100644 --- a/README.md +++ b/README.md @@ -134,6 +134,26 @@ You can now install the project and its dependencies using: ```bash pip install -e .[test] ``` + +### Code Style and Linting + +This project uses [ruff](https://docs.astral.sh/ruff/) for both linting and code formatting. Before submitting a pull request, ensure your code follows the project's style guidelines. + +To check for linting and formatting issues: +```bash +hatch run style:check +``` + +To automatically fix linting issues and format your code: +```bash +hatch run style:format +``` + +To only run linting (with auto-fix): +```bash +hatch run style:lint +``` + ### Testing To run the tests, use: @@ -141,6 +161,11 @@ To run the tests, use: bash tests/e2e/run_tests.sh ``` +Or using hatch: +```bash +hatch run test:test +``` + ## License Python-vaultwarden is distributed under the terms of the [Apache-2.0](https://spdx.org/licenses/Apache-2.0.html) license. diff --git a/pyproject.toml b/pyproject.toml index 1675a98..a7d0b86 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -93,51 +93,47 @@ check = "mypy src/vaultwarden" [tool.hatch.envs.style] detached = true dependencies = [ - "black", - "isort", "ruff", ] [tool.hatch.envs.style.scripts] lint = [ - "ruff check --fix src/vaultwarden", + "ruff check --fix src/vaultwarden tests", ] check = [ - "isort --check-only --diff src/vaultwarden", - "black -q --check --diff src/vaultwarden", - "ruff check src/vaultwarden", + "ruff check src/vaultwarden tests", + "ruff format --check src/vaultwarden tests", ] format = [ - "isort -q src/vaultwarden", - "black -q src/vaultwarden", - "lint" + "ruff format src/vaultwarden tests", + "lint", ] [tool.ruff] -# Add "Q" to the list of enabled codes. -select = ["B", "E", "F", "I", "N", "Q", "RUF", "SIM", "TCH"] -ignore = ["N815"] -fixable = ["ALL"] src = ["src/vaultwarden", "tests"] exclude = ["src/vaultwarden/utils/crypto.py"] target-version = "py310" line-length = 79 -[tool.ruff.flake8-quotes] +[tool.ruff.lint] +# Add "Q" to the list of enabled codes. +select = ["B", "E", "F", "I", "N", "Q", "RUF", "SIM", "TCH"] +ignore = ["N815"] +fixable = ["ALL"] + +[tool.ruff.lint.flake8-quotes] docstring-quotes = "double" -[tool.ruff.flake8-bugbear] +[tool.ruff.lint.flake8-bugbear] extend-immutable-calls = ["typer.Argument"] -[tool.ruff.isort] +[tool.ruff.lint.isort] force-sort-within-sections = true -[tool.black] -line-length = 79 -target-version = ["py310", "py311"] - -[tool.isort] -profile = "black" -line_length = 80 +[tool.ruff.format] +quote-style = "double" +indent-style = "space" +skip-magic-trailing-comma = false +line-ending = "auto" [tool.mypy] ignore_missing_imports = true diff --git a/src/vaultwarden/clients/bitwarden.py b/src/vaultwarden/clients/bitwarden.py index c1ff25b..82eae74 100644 --- a/src/vaultwarden/clients/bitwarden.py +++ b/src/vaultwarden/clients/bitwarden.py @@ -34,9 +34,7 @@ def __init__( self._http_client = Client( base_url=f"{self.url}/", event_hooks={"response": [log_raise_for_status]}, - headers={ - "Bitwarden-Client-Version": "2024.1.0" - }, + headers={"Bitwarden-Client-Version": "2024.1.0"}, timeout=timeout, ) self._connect_token: ConnectToken | None = None diff --git a/src/vaultwarden/models/sync.py b/src/vaultwarden/models/sync.py index e7b3b1a..2e50448 100644 --- a/src/vaultwarden/models/sync.py +++ b/src/vaultwarden/models/sync.py @@ -84,9 +84,10 @@ class UserProfile(PermissiveBaseModel): Providers: list SecurityStamp: str TwoFactorEnabled: bool + # original Bitwarden doesn't support disabling users status: VaultwardenUserStatus = Field( - default=VaultwardenUserStatus.Enabled, # original Bitwarden doesn't support disabling users - validation_alias=AliasChoices("_status", "_Status") + default=VaultwardenUserStatus.Enabled, + validation_alias=AliasChoices("_status", "_Status"), ) diff --git a/tests/models/validation/test_bitwarden_models.py b/tests/models/validation/test_bitwarden_models.py index 8430052..657296e 100644 --- a/tests/models/validation/test_bitwarden_models.py +++ b/tests/models/validation/test_bitwarden_models.py @@ -1,12 +1,11 @@ import unittest from pydantic import TypeAdapter - from vaultwarden.models.bitwarden import ( + CollectionUser, Organization, - ResplistBitwarden, OrganizationUserDetails, - CollectionUser, + ResplistBitwarden, ) diff --git a/tests/models/validation/test_pascal_camel_cases.py b/tests/models/validation/test_pascal_camel_cases.py index 482d3fa..e9931c5 100644 --- a/tests/models/validation/test_pascal_camel_cases.py +++ b/tests/models/validation/test_pascal_camel_cases.py @@ -1,12 +1,11 @@ import unittest from pydantic import TypeAdapter - from src.vaultwarden.models.sync import SyncData, VaultwardenUser from vaultwarden.models.bitwarden import ( Organization, - ResplistBitwarden, OrganizationCollection, + ResplistBitwarden, ) diff --git a/tests/models/validation/test_vaultwarden_models.py b/tests/models/validation/test_vaultwarden_models.py index 18f3bdd..4cb475c 100644 --- a/tests/models/validation/test_vaultwarden_models.py +++ b/tests/models/validation/test_vaultwarden_models.py @@ -1,7 +1,6 @@ import unittest from pydantic import TypeAdapter - from vaultwarden.models.sync import VaultwardenUser