Files
Imago/fail.log
T
bruno 2f2a5e9b4a
CI / Lint & Format (push) Failing after 28s
CI / Tests (push) Has been skipped
CI / Security Scan (push) Failing after 8s
CI / Docker Build (push) Has been skipped
Add admin panel, WebSocket support, and API versioning
Introduce an admin portal (React + Nginx), WebSocket routing, and
API versioning middleware with `/api/v1/` prefix deprecation.
Add master API key authentication, new Prometheus metrics for AI
token consumption and active WebSockets, and extend S3 config
with a public endpoint URL. Update test paths and fixtures to
align with the new routing structure.
2026-06-22 11:25:22 -04:00

929 lines
145 KiB
Plaintext

c:\Users\bruno\scoop\apps\python\3.14.3\Lib\site-packages\pytest_asyncio\plugin.py:208: PytestDeprecationWarning: The configuration option "asyncio_default_fixture_loop_scope" is unset.
The event loop scope for asynchronous fixtures will default to the fixture caching scope. Future versions of pytest-asyncio will default the loop scope for asynchronous fixtures to function scope. Set the default fixture loop scope explicitly in order to avoid unexpected behavior in the future. Valid fixture loop scopes are: "function", "class", "module", "package", "session"
warnings.warn(PytestDeprecationWarning(_DEFAULT_FIXTURE_LOOP_SCOPE_UNSET))
============================= test session starts =============================
platform win32 -- Python 3.14.3, pytest-8.3.3, pluggy-1.6.0
rootdir: C:\dev\git\python\imago
configfile: pytest.ini
plugins: anyio-4.12.0, asyncio-0.24.0, cov-5.0.0, mock-3.15.1, respx-0.22.0
asyncio: mode=Mode.AUTO, default_loop_scope=None
collected 7 items
tests\test_services.py F.F...F [100%]
================================== FAILURES ===================================
___________________________ test_exif_missing_file ____________________________
def test_exif_missing_file():
from app.services.exif_service import extract_exif
result = extract_exif("/tmp/non_existant.jpg")
> assert result["make"] is None
E TypeError: 'coroutine' object is not subscriptable
tests\test_services.py:15: TypeError
---------------------------- Captured stdout setup ----------------------------
2026-02-25T15:57:39.485432Z [debug ] Using proactor: IocpProactor [asyncio]
2026-02-25T15:57:39.487781Z [debug ] executing <function connect.<locals>.connector at 0x0000026E92512140> [aiosqlite]
2026-02-25T15:57:39.488325Z [debug ] operation <function connect.<locals>.connector at 0x0000026E92512140> completed [aiosqlite]
2026-02-25T15:57:39.489029Z [debug ] executing functools.partial(<built-in method create_function of sqlite3.Connection object at 0x0000026E9249F4C0>, 'regexp', 2, <function SQLiteDialect_pysqlite.on_connect.<locals>.regexp at 0x0000026E923D8510>, deterministic=True) [aiosqlite]
2026-02-25T15:57:39.489748Z [debug ] operation functools.partial(<built-in method create_function of sqlite3.Connection object at 0x0000026E9249F4C0>, 'regexp', 2, <function SQLiteDialect_pysqlite.on_connect.<locals>.regexp at 0x0000026E923D8510>, deterministic=True) completed [aiosqlite]
2026-02-25T15:57:39.490128Z [debug ] executing functools.partial(<built-in method create_function of sqlite3.Connection object at 0x0000026E9249F4C0>, 'floor', 1, <built-in function floor>, deterministic=True) [aiosqlite]
2026-02-25T15:57:39.490300Z [debug ] operation functools.partial(<built-in method create_function of sqlite3.Connection object at 0x0000026E9249F4C0>, 'floor', 1, <built-in function floor>, deterministic=True) completed [aiosqlite]
2026-02-25T15:57:39.490606Z [debug ] executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:39.490744Z [debug ] operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:39.491000Z [debug ] executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92551940>, 'PRAGMA read_uncommitted', []) [aiosqlite]
2026-02-25T15:57:39.491204Z [debug ] operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92551940>, 'PRAGMA read_uncommitted', []) completed [aiosqlite]
2026-02-25T15:57:39.491475Z [debug ] executing functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E92551940>) [aiosqlite]
2026-02-25T15:57:39.491620Z [debug ] operation functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E92551940>) completed [aiosqlite]
2026-02-25T15:57:39.491863Z [debug ] executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92551940>) [aiosqlite]
2026-02-25T15:57:39.492016Z [debug ] operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92551940>) completed [aiosqlite]
2026-02-25T15:57:39.492326Z [debug ] executing functools.partial(<built-in method rollback of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:39.492582Z [debug ] operation functools.partial(<built-in method rollback of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:39.493265Z [debug ] executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:39.493424Z [debug ] operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:39.493673Z [debug ] executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92551AC0>, 'PRAGMA main.table_info("images")', ()) [aiosqlite]
2026-02-25T15:57:39.493968Z [debug ] operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92551AC0>, 'PRAGMA main.table_info("images")', ()) completed [aiosqlite]
2026-02-25T15:57:39.494194Z [debug ] executing functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E92551AC0>) [aiosqlite]
2026-02-25T15:57:39.494327Z [debug ] operation functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E92551AC0>) completed [aiosqlite]
2026-02-25T15:57:39.494538Z [debug ] executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92551AC0>) [aiosqlite]
2026-02-25T15:57:39.494786Z [debug ] operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92551AC0>) completed [aiosqlite]
2026-02-25T15:57:39.495367Z [debug ] executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:39.495569Z [debug ] operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:39.495865Z [debug ] executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92551BC0>, 'PRAGMA temp.table_info("images")', ()) [aiosqlite]
2026-02-25T15:57:39.496043Z [debug ] operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92551BC0>, 'PRAGMA temp.table_info("images")', ()) completed [aiosqlite]
2026-02-25T15:57:39.496307Z [debug ] executing functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E92551BC0>) [aiosqlite]
2026-02-25T15:57:39.496439Z [debug ] operation functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E92551BC0>) completed [aiosqlite]
2026-02-25T15:57:39.496668Z [debug ] executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92551BC0>) [aiosqlite]
2026-02-25T15:57:39.496807Z [debug ] operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92551BC0>) completed [aiosqlite]
2026-02-25T15:57:39.497235Z [debug ] executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:39.497386Z [debug ] operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:39.497635Z [debug ] executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92551CC0>, 'PRAGMA main.table_info("api_clients")', ()) [aiosqlite]
2026-02-25T15:57:39.497807Z [debug ] operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92551CC0>, 'PRAGMA main.table_info("api_clients")', ()) completed [aiosqlite]
2026-02-25T15:57:39.498038Z [debug ] executing functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E92551CC0>) [aiosqlite]
2026-02-25T15:57:39.498191Z [debug ] operation functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E92551CC0>) completed [aiosqlite]
2026-02-25T15:57:39.498471Z [debug ] executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92551CC0>) [aiosqlite]
2026-02-25T15:57:39.498708Z [debug ] operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92551CC0>) completed [aiosqlite]
2026-02-25T15:57:39.499082Z [debug ] executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:39.499276Z [debug ] operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:39.499533Z [debug ] executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92551D40>, 'PRAGMA temp.table_info("api_clients")', ()) [aiosqlite]
2026-02-25T15:57:39.499692Z [debug ] operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92551D40>, 'PRAGMA temp.table_info("api_clients")', ()) completed [aiosqlite]
2026-02-25T15:57:39.499962Z [debug ] executing functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E92551D40>) [aiosqlite]
2026-02-25T15:57:39.500096Z [debug ] operation functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E92551D40>) completed [aiosqlite]
2026-02-25T15:57:39.500329Z [debug ] executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92551D40>) [aiosqlite]
2026-02-25T15:57:39.500531Z [debug ] operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92551D40>) completed [aiosqlite]
2026-02-25T15:57:39.501477Z [debug ] executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:39.501613Z [debug ] operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:39.501858Z [debug ] executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92551DC0>, '\nCREATE TABLE api_clients (\n\tid VARCHAR(36) NOT NULL, \n\tname VARCHAR(256) NOT NULL, \n\tapi_key_hash VARCHAR(64) NOT NULL, \n\tscopes JSON NOT NULL, \n\t"plan" VARCHAR(8) NOT NULL, \n\tis_active BOOLEAN NOT NULL, \n\tstorage_used_bytes BIGINT NOT NULL, \n\tquota_storage_mb INTEGER NOT NULL, \n\tquota_images INTEGER NOT NULL, \n\tcreated_at DATETIME, \n\tupdated_at DATETIME, \n\tPRIMARY KEY (id)\n)\n\n', ()) [aiosqlite]
2026-02-25T15:57:39.502175Z [debug ] operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92551DC0>, '\nCREATE TABLE api_clients (\n\tid VARCHAR(36) NOT NULL, \n\tname VARCHAR(256) NOT NULL, \n\tapi_key_hash VARCHAR(64) NOT NULL, \n\tscopes JSON NOT NULL, \n\t"plan" VARCHAR(8) NOT NULL, \n\tis_active BOOLEAN NOT NULL, \n\tstorage_used_bytes BIGINT NOT NULL, \n\tquota_storage_mb INTEGER NOT NULL, \n\tquota_images INTEGER NOT NULL, \n\tcreated_at DATETIME, \n\tupdated_at DATETIME, \n\tPRIMARY KEY (id)\n)\n\n', ()) completed [aiosqlite]
2026-02-25T15:57:39.502454Z [debug ] executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92551DC0>) [aiosqlite]
2026-02-25T15:57:39.502595Z [debug ] operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92551DC0>) completed [aiosqlite]
2026-02-25T15:57:39.503027Z [debug ] executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:39.503275Z [debug ] operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:39.503627Z [debug ] executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92552FC0>, 'CREATE UNIQUE INDEX ix_api_clients_api_key_hash ON api_clients (api_key_hash)', ()) [aiosqlite]
2026-02-25T15:57:39.504042Z [debug ] operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92552FC0>, 'CREATE UNIQUE INDEX ix_api_clients_api_key_hash ON api_clients (api_key_hash)', ()) completed [aiosqlite]
2026-02-25T15:57:39.504463Z [debug ] executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92552FC0>) [aiosqlite]
2026-02-25T15:57:39.504684Z [debug ] operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92552FC0>) completed [aiosqlite]
2026-02-25T15:57:39.505114Z [debug ] executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:39.505355Z [debug ] operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:39.505645Z [debug ] executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92553340>, 'CREATE INDEX ix_api_clients_id ON api_clients (id)', ()) [aiosqlite]
2026-02-25T15:57:39.506013Z [debug ] operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92553340>, 'CREATE INDEX ix_api_clients_id ON api_clients (id)', ()) completed [aiosqlite]
2026-02-25T15:57:39.506286Z [debug ] executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92553340>) [aiosqlite]
2026-02-25T15:57:39.506440Z [debug ] operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92553340>) completed [aiosqlite]
2026-02-25T15:57:39.507240Z [debug ] executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:39.507386Z [debug ] operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:39.507615Z [debug ] executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925523C0>, '\nCREATE TABLE images (\n\tid INTEGER NOT NULL, \n\tuuid VARCHAR(36) NOT NULL, \n\tclient_id VARCHAR(36) NOT NULL, \n\toriginal_name VARCHAR(512) NOT NULL, \n\tfilename VARCHAR(512) NOT NULL, \n\tfile_path VARCHAR(1024) NOT NULL, \n\tthumbnail_path VARCHAR(1024), \n\tmime_type VARCHAR(128), \n\tfile_size BIGINT, \n\twidth INTEGER, \n\theight INTEGER, \n\tuploaded_at DATETIME, \n\tprocessing_status VARCHAR(10) NOT NULL, \n\tprocessing_error TEXT, \n\tprocessing_started_at DATETIME, \n\tprocessing_done_at DATETIME, \n\texif_raw JSON, \n\texif_make VARCHAR(256), \n\texif_model VARCHAR(256), \n\texif_lens VARCHAR(256), \n\texif_taken_at DATETIME, \n\texif_gps_lat FLOAT, \n\texif_gps_lon FLOAT, \n\texif_altitude FLOAT, \n\texif_iso INTEGER, \n\texif_aperture VARCHAR(32), \n\texif_shutter VARCHAR(32), \n\texif_focal VARCHAR(32), \n\texif_flash BOOLEAN, \n\texif_orientation INTEGER, \n\texif_software VARCHAR(256), \n\tocr_text TEXT, \n\tocr_language VARCHAR(64), \n\tocr_confidence FLOAT, \n\tocr_has_text BOOLEAN, \n\tai_description TEXT, \n\tai_tags JSON, \n\tai_confidence FLOAT, \n\tai_model_used VARCHAR(128), \n\tai_processed_at DATETIME, \n\tai_prompt_tokens INTEGER, \n\tai_output_tokens INTEGER, \n\tPRIMARY KEY (id), \n\tFOREIGN KEY(client_id) REFERENCES api_clients (id)\n)\n\n', ()) [aiosqlite]
2026-02-25T15:57:39.507985Z [debug ] operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925523C0>, '\nCREATE TABLE images (\n\tid INTEGER NOT NULL, \n\tuuid VARCHAR(36) NOT NULL, \n\tclient_id VARCHAR(36) NOT NULL, \n\toriginal_name VARCHAR(512) NOT NULL, \n\tfilename VARCHAR(512) NOT NULL, \n\tfile_path VARCHAR(1024) NOT NULL, \n\tthumbnail_path VARCHAR(1024), \n\tmime_type VARCHAR(128), \n\tfile_size BIGINT, \n\twidth INTEGER, \n\theight INTEGER, \n\tuploaded_at DATETIME, \n\tprocessing_status VARCHAR(10) NOT NULL, \n\tprocessing_error TEXT, \n\tprocessing_started_at DATETIME, \n\tprocessing_done_at DATETIME, \n\texif_raw JSON, \n\texif_make VARCHAR(256), \n\texif_model VARCHAR(256), \n\texif_lens VARCHAR(256), \n\texif_taken_at DATETIME, \n\texif_gps_lat FLOAT, \n\texif_gps_lon FLOAT, \n\texif_altitude FLOAT, \n\texif_iso INTEGER, \n\texif_aperture VARCHAR(32), \n\texif_shutter VARCHAR(32), \n\texif_focal VARCHAR(32), \n\texif_flash BOOLEAN, \n\texif_orientation INTEGER, \n\texif_software VARCHAR(256), \n\tocr_text TEXT, \n\tocr_language VARCHAR(64), \n\tocr_confidence FLOAT, \n\tocr_has_text BOOLEAN, \n\tai_description TEXT, \n\tai_tags JSON, \n\tai_confidence FLOAT, \n\tai_model_used VARCHAR(128), \n\tai_processed_at DATETIME, \n\tai_prompt_tokens INTEGER, \n\tai_output_tokens INTEGER, \n\tPRIMARY KEY (id), \n\tFOREIGN KEY(client_id) REFERENCES api_clients (id)\n)\n\n', ()) completed [aiosqlite]
2026-02-25T15:57:39.508279Z [debug ] executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925523C0>) [aiosqlite]
2026-02-25T15:57:39.508429Z [debug ] operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925523C0>) completed [aiosqlite]
2026-02-25T15:57:39.508876Z [debug ] executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:39.509020Z [debug ] operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:39.509267Z [debug ] executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92553840>, 'CREATE UNIQUE INDEX ix_images_uuid ON images (uuid)', ()) [aiosqlite]
2026-02-25T15:57:39.509554Z [debug ] operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92553840>, 'CREATE UNIQUE INDEX ix_images_uuid ON images (uuid)', ()) completed [aiosqlite]
2026-02-25T15:57:39.509826Z [debug ] executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92553840>) [aiosqlite]
2026-02-25T15:57:39.509964Z [debug ] operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92553840>) completed [aiosqlite]
2026-02-25T15:57:39.510327Z [debug ] executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:39.510462Z [debug ] operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:39.510678Z [debug ] executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92552640>, 'CREATE INDEX ix_images_id ON images (id)', ()) [aiosqlite]
2026-02-25T15:57:39.510870Z [debug ] operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92552640>, 'CREATE INDEX ix_images_id ON images (id)', ()) completed [aiosqlite]
2026-02-25T15:57:39.511090Z [debug ] executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92552640>) [aiosqlite]
2026-02-25T15:57:39.511223Z [debug ] operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92552640>) completed [aiosqlite]
2026-02-25T15:57:39.511502Z [debug ] executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:39.511632Z [debug ] operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:39.511835Z [debug ] executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92553740>, 'CREATE INDEX ix_images_client_id ON images (client_id)', ()) [aiosqlite]
2026-02-25T15:57:39.512035Z [debug ] operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92553740>, 'CREATE INDEX ix_images_client_id ON images (client_id)', ()) completed [aiosqlite]
2026-02-25T15:57:39.512287Z [debug ] executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92553740>) [aiosqlite]
2026-02-25T15:57:39.512529Z [debug ] operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92553740>) completed [aiosqlite]
2026-02-25T15:57:39.512901Z [debug ] executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:39.513036Z [debug ] operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:39.513259Z [debug ] executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925520C0>, 'CREATE INDEX ix_images_processing_status ON images (processing_status)', ()) [aiosqlite]
2026-02-25T15:57:39.513450Z [debug ] operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925520C0>, 'CREATE INDEX ix_images_processing_status ON images (processing_status)', ()) completed [aiosqlite]
2026-02-25T15:57:39.513759Z [debug ] executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925520C0>) [aiosqlite]
2026-02-25T15:57:39.514011Z [debug ] operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925520C0>) completed [aiosqlite]
2026-02-25T15:57:39.514429Z [debug ] executing functools.partial(<built-in method commit of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:39.514579Z [debug ] operation functools.partial(<built-in method commit of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:39.514874Z [debug ] executing functools.partial(<built-in method rollback of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:39.515006Z [debug ] operation functools.partial(<built-in method rollback of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
----------------------------- Captured log setup ------------------------------
DEBUG asyncio:proactor_events.py:633 Using proactor: IocpProactor
DEBUG aiosqlite:core.py:114 executing <function connect.<locals>.connector at 0x0000026E92512140>
DEBUG aiosqlite:core.py:116 operation <function connect.<locals>.connector at 0x0000026E92512140> completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method create_function of sqlite3.Connection object at 0x0000026E9249F4C0>, 'regexp', 2, <function SQLiteDialect_pysqlite.on_connect.<locals>.regexp at 0x0000026E923D8510>, deterministic=True)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method create_function of sqlite3.Connection object at 0x0000026E9249F4C0>, 'regexp', 2, <function SQLiteDialect_pysqlite.on_connect.<locals>.regexp at 0x0000026E923D8510>, deterministic=True) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method create_function of sqlite3.Connection object at 0x0000026E9249F4C0>, 'floor', 1, <built-in function floor>, deterministic=True)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method create_function of sqlite3.Connection object at 0x0000026E9249F4C0>, 'floor', 1, <built-in function floor>, deterministic=True) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92551940>, 'PRAGMA read_uncommitted', [])
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92551940>, 'PRAGMA read_uncommitted', []) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E92551940>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E92551940>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92551940>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92551940>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method rollback of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method rollback of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92551AC0>, 'PRAGMA main.table_info("images")', ())
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92551AC0>, 'PRAGMA main.table_info("images")', ()) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E92551AC0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E92551AC0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92551AC0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92551AC0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92551BC0>, 'PRAGMA temp.table_info("images")', ())
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92551BC0>, 'PRAGMA temp.table_info("images")', ()) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E92551BC0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E92551BC0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92551BC0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92551BC0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92551CC0>, 'PRAGMA main.table_info("api_clients")', ())
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92551CC0>, 'PRAGMA main.table_info("api_clients")', ()) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E92551CC0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E92551CC0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92551CC0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92551CC0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92551D40>, 'PRAGMA temp.table_info("api_clients")', ())
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92551D40>, 'PRAGMA temp.table_info("api_clients")', ()) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E92551D40>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E92551D40>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92551D40>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92551D40>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92551DC0>, '\nCREATE TABLE api_clients (\n\tid VARCHAR(36) NOT NULL, \n\tname VARCHAR(256) NOT NULL, \n\tapi_key_hash VARCHAR(64) NOT NULL, \n\tscopes JSON NOT NULL, \n\t"plan" VARCHAR(8) NOT NULL, \n\tis_active BOOLEAN NOT NULL, \n\tstorage_used_bytes BIGINT NOT NULL, \n\tquota_storage_mb INTEGER NOT NULL, \n\tquota_images INTEGER NOT NULL, \n\tcreated_at DATETIME, \n\tupdated_at DATETIME, \n\tPRIMARY KEY (id)\n)\n\n', ())
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92551DC0>, '\nCREATE TABLE api_clients (\n\tid VARCHAR(36) NOT NULL, \n\tname VARCHAR(256) NOT NULL, \n\tapi_key_hash VARCHAR(64) NOT NULL, \n\tscopes JSON NOT NULL, \n\t"plan" VARCHAR(8) NOT NULL, \n\tis_active BOOLEAN NOT NULL, \n\tstorage_used_bytes BIGINT NOT NULL, \n\tquota_storage_mb INTEGER NOT NULL, \n\tquota_images INTEGER NOT NULL, \n\tcreated_at DATETIME, \n\tupdated_at DATETIME, \n\tPRIMARY KEY (id)\n)\n\n', ()) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92551DC0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92551DC0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92552FC0>, 'CREATE UNIQUE INDEX ix_api_clients_api_key_hash ON api_clients (api_key_hash)', ())
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92552FC0>, 'CREATE UNIQUE INDEX ix_api_clients_api_key_hash ON api_clients (api_key_hash)', ()) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92552FC0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92552FC0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92553340>, 'CREATE INDEX ix_api_clients_id ON api_clients (id)', ())
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92553340>, 'CREATE INDEX ix_api_clients_id ON api_clients (id)', ()) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92553340>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92553340>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925523C0>, '\nCREATE TABLE images (\n\tid INTEGER NOT NULL, \n\tuuid VARCHAR(36) NOT NULL, \n\tclient_id VARCHAR(36) NOT NULL, \n\toriginal_name VARCHAR(512) NOT NULL, \n\tfilename VARCHAR(512) NOT NULL, \n\tfile_path VARCHAR(1024) NOT NULL, \n\tthumbnail_path VARCHAR(1024), \n\tmime_type VARCHAR(128), \n\tfile_size BIGINT, \n\twidth INTEGER, \n\theight INTEGER, \n\tuploaded_at DATETIME, \n\tprocessing_status VARCHAR(10) NOT NULL, \n\tprocessing_error TEXT, \n\tprocessing_started_at DATETIME, \n\tprocessing_done_at DATETIME, \n\texif_raw JSON, \n\texif_make VARCHAR(256), \n\texif_model VARCHAR(256), \n\texif_lens VARCHAR(256), \n\texif_taken_at DATETIME, \n\texif_gps_lat FLOAT, \n\texif_gps_lon FLOAT, \n\texif_altitude FLOAT, \n\texif_iso INTEGER, \n\texif_aperture VARCHAR(32), \n\texif_shutter VARCHAR(32), \n\texif_focal VARCHAR(32), \n\texif_flash BOOLEAN, \n\texif_orientation INTEGER, \n\texif_software VARCHAR(256), \n\tocr_text TEXT, \n\tocr_language VARCHAR(64), \n\tocr_confidence FLOAT, \n\tocr_has_text BOOLEAN, \n\tai_description TEXT, \n\tai_tags JSON, \n\tai_confidence FLOAT, \n\tai_model_used VARCHAR(128), \n\tai_processed_at DATETIME, \n\tai_prompt_tokens INTEGER, \n\tai_output_tokens INTEGER, \n\tPRIMARY KEY (id), \n\tFOREIGN KEY(client_id) REFERENCES api_clients (id)\n)\n\n', ())
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925523C0>, '\nCREATE TABLE images (\n\tid INTEGER NOT NULL, \n\tuuid VARCHAR(36) NOT NULL, \n\tclient_id VARCHAR(36) NOT NULL, \n\toriginal_name VARCHAR(512) NOT NULL, \n\tfilename VARCHAR(512) NOT NULL, \n\tfile_path VARCHAR(1024) NOT NULL, \n\tthumbnail_path VARCHAR(1024), \n\tmime_type VARCHAR(128), \n\tfile_size BIGINT, \n\twidth INTEGER, \n\theight INTEGER, \n\tuploaded_at DATETIME, \n\tprocessing_status VARCHAR(10) NOT NULL, \n\tprocessing_error TEXT, \n\tprocessing_started_at DATETIME, \n\tprocessing_done_at DATETIME, \n\texif_raw JSON, \n\texif_make VARCHAR(256), \n\texif_model VARCHAR(256), \n\texif_lens VARCHAR(256), \n\texif_taken_at DATETIME, \n\texif_gps_lat FLOAT, \n\texif_gps_lon FLOAT, \n\texif_altitude FLOAT, \n\texif_iso INTEGER, \n\texif_aperture VARCHAR(32), \n\texif_shutter VARCHAR(32), \n\texif_focal VARCHAR(32), \n\texif_flash BOOLEAN, \n\texif_orientation INTEGER, \n\texif_software VARCHAR(256), \n\tocr_text TEXT, \n\tocr_language VARCHAR(64), \n\tocr_confidence FLOAT, \n\tocr_has_text BOOLEAN, \n\tai_description TEXT, \n\tai_tags JSON, \n\tai_confidence FLOAT, \n\tai_model_used VARCHAR(128), \n\tai_processed_at DATETIME, \n\tai_prompt_tokens INTEGER, \n\tai_output_tokens INTEGER, \n\tPRIMARY KEY (id), \n\tFOREIGN KEY(client_id) REFERENCES api_clients (id)\n)\n\n', ()) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925523C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925523C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92553840>, 'CREATE UNIQUE INDEX ix_images_uuid ON images (uuid)', ())
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92553840>, 'CREATE UNIQUE INDEX ix_images_uuid ON images (uuid)', ()) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92553840>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92553840>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92552640>, 'CREATE INDEX ix_images_id ON images (id)', ())
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92552640>, 'CREATE INDEX ix_images_id ON images (id)', ()) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92552640>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92552640>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92553740>, 'CREATE INDEX ix_images_client_id ON images (client_id)', ())
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92553740>, 'CREATE INDEX ix_images_client_id ON images (client_id)', ()) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92553740>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92553740>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925520C0>, 'CREATE INDEX ix_images_processing_status ON images (processing_status)', ())
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925520C0>, 'CREATE INDEX ix_images_processing_status ON images (processing_status)', ()) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925520C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925520C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method commit of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method commit of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method rollback of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method rollback of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
-------------------------- Captured stdout teardown ---------------------------
2026-02-25T15:57:39.810739Z [debug ] executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:39.811135Z [debug ] operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:39.811538Z [debug ] executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925E3740>, 'PRAGMA main.table_info("images")', ()) [aiosqlite]
2026-02-25T15:57:39.811843Z [debug ] operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925E3740>, 'PRAGMA main.table_info("images")', ()) completed [aiosqlite]
2026-02-25T15:57:39.812178Z [debug ] executing functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E925E3740>) [aiosqlite]
2026-02-25T15:57:39.812474Z [debug ] operation functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E925E3740>) completed [aiosqlite]
2026-02-25T15:57:39.812833Z [debug ] executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925E3740>) [aiosqlite]
2026-02-25T15:57:39.813069Z [debug ] operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925E3740>) completed [aiosqlite]
2026-02-25T15:57:39.813600Z [debug ] executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:39.813825Z [debug ] operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:39.814204Z [debug ] executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925E3940>, 'PRAGMA main.table_info("api_clients")', ()) [aiosqlite]
2026-02-25T15:57:39.814427Z [debug ] operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925E3940>, 'PRAGMA main.table_info("api_clients")', ()) completed [aiosqlite]
2026-02-25T15:57:39.814655Z [debug ] executing functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E925E3940>) [aiosqlite]
2026-02-25T15:57:39.814794Z [debug ] operation functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E925E3940>) completed [aiosqlite]
2026-02-25T15:57:39.815104Z [debug ] executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925E3940>) [aiosqlite]
2026-02-25T15:57:39.815256Z [debug ] operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925E3940>) completed [aiosqlite]
2026-02-25T15:57:39.815717Z [debug ] executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:39.815863Z [debug ] operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:39.816132Z [debug ] executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925E38C0>, '\nDROP TABLE images', ()) [aiosqlite]
2026-02-25T15:57:39.816494Z [debug ] operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925E38C0>, '\nDROP TABLE images', ()) completed [aiosqlite]
2026-02-25T15:57:39.816770Z [debug ] executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925E38C0>) [aiosqlite]
2026-02-25T15:57:39.816906Z [debug ] operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925E38C0>) completed [aiosqlite]
2026-02-25T15:57:39.817272Z [debug ] executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:39.817417Z [debug ] operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:39.817632Z [debug ] executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925E39C0>, '\nDROP TABLE api_clients', ()) [aiosqlite]
2026-02-25T15:57:39.817897Z [debug ] operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925E39C0>, '\nDROP TABLE api_clients', ()) completed [aiosqlite]
2026-02-25T15:57:39.818156Z [debug ] executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925E39C0>) [aiosqlite]
2026-02-25T15:57:39.818289Z [debug ] operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925E39C0>) completed [aiosqlite]
2026-02-25T15:57:39.818710Z [debug ] executing functools.partial(<built-in method commit of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:39.818846Z [debug ] operation functools.partial(<built-in method commit of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:39.819133Z [debug ] executing functools.partial(<built-in method rollback of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:39.819274Z [debug ] operation functools.partial(<built-in method rollback of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:39.819819Z [debug ] Using proactor: IocpProactor [asyncio]
---------------------------- Captured log teardown ----------------------------
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925E3740>, 'PRAGMA main.table_info("images")', ())
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925E3740>, 'PRAGMA main.table_info("images")', ()) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E925E3740>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E925E3740>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925E3740>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925E3740>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925E3940>, 'PRAGMA main.table_info("api_clients")', ())
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925E3940>, 'PRAGMA main.table_info("api_clients")', ()) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E925E3940>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E925E3940>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925E3940>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925E3940>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925E38C0>, '\nDROP TABLE images', ())
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925E38C0>, '\nDROP TABLE images', ()) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925E38C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925E38C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925E39C0>, '\nDROP TABLE api_clients', ())
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925E39C0>, '\nDROP TABLE api_clients', ()) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925E39C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925E39C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method commit of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method commit of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method rollback of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method rollback of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG asyncio:proactor_events.py:633 Using proactor: IocpProactor
______________________________ test_ocr_disabled ______________________________
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x0000026E924BD810>
def test_ocr_disabled(monkeypatch):
monkeypatch.setattr("app.services.ocr_service.settings.OCR_ENABLED", False)
from app.services.ocr_service import extract_text
result = extract_text("/tmp/test.jpg")
> assert result["has_text"] is False
E TypeError: 'coroutine' object is not subscriptable
tests\test_services.py:39: TypeError
---------------------------- Captured stdout setup ----------------------------
2026-02-25T15:57:39.853582Z [debug ] Using proactor: IocpProactor [asyncio]
2026-02-25T15:57:39.854582Z [debug ] executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:39.854833Z [debug ] operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:39.855073Z [debug ] executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925E3AC0>, 'PRAGMA main.table_info("images")', ()) [aiosqlite]
2026-02-25T15:57:39.855273Z [debug ] operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925E3AC0>, 'PRAGMA main.table_info("images")', ()) completed [aiosqlite]
2026-02-25T15:57:39.855511Z [debug ] executing functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E925E3AC0>) [aiosqlite]
2026-02-25T15:57:39.855662Z [debug ] operation functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E925E3AC0>) completed [aiosqlite]
2026-02-25T15:57:39.855916Z [debug ] executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925E3AC0>) [aiosqlite]
2026-02-25T15:57:39.856173Z [debug ] operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925E3AC0>) completed [aiosqlite]
2026-02-25T15:57:39.856651Z [debug ] executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:39.856796Z [debug ] operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:39.857216Z [debug ] executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925E3840>, 'PRAGMA temp.table_info("images")', ()) [aiosqlite]
2026-02-25T15:57:39.857509Z [debug ] operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925E3840>, 'PRAGMA temp.table_info("images")', ()) completed [aiosqlite]
2026-02-25T15:57:39.857828Z [debug ] executing functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E925E3840>) [aiosqlite]
2026-02-25T15:57:39.858057Z [debug ] operation functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E925E3840>) completed [aiosqlite]
2026-02-25T15:57:39.858382Z [debug ] executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925E3840>) [aiosqlite]
2026-02-25T15:57:39.858618Z [debug ] operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925E3840>) completed [aiosqlite]
2026-02-25T15:57:39.859044Z [debug ] executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:39.859190Z [debug ] operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:39.859491Z [debug ] executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925E3E40>, 'PRAGMA main.table_info("api_clients")', ()) [aiosqlite]
2026-02-25T15:57:39.859773Z [debug ] operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925E3E40>, 'PRAGMA main.table_info("api_clients")', ()) completed [aiosqlite]
2026-02-25T15:57:39.860110Z [debug ] executing functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E925E3E40>) [aiosqlite]
2026-02-25T15:57:39.860247Z [debug ] operation functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E925E3E40>) completed [aiosqlite]
2026-02-25T15:57:39.860443Z [debug ] executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925E3E40>) [aiosqlite]
2026-02-25T15:57:39.860573Z [debug ] operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925E3E40>) completed [aiosqlite]
2026-02-25T15:57:39.860839Z [debug ] executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:39.860968Z [debug ] operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:39.861171Z [debug ] executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925E3BC0>, 'PRAGMA temp.table_info("api_clients")', ()) [aiosqlite]
2026-02-25T15:57:39.861314Z [debug ] operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925E3BC0>, 'PRAGMA temp.table_info("api_clients")', ()) completed [aiosqlite]
2026-02-25T15:57:39.861535Z [debug ] executing functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E925E3BC0>) [aiosqlite]
2026-02-25T15:57:39.861681Z [debug ] operation functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E925E3BC0>) completed [aiosqlite]
2026-02-25T15:57:39.861899Z [debug ] executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925E3BC0>) [aiosqlite]
2026-02-25T15:57:39.862047Z [debug ] operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925E3BC0>) completed [aiosqlite]
2026-02-25T15:57:39.862577Z [debug ] executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:39.862714Z [debug ] operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:39.862929Z [debug ] executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925E3F40>, '\nCREATE TABLE api_clients (\n\tid VARCHAR(36) NOT NULL, \n\tname VARCHAR(256) NOT NULL, \n\tapi_key_hash VARCHAR(64) NOT NULL, \n\tscopes JSON NOT NULL, \n\t"plan" VARCHAR(8) NOT NULL, \n\tis_active BOOLEAN NOT NULL, \n\tstorage_used_bytes BIGINT NOT NULL, \n\tquota_storage_mb INTEGER NOT NULL, \n\tquota_images INTEGER NOT NULL, \n\tcreated_at DATETIME, \n\tupdated_at DATETIME, \n\tPRIMARY KEY (id)\n)\n\n', ()) [aiosqlite]
2026-02-25T15:57:39.863197Z [debug ] operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925E3F40>, '\nCREATE TABLE api_clients (\n\tid VARCHAR(36) NOT NULL, \n\tname VARCHAR(256) NOT NULL, \n\tapi_key_hash VARCHAR(64) NOT NULL, \n\tscopes JSON NOT NULL, \n\t"plan" VARCHAR(8) NOT NULL, \n\tis_active BOOLEAN NOT NULL, \n\tstorage_used_bytes BIGINT NOT NULL, \n\tquota_storage_mb INTEGER NOT NULL, \n\tquota_images INTEGER NOT NULL, \n\tcreated_at DATETIME, \n\tupdated_at DATETIME, \n\tPRIMARY KEY (id)\n)\n\n', ()) completed [aiosqlite]
2026-02-25T15:57:39.863452Z [debug ] executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925E3F40>) [aiosqlite]
2026-02-25T15:57:39.863582Z [debug ] operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925E3F40>) completed [aiosqlite]
2026-02-25T15:57:39.863942Z [debug ] executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:39.864072Z [debug ] operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:39.864323Z [debug ] executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925523C0>, 'CREATE UNIQUE INDEX ix_api_clients_api_key_hash ON api_clients (api_key_hash)', ()) [aiosqlite]
2026-02-25T15:57:39.864526Z [debug ] operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925523C0>, 'CREATE UNIQUE INDEX ix_api_clients_api_key_hash ON api_clients (api_key_hash)', ()) completed [aiosqlite]
2026-02-25T15:57:39.864787Z [debug ] executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925523C0>) [aiosqlite]
2026-02-25T15:57:39.864922Z [debug ] operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925523C0>) completed [aiosqlite]
2026-02-25T15:57:39.865257Z [debug ] executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:39.865398Z [debug ] operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:39.865630Z [debug ] executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92551640>, 'CREATE INDEX ix_api_clients_id ON api_clients (id)', ()) [aiosqlite]
2026-02-25T15:57:39.865838Z [debug ] operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92551640>, 'CREATE INDEX ix_api_clients_id ON api_clients (id)', ()) completed [aiosqlite]
2026-02-25T15:57:39.866062Z [debug ] executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92551640>) [aiosqlite]
2026-02-25T15:57:39.866190Z [debug ] operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92551640>) completed [aiosqlite]
2026-02-25T15:57:39.866771Z [debug ] executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:39.866904Z [debug ] operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:39.867118Z [debug ] executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925E3940>, '\nCREATE TABLE images (\n\tid INTEGER NOT NULL, \n\tuuid VARCHAR(36) NOT NULL, \n\tclient_id VARCHAR(36) NOT NULL, \n\toriginal_name VARCHAR(512) NOT NULL, \n\tfilename VARCHAR(512) NOT NULL, \n\tfile_path VARCHAR(1024) NOT NULL, \n\tthumbnail_path VARCHAR(1024), \n\tmime_type VARCHAR(128), \n\tfile_size BIGINT, \n\twidth INTEGER, \n\theight INTEGER, \n\tuploaded_at DATETIME, \n\tprocessing_status VARCHAR(10) NOT NULL, \n\tprocessing_error TEXT, \n\tprocessing_started_at DATETIME, \n\tprocessing_done_at DATETIME, \n\texif_raw JSON, \n\texif_make VARCHAR(256), \n\texif_model VARCHAR(256), \n\texif_lens VARCHAR(256), \n\texif_taken_at DATETIME, \n\texif_gps_lat FLOAT, \n\texif_gps_lon FLOAT, \n\texif_altitude FLOAT, \n\texif_iso INTEGER, \n\texif_aperture VARCHAR(32), \n\texif_shutter VARCHAR(32), \n\texif_focal VARCHAR(32), \n\texif_flash BOOLEAN, \n\texif_orientation INTEGER, \n\texif_software VARCHAR(256), \n\tocr_text TEXT, \n\tocr_language VARCHAR(64), \n\tocr_confidence FLOAT, \n\tocr_has_text BOOLEAN, \n\tai_description TEXT, \n\tai_tags JSON, \n\tai_confidence FLOAT, \n\tai_model_used VARCHAR(128), \n\tai_processed_at DATETIME, \n\tai_prompt_tokens INTEGER, \n\tai_output_tokens INTEGER, \n\tPRIMARY KEY (id), \n\tFOREIGN KEY(client_id) REFERENCES api_clients (id)\n)\n\n', ()) [aiosqlite]
2026-02-25T15:57:39.867430Z [debug ] operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925E3940>, '\nCREATE TABLE images (\n\tid INTEGER NOT NULL, \n\tuuid VARCHAR(36) NOT NULL, \n\tclient_id VARCHAR(36) NOT NULL, \n\toriginal_name VARCHAR(512) NOT NULL, \n\tfilename VARCHAR(512) NOT NULL, \n\tfile_path VARCHAR(1024) NOT NULL, \n\tthumbnail_path VARCHAR(1024), \n\tmime_type VARCHAR(128), \n\tfile_size BIGINT, \n\twidth INTEGER, \n\theight INTEGER, \n\tuploaded_at DATETIME, \n\tprocessing_status VARCHAR(10) NOT NULL, \n\tprocessing_error TEXT, \n\tprocessing_started_at DATETIME, \n\tprocessing_done_at DATETIME, \n\texif_raw JSON, \n\texif_make VARCHAR(256), \n\texif_model VARCHAR(256), \n\texif_lens VARCHAR(256), \n\texif_taken_at DATETIME, \n\texif_gps_lat FLOAT, \n\texif_gps_lon FLOAT, \n\texif_altitude FLOAT, \n\texif_iso INTEGER, \n\texif_aperture VARCHAR(32), \n\texif_shutter VARCHAR(32), \n\texif_focal VARCHAR(32), \n\texif_flash BOOLEAN, \n\texif_orientation INTEGER, \n\texif_software VARCHAR(256), \n\tocr_text TEXT, \n\tocr_language VARCHAR(64), \n\tocr_confidence FLOAT, \n\tocr_has_text BOOLEAN, \n\tai_description TEXT, \n\tai_tags JSON, \n\tai_confidence FLOAT, \n\tai_model_used VARCHAR(128), \n\tai_processed_at DATETIME, \n\tai_prompt_tokens INTEGER, \n\tai_output_tokens INTEGER, \n\tPRIMARY KEY (id), \n\tFOREIGN KEY(client_id) REFERENCES api_clients (id)\n)\n\n', ()) completed [aiosqlite]
2026-02-25T15:57:39.867718Z [debug ] executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925E3940>) [aiosqlite]
2026-02-25T15:57:39.867848Z [debug ] operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925E3940>) completed [aiosqlite]
2026-02-25T15:57:39.868158Z [debug ] executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:39.868286Z [debug ] operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:39.868485Z [debug ] executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92553740>, 'CREATE UNIQUE INDEX ix_images_uuid ON images (uuid)', ()) [aiosqlite]
2026-02-25T15:57:39.868680Z [debug ] operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92553740>, 'CREATE UNIQUE INDEX ix_images_uuid ON images (uuid)', ()) completed [aiosqlite]
2026-02-25T15:57:39.868891Z [debug ] executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92553740>) [aiosqlite]
2026-02-25T15:57:39.869019Z [debug ] operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92553740>) completed [aiosqlite]
2026-02-25T15:57:39.869282Z [debug ] executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:39.869413Z [debug ] operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:39.869610Z [debug ] executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92553340>, 'CREATE INDEX ix_images_id ON images (id)', ()) [aiosqlite]
2026-02-25T15:57:39.869791Z [debug ] operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92553340>, 'CREATE INDEX ix_images_id ON images (id)', ()) completed [aiosqlite]
2026-02-25T15:57:39.869993Z [debug ] executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92553340>) [aiosqlite]
2026-02-25T15:57:39.870121Z [debug ] operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92553340>) completed [aiosqlite]
2026-02-25T15:57:39.870385Z [debug ] executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:39.870514Z [debug ] operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:39.870725Z [debug ] executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92553840>, 'CREATE INDEX ix_images_client_id ON images (client_id)', ()) [aiosqlite]
2026-02-25T15:57:39.870912Z [debug ] operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92553840>, 'CREATE INDEX ix_images_client_id ON images (client_id)', ()) completed [aiosqlite]
2026-02-25T15:57:39.871117Z [debug ] executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92553840>) [aiosqlite]
2026-02-25T15:57:39.871245Z [debug ] operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92553840>) completed [aiosqlite]
2026-02-25T15:57:39.871479Z [debug ] executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:39.871611Z [debug ] operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:39.871840Z [debug ] executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92551540>, 'CREATE INDEX ix_images_processing_status ON images (processing_status)', ()) [aiosqlite]
2026-02-25T15:57:39.872022Z [debug ] operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92551540>, 'CREATE INDEX ix_images_processing_status ON images (processing_status)', ()) completed [aiosqlite]
2026-02-25T15:57:39.872250Z [debug ] executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92551540>) [aiosqlite]
2026-02-25T15:57:39.872379Z [debug ] operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92551540>) completed [aiosqlite]
2026-02-25T15:57:39.872628Z [debug ] executing functools.partial(<built-in method commit of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:39.872771Z [debug ] operation functools.partial(<built-in method commit of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:39.873043Z [debug ] executing functools.partial(<built-in method rollback of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:39.873169Z [debug ] operation functools.partial(<built-in method rollback of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
----------------------------- Captured log setup ------------------------------
DEBUG asyncio:proactor_events.py:633 Using proactor: IocpProactor
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925E3AC0>, 'PRAGMA main.table_info("images")', ())
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925E3AC0>, 'PRAGMA main.table_info("images")', ()) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E925E3AC0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E925E3AC0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925E3AC0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925E3AC0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925E3840>, 'PRAGMA temp.table_info("images")', ())
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925E3840>, 'PRAGMA temp.table_info("images")', ()) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E925E3840>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E925E3840>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925E3840>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925E3840>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925E3E40>, 'PRAGMA main.table_info("api_clients")', ())
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925E3E40>, 'PRAGMA main.table_info("api_clients")', ()) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E925E3E40>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E925E3E40>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925E3E40>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925E3E40>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925E3BC0>, 'PRAGMA temp.table_info("api_clients")', ())
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925E3BC0>, 'PRAGMA temp.table_info("api_clients")', ()) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E925E3BC0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E925E3BC0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925E3BC0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925E3BC0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925E3F40>, '\nCREATE TABLE api_clients (\n\tid VARCHAR(36) NOT NULL, \n\tname VARCHAR(256) NOT NULL, \n\tapi_key_hash VARCHAR(64) NOT NULL, \n\tscopes JSON NOT NULL, \n\t"plan" VARCHAR(8) NOT NULL, \n\tis_active BOOLEAN NOT NULL, \n\tstorage_used_bytes BIGINT NOT NULL, \n\tquota_storage_mb INTEGER NOT NULL, \n\tquota_images INTEGER NOT NULL, \n\tcreated_at DATETIME, \n\tupdated_at DATETIME, \n\tPRIMARY KEY (id)\n)\n\n', ())
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925E3F40>, '\nCREATE TABLE api_clients (\n\tid VARCHAR(36) NOT NULL, \n\tname VARCHAR(256) NOT NULL, \n\tapi_key_hash VARCHAR(64) NOT NULL, \n\tscopes JSON NOT NULL, \n\t"plan" VARCHAR(8) NOT NULL, \n\tis_active BOOLEAN NOT NULL, \n\tstorage_used_bytes BIGINT NOT NULL, \n\tquota_storage_mb INTEGER NOT NULL, \n\tquota_images INTEGER NOT NULL, \n\tcreated_at DATETIME, \n\tupdated_at DATETIME, \n\tPRIMARY KEY (id)\n)\n\n', ()) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925E3F40>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925E3F40>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925523C0>, 'CREATE UNIQUE INDEX ix_api_clients_api_key_hash ON api_clients (api_key_hash)', ())
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925523C0>, 'CREATE UNIQUE INDEX ix_api_clients_api_key_hash ON api_clients (api_key_hash)', ()) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925523C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925523C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92551640>, 'CREATE INDEX ix_api_clients_id ON api_clients (id)', ())
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92551640>, 'CREATE INDEX ix_api_clients_id ON api_clients (id)', ()) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92551640>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92551640>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925E3940>, '\nCREATE TABLE images (\n\tid INTEGER NOT NULL, \n\tuuid VARCHAR(36) NOT NULL, \n\tclient_id VARCHAR(36) NOT NULL, \n\toriginal_name VARCHAR(512) NOT NULL, \n\tfilename VARCHAR(512) NOT NULL, \n\tfile_path VARCHAR(1024) NOT NULL, \n\tthumbnail_path VARCHAR(1024), \n\tmime_type VARCHAR(128), \n\tfile_size BIGINT, \n\twidth INTEGER, \n\theight INTEGER, \n\tuploaded_at DATETIME, \n\tprocessing_status VARCHAR(10) NOT NULL, \n\tprocessing_error TEXT, \n\tprocessing_started_at DATETIME, \n\tprocessing_done_at DATETIME, \n\texif_raw JSON, \n\texif_make VARCHAR(256), \n\texif_model VARCHAR(256), \n\texif_lens VARCHAR(256), \n\texif_taken_at DATETIME, \n\texif_gps_lat FLOAT, \n\texif_gps_lon FLOAT, \n\texif_altitude FLOAT, \n\texif_iso INTEGER, \n\texif_aperture VARCHAR(32), \n\texif_shutter VARCHAR(32), \n\texif_focal VARCHAR(32), \n\texif_flash BOOLEAN, \n\texif_orientation INTEGER, \n\texif_software VARCHAR(256), \n\tocr_text TEXT, \n\tocr_language VARCHAR(64), \n\tocr_confidence FLOAT, \n\tocr_has_text BOOLEAN, \n\tai_description TEXT, \n\tai_tags JSON, \n\tai_confidence FLOAT, \n\tai_model_used VARCHAR(128), \n\tai_processed_at DATETIME, \n\tai_prompt_tokens INTEGER, \n\tai_output_tokens INTEGER, \n\tPRIMARY KEY (id), \n\tFOREIGN KEY(client_id) REFERENCES api_clients (id)\n)\n\n', ())
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925E3940>, '\nCREATE TABLE images (\n\tid INTEGER NOT NULL, \n\tuuid VARCHAR(36) NOT NULL, \n\tclient_id VARCHAR(36) NOT NULL, \n\toriginal_name VARCHAR(512) NOT NULL, \n\tfilename VARCHAR(512) NOT NULL, \n\tfile_path VARCHAR(1024) NOT NULL, \n\tthumbnail_path VARCHAR(1024), \n\tmime_type VARCHAR(128), \n\tfile_size BIGINT, \n\twidth INTEGER, \n\theight INTEGER, \n\tuploaded_at DATETIME, \n\tprocessing_status VARCHAR(10) NOT NULL, \n\tprocessing_error TEXT, \n\tprocessing_started_at DATETIME, \n\tprocessing_done_at DATETIME, \n\texif_raw JSON, \n\texif_make VARCHAR(256), \n\texif_model VARCHAR(256), \n\texif_lens VARCHAR(256), \n\texif_taken_at DATETIME, \n\texif_gps_lat FLOAT, \n\texif_gps_lon FLOAT, \n\texif_altitude FLOAT, \n\texif_iso INTEGER, \n\texif_aperture VARCHAR(32), \n\texif_shutter VARCHAR(32), \n\texif_focal VARCHAR(32), \n\texif_flash BOOLEAN, \n\texif_orientation INTEGER, \n\texif_software VARCHAR(256), \n\tocr_text TEXT, \n\tocr_language VARCHAR(64), \n\tocr_confidence FLOAT, \n\tocr_has_text BOOLEAN, \n\tai_description TEXT, \n\tai_tags JSON, \n\tai_confidence FLOAT, \n\tai_model_used VARCHAR(128), \n\tai_processed_at DATETIME, \n\tai_prompt_tokens INTEGER, \n\tai_output_tokens INTEGER, \n\tPRIMARY KEY (id), \n\tFOREIGN KEY(client_id) REFERENCES api_clients (id)\n)\n\n', ()) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925E3940>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925E3940>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92553740>, 'CREATE UNIQUE INDEX ix_images_uuid ON images (uuid)', ())
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92553740>, 'CREATE UNIQUE INDEX ix_images_uuid ON images (uuid)', ()) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92553740>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92553740>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92553340>, 'CREATE INDEX ix_images_id ON images (id)', ())
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92553340>, 'CREATE INDEX ix_images_id ON images (id)', ()) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92553340>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92553340>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92553840>, 'CREATE INDEX ix_images_client_id ON images (client_id)', ())
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92553840>, 'CREATE INDEX ix_images_client_id ON images (client_id)', ()) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92553840>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92553840>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92551540>, 'CREATE INDEX ix_images_processing_status ON images (processing_status)', ())
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92551540>, 'CREATE INDEX ix_images_processing_status ON images (processing_status)', ()) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92551540>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92551540>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method commit of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method commit of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method rollback of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method rollback of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
-------------------------- Captured stdout teardown ---------------------------
2026-02-25T15:57:39.877391Z [debug ] executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:39.877724Z [debug ] operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:39.878080Z [debug ] executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92553940>, 'PRAGMA main.table_info("images")', ()) [aiosqlite]
2026-02-25T15:57:39.878238Z [debug ] operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92553940>, 'PRAGMA main.table_info("images")', ()) completed [aiosqlite]
2026-02-25T15:57:39.878465Z [debug ] executing functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E92553940>) [aiosqlite]
2026-02-25T15:57:39.878627Z [debug ] operation functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E92553940>) completed [aiosqlite]
2026-02-25T15:57:39.878824Z [debug ] executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92553940>) [aiosqlite]
2026-02-25T15:57:39.878949Z [debug ] operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92553940>) completed [aiosqlite]
2026-02-25T15:57:39.879253Z [debug ] executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:39.879381Z [debug ] operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:39.879585Z [debug ] executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92552D40>, 'PRAGMA main.table_info("api_clients")', ()) [aiosqlite]
2026-02-25T15:57:39.879729Z [debug ] operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92552D40>, 'PRAGMA main.table_info("api_clients")', ()) completed [aiosqlite]
2026-02-25T15:57:39.879930Z [debug ] executing functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E92552D40>) [aiosqlite]
2026-02-25T15:57:39.880067Z [debug ] operation functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E92552D40>) completed [aiosqlite]
2026-02-25T15:57:39.880254Z [debug ] executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92552D40>) [aiosqlite]
2026-02-25T15:57:39.880392Z [debug ] operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92552D40>) completed [aiosqlite]
2026-02-25T15:57:39.880835Z [debug ] executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:39.880969Z [debug ] operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:39.881166Z [debug ] executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92551DC0>, '\nDROP TABLE images', ()) [aiosqlite]
2026-02-25T15:57:39.881432Z [debug ] operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92551DC0>, '\nDROP TABLE images', ()) completed [aiosqlite]
2026-02-25T15:57:39.881710Z [debug ] executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92551DC0>) [aiosqlite]
2026-02-25T15:57:39.881837Z [debug ] operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92551DC0>) completed [aiosqlite]
2026-02-25T15:57:39.882207Z [debug ] executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:39.882333Z [debug ] operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:39.882555Z [debug ] executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92552640>, '\nDROP TABLE api_clients', ()) [aiosqlite]
2026-02-25T15:57:39.882793Z [debug ] operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92552640>, '\nDROP TABLE api_clients', ()) completed [aiosqlite]
2026-02-25T15:57:39.883030Z [debug ] executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92552640>) [aiosqlite]
2026-02-25T15:57:39.883157Z [debug ] operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92552640>) completed [aiosqlite]
2026-02-25T15:57:39.883590Z [debug ] executing functools.partial(<built-in method commit of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:39.883734Z [debug ] operation functools.partial(<built-in method commit of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:39.884041Z [debug ] executing functools.partial(<built-in method rollback of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:39.884165Z [debug ] operation functools.partial(<built-in method rollback of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:39.884790Z [debug ] Using proactor: IocpProactor [asyncio]
---------------------------- Captured log teardown ----------------------------
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92553940>, 'PRAGMA main.table_info("images")', ())
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92553940>, 'PRAGMA main.table_info("images")', ()) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E92553940>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E92553940>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92553940>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92553940>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92552D40>, 'PRAGMA main.table_info("api_clients")', ())
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92552D40>, 'PRAGMA main.table_info("api_clients")', ()) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E92552D40>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E92552D40>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92552D40>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92552D40>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92551DC0>, '\nDROP TABLE images', ())
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92551DC0>, '\nDROP TABLE images', ()) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92551DC0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92551DC0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92552640>, '\nDROP TABLE api_clients', ())
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92552640>, '\nDROP TABLE api_clients', ()) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92552640>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92552640>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method commit of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method commit of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method rollback of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method rollback of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG asyncio:proactor_events.py:633 Using proactor: IocpProactor
__________________________ test_image_detail_schema ___________________________
def test_image_detail_schema():
from app.schemas import ImageDetail
from app.models.image import ProcessingStatus
# Simule un objet Image ORM
mock_img = MagicMock()
mock_img.id = 1
mock_img.uuid = "abc-123"
mock_img.original_name = "test.jpg"
mock_img.mime_type = "image/jpeg"
mock_img.file_size = 1024
mock_img.width = 800
mock_img.height = 600
mock_img.uploaded_at = None
mock_img.processing_status = ProcessingStatus.DONE
mock_img.thumbnail_path = None
mock_img.exif_make = "Canon"
mock_img.exif_model = "EOS R5"
mock_img.exif_lens = None
mock_img.exif_iso = 400
mock_img.exif_aperture = "f/2.8"
mock_img.exif_shutter = "1/250"
mock_img.exif_focal = "50mm"
mock_img.exif_flash = False
mock_img.exif_orientation = 1
mock_img.exif_software = None
mock_img.exif_taken_at = None
mock_img.exif_gps_lat = 48.857
mock_img.exif_gps_lon = 2.295
mock_img.exif_altitude = 35.0
mock_img.exif_raw = {}
mock_img.has_gps = True
mock_img.ocr_text = "Bonjour monde"
mock_img.ocr_language = "fr"
mock_img.ocr_confidence = 0.95
mock_img.ocr_has_text = True
mock_img.ai_description = "Une belle photo"
mock_img.ai_tags = ["nature", "paysage"]
mock_img.ai_confidence = 0.92
mock_img.ai_model_used = "gemini-1.5-pro"
mock_img.ai_processed_at = None
mock_img.ai_prompt_tokens = 500
mock_img.ai_output_tokens = 200
mock_img.processing_error = None
mock_img.processing_started_at = None
mock_img.processing_done_at = None
> detail = ImageDetail.from_orm_full(mock_img)
tests\test_services.py:116:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
cls = <class 'app.schemas.ImageDetail'>, img = <MagicMock id='2673924352928'>
@classmethod
def from_orm_full(cls, img) -> "ImageDetail":
> return cls(
id=img.id,
uuid=img.uuid,
original_name=img.original_name,
mime_type=img.mime_type,
file_size=img.file_size,
width=img.width,
height=img.height,
uploaded_at=img.uploaded_at,
processing_status=img.processing_status,
client_id=img.client_id,
client_name=img.client.name if img.client else None,
thumbnail_path=img.thumbnail_path,
exif=ExifData(
camera=ExifCamera(
make=img.exif_make,
model=img.exif_model,
lens=img.exif_lens,
iso=img.exif_iso,
aperture=img.exif_aperture,
shutter_speed=img.exif_shutter,
focal_length=img.exif_focal,
flash=img.exif_flash,
orientation=img.exif_orientation,
software=img.exif_software,
taken_at=img.exif_taken_at,
),
gps=ExifGPS(
latitude=img.exif_gps_lat,
longitude=img.exif_gps_lon,
altitude=img.exif_altitude,
has_gps=img.has_gps,
),
raw=img.exif_raw,
),
ocr=OcrData(
text=img.ocr_text,
language=img.ocr_language,
confidence=img.ocr_confidence,
has_text=img.ocr_has_text or False,
),
ai=AiData(
description=img.ai_description,
tags=img.ai_tags,
confidence=img.ai_confidence,
model_used=img.ai_model_used,
processed_at=img.ai_processed_at,
prompt_tokens=img.ai_prompt_tokens,
output_tokens=img.ai_output_tokens,
),
processing=ProcessingInfo(
status=img.processing_status,
error=img.processing_error,
started_at=img.processing_started_at,
done_at=img.processing_done_at,
),
)
E pydantic_core._pydantic_core.ValidationError: 2 validation errors for ImageDetail
E client_id
E Input should be a valid string [type=string_type, input_value=<MagicMock name='mock.cli..._id' id='2673924352256'>, input_type=MagicMock]
E For further information visit https://errors.pydantic.dev/2.12/v/string_type
E client_name
E Input should be a valid string [type=string_type, input_value=<MagicMock name='mock.cli...ame' id='2673924353264'>, input_type=MagicMock]
E For further information visit https://errors.pydantic.dev/2.12/v/string_type
app\schemas\__init__.py:102: ValidationError
---------------------------- Captured stdout setup ----------------------------
2026-02-25T15:57:39.971817Z [debug ] Using proactor: IocpProactor [asyncio]
2026-02-25T15:57:39.973007Z [debug ] executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:39.973251Z [debug ] operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:39.973568Z [debug ] executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925537C0>, 'PRAGMA main.table_info("images")', ()) [aiosqlite]
2026-02-25T15:57:39.973741Z [debug ] operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925537C0>, 'PRAGMA main.table_info("images")', ()) completed [aiosqlite]
2026-02-25T15:57:39.973977Z [debug ] executing functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E925537C0>) [aiosqlite]
2026-02-25T15:57:39.974151Z [debug ] operation functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E925537C0>) completed [aiosqlite]
2026-02-25T15:57:39.974409Z [debug ] executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925537C0>) [aiosqlite]
2026-02-25T15:57:39.974541Z [debug ] operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925537C0>) completed [aiosqlite]
2026-02-25T15:57:39.974887Z [debug ] executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:39.975016Z [debug ] operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:39.975239Z [debug ] executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92551640>, 'PRAGMA temp.table_info("images")', ()) [aiosqlite]
2026-02-25T15:57:39.975393Z [debug ] operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92551640>, 'PRAGMA temp.table_info("images")', ()) completed [aiosqlite]
2026-02-25T15:57:39.975621Z [debug ] executing functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E92551640>) [aiosqlite]
2026-02-25T15:57:39.975748Z [debug ] operation functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E92551640>) completed [aiosqlite]
2026-02-25T15:57:39.975957Z [debug ] executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92551640>) [aiosqlite]
2026-02-25T15:57:39.976082Z [debug ] operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92551640>) completed [aiosqlite]
2026-02-25T15:57:39.976415Z [debug ] executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:39.976545Z [debug ] operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:39.976764Z [debug ] executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925523C0>, 'PRAGMA main.table_info("api_clients")', ()) [aiosqlite]
2026-02-25T15:57:39.976910Z [debug ] operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925523C0>, 'PRAGMA main.table_info("api_clients")', ()) completed [aiosqlite]
2026-02-25T15:57:39.977197Z [debug ] executing functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E925523C0>) [aiosqlite]
2026-02-25T15:57:39.977459Z [debug ] operation functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E925523C0>) completed [aiosqlite]
2026-02-25T15:57:39.977783Z [debug ] executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925523C0>) [aiosqlite]
2026-02-25T15:57:39.977923Z [debug ] operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925523C0>) completed [aiosqlite]
2026-02-25T15:57:39.978237Z [debug ] executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:39.978375Z [debug ] operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:39.978712Z [debug ] executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92552640>, 'PRAGMA temp.table_info("api_clients")', ()) [aiosqlite]
2026-02-25T15:57:39.978970Z [debug ] operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92552640>, 'PRAGMA temp.table_info("api_clients")', ()) completed [aiosqlite]
2026-02-25T15:57:39.979269Z [debug ] executing functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E92552640>) [aiosqlite]
2026-02-25T15:57:39.979656Z [debug ] operation functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E92552640>) completed [aiosqlite]
2026-02-25T15:57:39.979913Z [debug ] executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92552640>) [aiosqlite]
2026-02-25T15:57:39.980051Z [debug ] operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92552640>) completed [aiosqlite]
2026-02-25T15:57:39.980613Z [debug ] executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:39.980761Z [debug ] operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:39.981007Z [debug ] executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92551140>, '\nCREATE TABLE api_clients (\n\tid VARCHAR(36) NOT NULL, \n\tname VARCHAR(256) NOT NULL, \n\tapi_key_hash VARCHAR(64) NOT NULL, \n\tscopes JSON NOT NULL, \n\t"plan" VARCHAR(8) NOT NULL, \n\tis_active BOOLEAN NOT NULL, \n\tstorage_used_bytes BIGINT NOT NULL, \n\tquota_storage_mb INTEGER NOT NULL, \n\tquota_images INTEGER NOT NULL, \n\tcreated_at DATETIME, \n\tupdated_at DATETIME, \n\tPRIMARY KEY (id)\n)\n\n', ()) [aiosqlite]
2026-02-25T15:57:39.981299Z [debug ] operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92551140>, '\nCREATE TABLE api_clients (\n\tid VARCHAR(36) NOT NULL, \n\tname VARCHAR(256) NOT NULL, \n\tapi_key_hash VARCHAR(64) NOT NULL, \n\tscopes JSON NOT NULL, \n\t"plan" VARCHAR(8) NOT NULL, \n\tis_active BOOLEAN NOT NULL, \n\tstorage_used_bytes BIGINT NOT NULL, \n\tquota_storage_mb INTEGER NOT NULL, \n\tquota_images INTEGER NOT NULL, \n\tcreated_at DATETIME, \n\tupdated_at DATETIME, \n\tPRIMARY KEY (id)\n)\n\n', ()) completed [aiosqlite]
2026-02-25T15:57:39.981621Z [debug ] executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92551140>) [aiosqlite]
2026-02-25T15:57:39.981786Z [debug ] operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92551140>) completed [aiosqlite]
2026-02-25T15:57:39.982116Z [debug ] executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:39.982285Z [debug ] operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:39.982546Z [debug ] executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92553940>, 'CREATE UNIQUE INDEX ix_api_clients_api_key_hash ON api_clients (api_key_hash)', ()) [aiosqlite]
2026-02-25T15:57:39.982766Z [debug ] operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92553940>, 'CREATE UNIQUE INDEX ix_api_clients_api_key_hash ON api_clients (api_key_hash)', ()) completed [aiosqlite]
2026-02-25T15:57:39.983033Z [debug ] executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92553940>) [aiosqlite]
2026-02-25T15:57:39.983192Z [debug ] operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92553940>) completed [aiosqlite]
2026-02-25T15:57:39.983500Z [debug ] executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:39.983634Z [debug ] operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:39.983849Z [debug ] executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925E38C0>, 'CREATE INDEX ix_api_clients_id ON api_clients (id)', ()) [aiosqlite]
2026-02-25T15:57:39.984055Z [debug ] operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925E38C0>, 'CREATE INDEX ix_api_clients_id ON api_clients (id)', ()) completed [aiosqlite]
2026-02-25T15:57:39.984277Z [debug ] executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925E38C0>) [aiosqlite]
2026-02-25T15:57:39.984407Z [debug ] operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925E38C0>) completed [aiosqlite]
2026-02-25T15:57:39.984987Z [debug ] executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:39.985113Z [debug ] operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:39.985328Z [debug ] executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92553840>, '\nCREATE TABLE images (\n\tid INTEGER NOT NULL, \n\tuuid VARCHAR(36) NOT NULL, \n\tclient_id VARCHAR(36) NOT NULL, \n\toriginal_name VARCHAR(512) NOT NULL, \n\tfilename VARCHAR(512) NOT NULL, \n\tfile_path VARCHAR(1024) NOT NULL, \n\tthumbnail_path VARCHAR(1024), \n\tmime_type VARCHAR(128), \n\tfile_size BIGINT, \n\twidth INTEGER, \n\theight INTEGER, \n\tuploaded_at DATETIME, \n\tprocessing_status VARCHAR(10) NOT NULL, \n\tprocessing_error TEXT, \n\tprocessing_started_at DATETIME, \n\tprocessing_done_at DATETIME, \n\texif_raw JSON, \n\texif_make VARCHAR(256), \n\texif_model VARCHAR(256), \n\texif_lens VARCHAR(256), \n\texif_taken_at DATETIME, \n\texif_gps_lat FLOAT, \n\texif_gps_lon FLOAT, \n\texif_altitude FLOAT, \n\texif_iso INTEGER, \n\texif_aperture VARCHAR(32), \n\texif_shutter VARCHAR(32), \n\texif_focal VARCHAR(32), \n\texif_flash BOOLEAN, \n\texif_orientation INTEGER, \n\texif_software VARCHAR(256), \n\tocr_text TEXT, \n\tocr_language VARCHAR(64), \n\tocr_confidence FLOAT, \n\tocr_has_text BOOLEAN, \n\tai_description TEXT, \n\tai_tags JSON, \n\tai_confidence FLOAT, \n\tai_model_used VARCHAR(128), \n\tai_processed_at DATETIME, \n\tai_prompt_tokens INTEGER, \n\tai_output_tokens INTEGER, \n\tPRIMARY KEY (id), \n\tFOREIGN KEY(client_id) REFERENCES api_clients (id)\n)\n\n', ()) [aiosqlite]
2026-02-25T15:57:39.985641Z [debug ] operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92553840>, '\nCREATE TABLE images (\n\tid INTEGER NOT NULL, \n\tuuid VARCHAR(36) NOT NULL, \n\tclient_id VARCHAR(36) NOT NULL, \n\toriginal_name VARCHAR(512) NOT NULL, \n\tfilename VARCHAR(512) NOT NULL, \n\tfile_path VARCHAR(1024) NOT NULL, \n\tthumbnail_path VARCHAR(1024), \n\tmime_type VARCHAR(128), \n\tfile_size BIGINT, \n\twidth INTEGER, \n\theight INTEGER, \n\tuploaded_at DATETIME, \n\tprocessing_status VARCHAR(10) NOT NULL, \n\tprocessing_error TEXT, \n\tprocessing_started_at DATETIME, \n\tprocessing_done_at DATETIME, \n\texif_raw JSON, \n\texif_make VARCHAR(256), \n\texif_model VARCHAR(256), \n\texif_lens VARCHAR(256), \n\texif_taken_at DATETIME, \n\texif_gps_lat FLOAT, \n\texif_gps_lon FLOAT, \n\texif_altitude FLOAT, \n\texif_iso INTEGER, \n\texif_aperture VARCHAR(32), \n\texif_shutter VARCHAR(32), \n\texif_focal VARCHAR(32), \n\texif_flash BOOLEAN, \n\texif_orientation INTEGER, \n\texif_software VARCHAR(256), \n\tocr_text TEXT, \n\tocr_language VARCHAR(64), \n\tocr_confidence FLOAT, \n\tocr_has_text BOOLEAN, \n\tai_description TEXT, \n\tai_tags JSON, \n\tai_confidence FLOAT, \n\tai_model_used VARCHAR(128), \n\tai_processed_at DATETIME, \n\tai_prompt_tokens INTEGER, \n\tai_output_tokens INTEGER, \n\tPRIMARY KEY (id), \n\tFOREIGN KEY(client_id) REFERENCES api_clients (id)\n)\n\n', ()) completed [aiosqlite]
2026-02-25T15:57:39.985900Z [debug ] executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92553840>) [aiosqlite]
2026-02-25T15:57:39.986030Z [debug ] operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92553840>) completed [aiosqlite]
2026-02-25T15:57:39.986431Z [debug ] executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:39.986784Z [debug ] operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:39.987147Z [debug ] executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92551D40>, 'CREATE UNIQUE INDEX ix_images_uuid ON images (uuid)', ()) [aiosqlite]
2026-02-25T15:57:39.987397Z [debug ] operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92551D40>, 'CREATE UNIQUE INDEX ix_images_uuid ON images (uuid)', ()) completed [aiosqlite]
2026-02-25T15:57:39.987678Z [debug ] executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92551D40>) [aiosqlite]
2026-02-25T15:57:39.987814Z [debug ] operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92551D40>) completed [aiosqlite]
2026-02-25T15:57:39.988142Z [debug ] executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:39.988280Z [debug ] operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:39.988505Z [debug ] executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92553340>, 'CREATE INDEX ix_images_id ON images (id)', ()) [aiosqlite]
2026-02-25T15:57:39.988733Z [debug ] operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92553340>, 'CREATE INDEX ix_images_id ON images (id)', ()) completed [aiosqlite]
2026-02-25T15:57:39.988972Z [debug ] executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92553340>) [aiosqlite]
2026-02-25T15:57:39.989116Z [debug ] operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92553340>) completed [aiosqlite]
2026-02-25T15:57:39.989396Z [debug ] executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:39.989525Z [debug ] operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:39.989736Z [debug ] executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925E3CC0>, 'CREATE INDEX ix_images_client_id ON images (client_id)', ()) [aiosqlite]
2026-02-25T15:57:39.989950Z [debug ] operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925E3CC0>, 'CREATE INDEX ix_images_client_id ON images (client_id)', ()) completed [aiosqlite]
2026-02-25T15:57:39.990162Z [debug ] executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925E3CC0>) [aiosqlite]
2026-02-25T15:57:39.990290Z [debug ] operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925E3CC0>) completed [aiosqlite]
2026-02-25T15:57:39.990565Z [debug ] executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:39.990706Z [debug ] operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:39.990904Z [debug ] executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925E3B40>, 'CREATE INDEX ix_images_processing_status ON images (processing_status)', ()) [aiosqlite]
2026-02-25T15:57:39.991088Z [debug ] operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925E3B40>, 'CREATE INDEX ix_images_processing_status ON images (processing_status)', ()) completed [aiosqlite]
2026-02-25T15:57:39.991300Z [debug ] executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925E3B40>) [aiosqlite]
2026-02-25T15:57:39.991441Z [debug ] operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925E3B40>) completed [aiosqlite]
2026-02-25T15:57:39.991700Z [debug ] executing functools.partial(<built-in method commit of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:39.991829Z [debug ] operation functools.partial(<built-in method commit of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:39.992119Z [debug ] executing functools.partial(<built-in method rollback of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:39.992249Z [debug ] operation functools.partial(<built-in method rollback of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
----------------------------- Captured log setup ------------------------------
DEBUG asyncio:proactor_events.py:633 Using proactor: IocpProactor
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925537C0>, 'PRAGMA main.table_info("images")', ())
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925537C0>, 'PRAGMA main.table_info("images")', ()) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E925537C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E925537C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925537C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925537C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92551640>, 'PRAGMA temp.table_info("images")', ())
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92551640>, 'PRAGMA temp.table_info("images")', ()) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E92551640>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E92551640>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92551640>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92551640>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925523C0>, 'PRAGMA main.table_info("api_clients")', ())
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925523C0>, 'PRAGMA main.table_info("api_clients")', ()) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E925523C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E925523C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925523C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925523C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92552640>, 'PRAGMA temp.table_info("api_clients")', ())
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92552640>, 'PRAGMA temp.table_info("api_clients")', ()) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E92552640>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E92552640>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92552640>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92552640>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92551140>, '\nCREATE TABLE api_clients (\n\tid VARCHAR(36) NOT NULL, \n\tname VARCHAR(256) NOT NULL, \n\tapi_key_hash VARCHAR(64) NOT NULL, \n\tscopes JSON NOT NULL, \n\t"plan" VARCHAR(8) NOT NULL, \n\tis_active BOOLEAN NOT NULL, \n\tstorage_used_bytes BIGINT NOT NULL, \n\tquota_storage_mb INTEGER NOT NULL, \n\tquota_images INTEGER NOT NULL, \n\tcreated_at DATETIME, \n\tupdated_at DATETIME, \n\tPRIMARY KEY (id)\n)\n\n', ())
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92551140>, '\nCREATE TABLE api_clients (\n\tid VARCHAR(36) NOT NULL, \n\tname VARCHAR(256) NOT NULL, \n\tapi_key_hash VARCHAR(64) NOT NULL, \n\tscopes JSON NOT NULL, \n\t"plan" VARCHAR(8) NOT NULL, \n\tis_active BOOLEAN NOT NULL, \n\tstorage_used_bytes BIGINT NOT NULL, \n\tquota_storage_mb INTEGER NOT NULL, \n\tquota_images INTEGER NOT NULL, \n\tcreated_at DATETIME, \n\tupdated_at DATETIME, \n\tPRIMARY KEY (id)\n)\n\n', ()) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92551140>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92551140>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92553940>, 'CREATE UNIQUE INDEX ix_api_clients_api_key_hash ON api_clients (api_key_hash)', ())
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92553940>, 'CREATE UNIQUE INDEX ix_api_clients_api_key_hash ON api_clients (api_key_hash)', ()) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92553940>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92553940>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925E38C0>, 'CREATE INDEX ix_api_clients_id ON api_clients (id)', ())
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925E38C0>, 'CREATE INDEX ix_api_clients_id ON api_clients (id)', ()) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925E38C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925E38C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92553840>, '\nCREATE TABLE images (\n\tid INTEGER NOT NULL, \n\tuuid VARCHAR(36) NOT NULL, \n\tclient_id VARCHAR(36) NOT NULL, \n\toriginal_name VARCHAR(512) NOT NULL, \n\tfilename VARCHAR(512) NOT NULL, \n\tfile_path VARCHAR(1024) NOT NULL, \n\tthumbnail_path VARCHAR(1024), \n\tmime_type VARCHAR(128), \n\tfile_size BIGINT, \n\twidth INTEGER, \n\theight INTEGER, \n\tuploaded_at DATETIME, \n\tprocessing_status VARCHAR(10) NOT NULL, \n\tprocessing_error TEXT, \n\tprocessing_started_at DATETIME, \n\tprocessing_done_at DATETIME, \n\texif_raw JSON, \n\texif_make VARCHAR(256), \n\texif_model VARCHAR(256), \n\texif_lens VARCHAR(256), \n\texif_taken_at DATETIME, \n\texif_gps_lat FLOAT, \n\texif_gps_lon FLOAT, \n\texif_altitude FLOAT, \n\texif_iso INTEGER, \n\texif_aperture VARCHAR(32), \n\texif_shutter VARCHAR(32), \n\texif_focal VARCHAR(32), \n\texif_flash BOOLEAN, \n\texif_orientation INTEGER, \n\texif_software VARCHAR(256), \n\tocr_text TEXT, \n\tocr_language VARCHAR(64), \n\tocr_confidence FLOAT, \n\tocr_has_text BOOLEAN, \n\tai_description TEXT, \n\tai_tags JSON, \n\tai_confidence FLOAT, \n\tai_model_used VARCHAR(128), \n\tai_processed_at DATETIME, \n\tai_prompt_tokens INTEGER, \n\tai_output_tokens INTEGER, \n\tPRIMARY KEY (id), \n\tFOREIGN KEY(client_id) REFERENCES api_clients (id)\n)\n\n', ())
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92553840>, '\nCREATE TABLE images (\n\tid INTEGER NOT NULL, \n\tuuid VARCHAR(36) NOT NULL, \n\tclient_id VARCHAR(36) NOT NULL, \n\toriginal_name VARCHAR(512) NOT NULL, \n\tfilename VARCHAR(512) NOT NULL, \n\tfile_path VARCHAR(1024) NOT NULL, \n\tthumbnail_path VARCHAR(1024), \n\tmime_type VARCHAR(128), \n\tfile_size BIGINT, \n\twidth INTEGER, \n\theight INTEGER, \n\tuploaded_at DATETIME, \n\tprocessing_status VARCHAR(10) NOT NULL, \n\tprocessing_error TEXT, \n\tprocessing_started_at DATETIME, \n\tprocessing_done_at DATETIME, \n\texif_raw JSON, \n\texif_make VARCHAR(256), \n\texif_model VARCHAR(256), \n\texif_lens VARCHAR(256), \n\texif_taken_at DATETIME, \n\texif_gps_lat FLOAT, \n\texif_gps_lon FLOAT, \n\texif_altitude FLOAT, \n\texif_iso INTEGER, \n\texif_aperture VARCHAR(32), \n\texif_shutter VARCHAR(32), \n\texif_focal VARCHAR(32), \n\texif_flash BOOLEAN, \n\texif_orientation INTEGER, \n\texif_software VARCHAR(256), \n\tocr_text TEXT, \n\tocr_language VARCHAR(64), \n\tocr_confidence FLOAT, \n\tocr_has_text BOOLEAN, \n\tai_description TEXT, \n\tai_tags JSON, \n\tai_confidence FLOAT, \n\tai_model_used VARCHAR(128), \n\tai_processed_at DATETIME, \n\tai_prompt_tokens INTEGER, \n\tai_output_tokens INTEGER, \n\tPRIMARY KEY (id), \n\tFOREIGN KEY(client_id) REFERENCES api_clients (id)\n)\n\n', ()) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92553840>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92553840>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92551D40>, 'CREATE UNIQUE INDEX ix_images_uuid ON images (uuid)', ())
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92551D40>, 'CREATE UNIQUE INDEX ix_images_uuid ON images (uuid)', ()) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92551D40>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92551D40>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92553340>, 'CREATE INDEX ix_images_id ON images (id)', ())
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E92553340>, 'CREATE INDEX ix_images_id ON images (id)', ()) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92553340>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E92553340>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925E3CC0>, 'CREATE INDEX ix_images_client_id ON images (client_id)', ())
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925E3CC0>, 'CREATE INDEX ix_images_client_id ON images (client_id)', ()) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925E3CC0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925E3CC0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925E3B40>, 'CREATE INDEX ix_images_processing_status ON images (processing_status)', ())
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925E3B40>, 'CREATE INDEX ix_images_processing_status ON images (processing_status)', ()) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925E3B40>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925E3B40>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method commit of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method commit of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method rollback of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method rollback of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
-------------------------- Captured stdout teardown ---------------------------
2026-02-25T15:57:40.000120Z [debug ] executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:40.000459Z [debug ] operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:40.000702Z [debug ] executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925F4AC0>, 'PRAGMA main.table_info("images")', ()) [aiosqlite]
2026-02-25T15:57:40.000868Z [debug ] operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925F4AC0>, 'PRAGMA main.table_info("images")', ()) completed [aiosqlite]
2026-02-25T15:57:40.001070Z [debug ] executing functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E925F4AC0>) [aiosqlite]
2026-02-25T15:57:40.001228Z [debug ] operation functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E925F4AC0>) completed [aiosqlite]
2026-02-25T15:57:40.001430Z [debug ] executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925F4AC0>) [aiosqlite]
2026-02-25T15:57:40.001555Z [debug ] operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925F4AC0>) completed [aiosqlite]
2026-02-25T15:57:40.001964Z [debug ] executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:40.002215Z [debug ] operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:40.002528Z [debug ] executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925F4D40>, 'PRAGMA main.table_info("api_clients")', ()) [aiosqlite]
2026-02-25T15:57:40.002686Z [debug ] operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925F4D40>, 'PRAGMA main.table_info("api_clients")', ()) completed [aiosqlite]
2026-02-25T15:57:40.002942Z [debug ] executing functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E925F4D40>) [aiosqlite]
2026-02-25T15:57:40.003090Z [debug ] operation functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E925F4D40>) completed [aiosqlite]
2026-02-25T15:57:40.003281Z [debug ] executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925F4D40>) [aiosqlite]
2026-02-25T15:57:40.003425Z [debug ] operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925F4D40>) completed [aiosqlite]
2026-02-25T15:57:40.003745Z [debug ] executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:40.003872Z [debug ] operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:40.004073Z [debug ] executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925F4CC0>, '\nDROP TABLE images', ()) [aiosqlite]
2026-02-25T15:57:40.004420Z [debug ] operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925F4CC0>, '\nDROP TABLE images', ()) completed [aiosqlite]
2026-02-25T15:57:40.004632Z [debug ] executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925F4CC0>) [aiosqlite]
2026-02-25T15:57:40.004759Z [debug ] operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925F4CC0>) completed [aiosqlite]
2026-02-25T15:57:40.005040Z [debug ] executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:40.005167Z [debug ] operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:40.005416Z [debug ] executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925F4C40>, '\nDROP TABLE api_clients', ()) [aiosqlite]
2026-02-25T15:57:40.005629Z [debug ] operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925F4C40>, '\nDROP TABLE api_clients', ()) completed [aiosqlite]
2026-02-25T15:57:40.005852Z [debug ] executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925F4C40>) [aiosqlite]
2026-02-25T15:57:40.005978Z [debug ] operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925F4C40>) completed [aiosqlite]
2026-02-25T15:57:40.006305Z [debug ] executing functools.partial(<built-in method commit of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:40.006439Z [debug ] operation functools.partial(<built-in method commit of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:40.006732Z [debug ] executing functools.partial(<built-in method rollback of sqlite3.Connection object at 0x0000026E9249F4C0>) [aiosqlite]
2026-02-25T15:57:40.006982Z [debug ] operation functools.partial(<built-in method rollback of sqlite3.Connection object at 0x0000026E9249F4C0>) completed [aiosqlite]
2026-02-25T15:57:40.007572Z [debug ] Using proactor: IocpProactor [asyncio]
---------------------------- Captured log teardown ----------------------------
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925F4AC0>, 'PRAGMA main.table_info("images")', ())
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925F4AC0>, 'PRAGMA main.table_info("images")', ()) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E925F4AC0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E925F4AC0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925F4AC0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925F4AC0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925F4D40>, 'PRAGMA main.table_info("api_clients")', ())
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925F4D40>, 'PRAGMA main.table_info("api_clients")', ()) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E925F4D40>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x0000026E925F4D40>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925F4D40>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925F4D40>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925F4CC0>, '\nDROP TABLE images', ())
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925F4CC0>, '\nDROP TABLE images', ()) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925F4CC0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925F4CC0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method cursor of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925F4C40>, '\nDROP TABLE api_clients', ())
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x0000026E925F4C40>, '\nDROP TABLE api_clients', ()) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925F4C40>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x0000026E925F4C40>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method commit of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method commit of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG aiosqlite:core.py:114 executing functools.partial(<built-in method rollback of sqlite3.Connection object at 0x0000026E9249F4C0>)
DEBUG aiosqlite:core.py:116 operation functools.partial(<built-in method rollback of sqlite3.Connection object at 0x0000026E9249F4C0>) completed
DEBUG asyncio:proactor_events.py:633 Using proactor: IocpProactor
============================== warnings summary ===============================
..\..\..\..\Users\bruno\scoop\apps\python\current\Lib\site-packages\_pytest\config\__init__.py:1441
C:\Users\bruno\scoop\apps\python\current\Lib\site-packages\_pytest\config\__init__.py:1441: PytestConfigWarning: Unknown config option: env
self._warn_or_fail_if_strict(f"Unknown config option: {key}\n")
-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
=========================== short test summary info ===========================
FAILED tests/test_services.py::test_exif_missing_file - TypeError: 'coroutine...
FAILED tests/test_services.py::test_ocr_disabled - TypeError: 'coroutine' obj...
FAILED tests/test_services.py::test_image_detail_schema - pydantic_core._pyda...
=================== 3 failed, 4 passed, 1 warning in 0.55s ====================
<sys>:0: RuntimeWarning: coroutine 'extract_exif' was never awaited
RuntimeWarning: Enable tracemalloc to get the object allocation traceback
<sys>:0: RuntimeWarning: coroutine 'extract_text' was never awaited
RuntimeWarning: Enable tracemalloc to get the object allocation traceback