diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ddf6273..766ce12 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -17,9 +17,6 @@ permissions: contents: read jobs: - # -------------------------------------------------- - # Job 1: Linting and Testing (Runs on push and PR) - # -------------------------------------------------- # -------------------------------------------------- # Job 1: Linting and Testing (Runs on push and PR) # -------------------------------------------------- @@ -35,38 +32,21 @@ jobs: - name: Set up Python uses: actions/setup-python@v5 with: - python-version: '3.13' # Specify your desired Python version + python-version: '3.13' - # Install uv - name: Install uv uses: astral-sh/setup-uv@v5 - # Add uv to the PATH - - name: Add uv to PATH - run: echo "$HOME/.cargo/bin" >> $GITHUB_PATH - shell: bash - - name: Create virtual environment - run: uv venv - - name: Activate virtual environment - run: | - echo "PATH=$PATH:$PWD/.venv/bin" >> $GITHUB_PATH - echo "VIRTUAL_ENV=$PWD/.venv" >> $GITHUB_ENV - name: Install dependencies with uv run: | - # Install packages from requirements.txt and additional tools - uv pip install -r core_requirements.txt - uv pip install -r dev_requirements.txt + uv sync --group dev - name: Run pre-commit hooks uses: pre-commit/action@v3.0.1 - # pre-commit might internally use pip/virtualenv, uv installation - # primarily affects the main dependency installation step. - name: Run tests with coverage run: | - uv pip install pytest-cov - - uv run pytest --cov=sqlmodel_crud_utils --cov-report=xml --cov-report=term # Generate XML and terminal reports + uv run pytest --cov=sqlmodel_crud_utils --cov-report=xml --cov-report=term - name: Upload coverage report uses: actions/upload-artifact@v4 @@ -91,15 +71,13 @@ jobs: - name: Set up Python uses: actions/setup-python@v5 with: - python-version: '3.11' # Match the version used for testing + python-version: '3.13' - - name: Install build dependencies - run: | - python -m pip install --upgrade pip - pip install build + - name: Install uv + uses: astral-sh/setup-uv@v5 - name: Build source distribution and wheel - run: python -m build + run: uv build - name: Upload build artifacts uses: actions/upload-artifact@v4 @@ -140,13 +118,9 @@ jobs: with: tag_name: ${{ steps.get_version.outputs.TAG_NAME }} name: Release ${{ steps.get_version.outputs.TAG_NAME }} - # body: | # Optional: Add release notes here - # Release notes for version ${{ steps.get_version.outputs.TAG_NAME }} - # - Feature A - # - Bugfix B draft: false - prerelease: false # Set to true if it's a pre-release - files: dist/* # Upload all files from the dist directory + prerelease: false + files: dist/* # -------------------------------------------------- # Job 4: Publish to PyPI (Runs only on push to release/*) @@ -157,9 +131,9 @@ jobs: # Only run this job on direct pushes to release/* branches if: github.event_name == 'push' && startsWith(github.ref, 'refs/heads/release/') runs-on: ubuntu-latest - environment: # Optional: Define environment for PyPI publishing rules/secrets + environment: name: pypi - url: https://pypi.org/p/sqlmodel-crud-utils # Replace with your actual PyPI package URL + url: https://pypi.org/p/sqlmodel-crud-utils permissions: id-token: write # Required for trusted publishing steps: @@ -171,7 +145,6 @@ jobs: - name: Publish package to PyPI uses: pypa/gh-action-pypi-publish@release/v1 - # No need for secrets.PYPI_API_TOKEN if using trusted publishing with: user: __token__ password: ${{ secrets.PYPI_API_TOKEN }} diff --git a/core_requirements.in b/core_requirements.in deleted file mode 100644 index de006c4..0000000 --- a/core_requirements.in +++ /dev/null @@ -1,4 +0,0 @@ -loguru -python-dateutil -python-dotenv -sqlmodel \ No newline at end of file diff --git a/core_requirements.txt b/core_requirements.txt deleted file mode 100644 index 0352059..0000000 --- a/core_requirements.txt +++ /dev/null @@ -1,34 +0,0 @@ -# This file was autogenerated by uv via the following command: -# uv pip compile --strip-extras core_requirements.in -o core_requirements.txt -annotated-types==0.7.0 - # via pydantic -colorama==0.4.6 - # via loguru -greenlet==3.2.2 - # via sqlalchemy -loguru==0.7.3 - # via -r core_requirements.in -pydantic==2.11.4 - # via sqlmodel -pydantic-core==2.33.2 - # via pydantic -python-dateutil==2.9.0.post0 - # via -r core_requirements.in -python-dotenv==1.1.0 - # via -r core_requirements.in -six==1.17.0 - # via python-dateutil -sqlalchemy==2.0.41 - # via sqlmodel -sqlmodel==0.0.24 - # via -r core_requirements.in -typing-extensions==4.13.2 - # via - # pydantic - # pydantic-core - # sqlalchemy - # typing-inspection -typing-inspection==0.4.0 - # via pydantic -win32-setctime==1.2.0 - # via loguru diff --git a/dev_requirements.in b/dev_requirements.in deleted file mode 100644 index 883d686..0000000 --- a/dev_requirements.in +++ /dev/null @@ -1,14 +0,0 @@ --c core_requirements.txt - -aiosqlite -black -build -factory_boy -isort -pytest -pytest-asyncio -pytest-cov -pytest-json-report -pytest-html -pre-commit -ruff \ No newline at end of file diff --git a/dev_requirements.txt b/dev_requirements.txt deleted file mode 100644 index e20ae84..0000000 --- a/dev_requirements.txt +++ /dev/null @@ -1,91 +0,0 @@ -# This file was autogenerated by uv via the following command: -# uv pip compile --strip-extras dev_requirements.in -o dev_requirements.txt -aiosqlite==0.21.0 - # via -r dev_requirements.in -black==25.1.0 - # via -r dev_requirements.in -build==1.2.2.post1 - # via -r dev_requirements.in -cfgv==3.4.0 - # via pre-commit -click==8.2.0 - # via black -colorama==0.4.6 - # via - # -c core_requirements.txt - # build - # click - # pytest -coverage==7.8.0 - # via pytest-cov -distlib==0.3.9 - # via virtualenv -factory-boy==3.3.3 - # via -r dev_requirements.in -faker==37.3.0 - # via factory-boy -filelock==3.18.0 - # via virtualenv -identify==2.6.10 - # via pre-commit -iniconfig==2.1.0 - # via pytest -isort==6.0.1 - # via -r dev_requirements.in -jinja2==3.1.6 - # via pytest-html -markupsafe==3.0.2 - # via jinja2 -mypy-extensions==1.1.0 - # via black -nodeenv==1.9.1 - # via pre-commit -packaging==25.0 - # via - # black - # build - # pytest -pathspec==0.12.1 - # via black -platformdirs==4.3.8 - # via - # black - # virtualenv -pluggy==1.6.0 - # via pytest -pre-commit==4.2.0 - # via -r dev_requirements.in -pyproject-hooks==1.2.0 - # via build -pytest==8.3.5 - # via - # -r dev_requirements.in - # pytest-asyncio - # pytest-cov - # pytest-html - # pytest-json-report - # pytest-metadata -pytest-asyncio==0.26.0 - # via -r dev_requirements.in -pytest-cov==6.1.1 - # via -r dev_requirements.in -pytest-html==4.1.1 - # via -r dev_requirements.in -pytest-json-report==1.5.0 - # via -r dev_requirements.in -pytest-metadata==3.1.1 - # via - # pytest-html - # pytest-json-report -pyyaml==6.0.2 - # via pre-commit -ruff==0.11.10 - # via -r dev_requirements.in -typing-extensions==4.13.2 - # via - # -c core_requirements.txt - # aiosqlite -tzdata==2025.2 - # via faker -virtualenv==20.31.2 - # via pre-commit diff --git a/pyproject.toml b/pyproject.toml index 3768828..44a2ebd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -58,7 +58,7 @@ line_length = 80 [project] name = "sqlmodel_crud_utilities" -version = "0.1.0" +version = "0.2.0" authors = [ { name="Francis Secada", email = "francis.secada@gmail.com" } ] @@ -91,6 +91,7 @@ dev = [ "build>=1.2.2.post1", "factory-boy>=3.3.3", "isort>=6.0.1", + "loguru>=0.7.3", "pre-commit>=4.2.0", "pytest>=8.3.5", "pytest-asyncio>=0.26.0", @@ -100,6 +101,9 @@ dev = [ "ruff>=0.11.10", ] +doc = [ + "pdoc>=15.0.1", +] doc = [ "pdoc>=15.0.1", diff --git a/sqlmodel_crud_utils/a_sync.py b/sqlmodel_crud_utils/a_sync.py index f50778c..da9a929 100644 --- a/sqlmodel_crud_utils/a_sync.py +++ b/sqlmodel_crud_utils/a_sync.py @@ -10,12 +10,8 @@ from sqlmodel.ext.asyncio.session import AsyncSession from sqlmodel.sql.expression import SelectOfScalar -from sqlmodel_crud_utils.utils import ( - get_sql_dialect_import, - get_val, - is_date, - logger, -) +from sqlmodel_crud_utils.utils import (get_sql_dialect_import, get_val, + is_date, logger) load_dotenv() # take environment variables from .env. diff --git a/sqlmodel_crud_utils/sync.py b/sqlmodel_crud_utils/sync.py index 3d3f090..0fb8cbe 100644 --- a/sqlmodel_crud_utils/sync.py +++ b/sqlmodel_crud_utils/sync.py @@ -9,12 +9,8 @@ from sqlmodel import Session, SQLModel, select from sqlmodel.sql.expression import SelectOfScalar -from sqlmodel_crud_utils.utils import ( - get_sql_dialect_import, - get_val, - is_date, - logger, -) +from sqlmodel_crud_utils.utils import (get_sql_dialect_import, get_val, + is_date, logger) load_dotenv() # take environment variables from .env. diff --git a/tests/conftest.py b/tests/conftest.py index 7c897a3..74630e7 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -6,18 +6,14 @@ import pytest import pytest_asyncio from sqlalchemy import Engine, create_engine -from sqlalchemy.ext.asyncio import ( - AsyncEngine, - async_sessionmaker, - create_async_engine, -) +from sqlalchemy.ext.asyncio import (AsyncEngine, async_sessionmaker, + create_async_engine) from sqlalchemy.orm import sessionmaker from sqlmodel import Session as SQLModelSession # Import SQLModel Session from sqlmodel import SQLModel from sqlmodel import create_engine as create_sqlmodel_engine -from sqlmodel.ext.asyncio.session import ( - AsyncSession as SQLModelAsyncSession, # Import SQLModel AsyncSession -) +from sqlmodel.ext.asyncio.session import \ + AsyncSession as SQLModelAsyncSession # Import SQLModel AsyncSession from .models import MockModel, MockRelatedModel diff --git a/tests/test_async_utils.py b/tests/test_async_utils.py index 0fe2625..3926ba1 100644 --- a/tests/test_async_utils.py +++ b/tests/test_async_utils.py @@ -5,36 +5,29 @@ from unittest.mock import AsyncMock, MagicMock, call, patch import pytest -from sqlmodel import ( # Import Relationship if needed for model definition - select, -) +from sqlmodel import \ + select # Import Relationship if needed for model definition from sqlmodel.ext.asyncio.session import AsyncSession -from sqlmodel_crud_utils.a_sync import ( - bulk_upsert_mappings as async_bulk_upsert_mappings, -) +from sqlmodel_crud_utils.a_sync import \ + bulk_upsert_mappings as async_bulk_upsert_mappings from sqlmodel_crud_utils.a_sync import delete_row as async_delete_row -from sqlmodel_crud_utils.a_sync import ( - get_one_or_create as async_get_one_or_create, -) -from sqlmodel_crud_utils.a_sync import ( - get_result_from_query as async_get_result_from_query, -) +from sqlmodel_crud_utils.a_sync import \ + get_one_or_create as async_get_one_or_create +from sqlmodel_crud_utils.a_sync import \ + get_result_from_query as async_get_result_from_query from sqlmodel_crud_utils.a_sync import get_row as async_get_row from sqlmodel_crud_utils.a_sync import get_rows as async_get_rows -from sqlmodel_crud_utils.a_sync import ( - get_rows_within_id_list as async_get_rows_within_id_list, -) -from sqlmodel_crud_utils.a_sync import ( - insert_data_rows as async_insert_data_rows, -) +from sqlmodel_crud_utils.a_sync import \ + get_rows_within_id_list as async_get_rows_within_id_list +from sqlmodel_crud_utils.a_sync import \ + insert_data_rows as async_insert_data_rows from sqlmodel_crud_utils.a_sync import update_row as async_update_row from sqlmodel_crud_utils.a_sync import write_row as async_write_row from .conftest import MockModelFactory, MockRelatedModelFactory -from .models import ( # Assuming MockRelatedModel is needed for relationship - MockModel, -) +from .models import \ + MockModel # Assuming MockRelatedModel is needed for relationship # --- Tests for get_result_from_query --- # (No changes needed for these tests - they use real sessions) diff --git a/tests/test_sync_utils.py b/tests/test_sync_utils.py index d94567f..cef7bab 100644 --- a/tests/test_sync_utils.py +++ b/tests/test_sync_utils.py @@ -6,19 +6,17 @@ from sqlmodel import Session, select # Keep Session for type hints -from sqlmodel_crud_utils.sync import ( - bulk_upsert_mappings as sync_bulk_upsert_mappings, -) +from sqlmodel_crud_utils.sync import \ + bulk_upsert_mappings as sync_bulk_upsert_mappings from sqlmodel_crud_utils.sync import delete_row as sync_delete_row -from sqlmodel_crud_utils.sync import get_one_or_create as sync_get_one_or_create -from sqlmodel_crud_utils.sync import ( - get_result_from_query as sync_get_result_from_query, -) +from sqlmodel_crud_utils.sync import \ + get_one_or_create as sync_get_one_or_create +from sqlmodel_crud_utils.sync import \ + get_result_from_query as sync_get_result_from_query from sqlmodel_crud_utils.sync import get_row as sync_get_row from sqlmodel_crud_utils.sync import get_rows as sync_get_rows -from sqlmodel_crud_utils.sync import ( - get_rows_within_id_list as sync_get_rows_within_id_list, -) +from sqlmodel_crud_utils.sync import \ + get_rows_within_id_list as sync_get_rows_within_id_list from sqlmodel_crud_utils.sync import insert_data_rows as sync_insert_data_rows from sqlmodel_crud_utils.sync import update_row as sync_update_row from sqlmodel_crud_utils.sync import write_row as sync_write_row