diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 14e0554b..1049dc05 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -15,25 +15,16 @@ repos: hooks: - id: debug-statements - id: trailing-whitespace - exclude: ^server/trials - id: detect-private-key - - repo: https://github.com/psf/black - rev: 24.1.1 - hooks: - - id: black - files: ^server/(reflector|tests)/ - - - repo: https://github.com/pycqa/isort - rev: 5.12.0 - hooks: - - id: isort - name: isort (python) - files: ^server/(gpu|evaluate|reflector)/ - args: [ "--profile", "black", "--filter-files" ] - - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.6.5 + rev: v0.8.2 hooks: - id: ruff - files: ^server/(reflector|tests)/ + args: + - --fix + - --select + - I,F401 + files: ^server/ + - id: ruff-format + files: ^server/ diff --git a/server/migrations/env.py b/server/migrations/env.py index 6960f0aa..7a592836 100644 --- a/server/migrations/env.py +++ b/server/migrations/env.py @@ -1,9 +1,10 @@ from logging.config import fileConfig from alembic import context +from sqlalchemy import engine_from_config, pool + from reflector.db import metadata from reflector.settings import settings -from sqlalchemy import engine_from_config, pool # this is the Alembic Config object, which provides # access to the values within the .ini file in use. diff --git a/server/migrations/versions/0925da921477_unique_room_names.py b/server/migrations/versions/0925da921477_unique_room_names.py index d9dbc194..b0d18249 100644 --- a/server/migrations/versions/0925da921477_unique_room_names.py +++ b/server/migrations/versions/0925da921477_unique_room_names.py @@ -8,7 +8,6 @@ Create Date: 2024-09-24 16:12:56.944133 from typing import Sequence, Union -import sqlalchemy as sa from alembic import op # revision identifiers, used by Alembic. diff --git a/server/migrations/versions/0fea6d96b096_add_share_mode.py b/server/migrations/versions/0fea6d96b096_add_share_mode.py index 48746c3b..932721f6 100644 --- a/server/migrations/versions/0fea6d96b096_add_share_mode.py +++ b/server/migrations/versions/0fea6d96b096_add_share_mode.py @@ -5,11 +5,11 @@ Revises: f819277e5169 Create Date: 2023-11-07 11:12:21.614198 """ + from typing import Sequence, Union -from alembic import op import sqlalchemy as sa - +from alembic import op # revision identifiers, used by Alembic. revision: str = "0fea6d96b096" diff --git a/server/migrations/versions/125031f7cb78_participants.py b/server/migrations/versions/125031f7cb78_participants.py index c345b083..408acdc2 100644 --- a/server/migrations/versions/125031f7cb78_participants.py +++ b/server/migrations/versions/125031f7cb78_participants.py @@ -5,26 +5,26 @@ Revises: 0fea6d96b096 Create Date: 2023-11-30 15:56:03.341466 """ + from typing import Sequence, Union -from alembic import op import sqlalchemy as sa - +from alembic import op # revision identifiers, used by Alembic. -revision: str = '125031f7cb78' -down_revision: Union[str, None] = '0fea6d96b096' +revision: str = "125031f7cb78" +down_revision: Union[str, None] = "0fea6d96b096" branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### - op.add_column('transcript', sa.Column('participants', sa.JSON(), nullable=True)) + op.add_column("transcript", sa.Column("participants", sa.JSON(), nullable=True)) # ### end Alembic commands ### def downgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### - op.drop_column('transcript', 'participants') + op.drop_column("transcript", "participants") # ### end Alembic commands ### diff --git a/server/migrations/versions/20250617140003_add_meeting_consent_table.py b/server/migrations/versions/20250617140003_add_meeting_consent_table.py index ae85219c..246c699d 100644 --- a/server/migrations/versions/20250617140003_add_meeting_consent_table.py +++ b/server/migrations/versions/20250617140003_add_meeting_consent_table.py @@ -5,6 +5,7 @@ Revises: f819277e5169 Create Date: 2025-06-17 14:00:03.000000 """ + from typing import Sequence, Union import sqlalchemy as sa @@ -19,16 +20,16 @@ depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: op.create_table( - 'meeting_consent', - sa.Column('id', sa.String(), nullable=False), - sa.Column('meeting_id', sa.String(), nullable=False), - sa.Column('user_id', sa.String(), nullable=True), - sa.Column('consent_given', sa.Boolean(), nullable=False), - sa.Column('consent_timestamp', sa.DateTime(), nullable=False), - sa.PrimaryKeyConstraint('id'), - sa.ForeignKeyConstraint(['meeting_id'], ['meeting.id']), + "meeting_consent", + sa.Column("id", sa.String(), nullable=False), + sa.Column("meeting_id", sa.String(), nullable=False), + sa.Column("user_id", sa.String(), nullable=True), + sa.Column("consent_given", sa.Boolean(), nullable=False), + sa.Column("consent_timestamp", sa.DateTime(), nullable=False), + sa.PrimaryKeyConstraint("id"), + sa.ForeignKeyConstraint(["meeting_id"], ["meeting.id"]), ) def downgrade() -> None: - op.drop_table('meeting_consent') \ No newline at end of file + op.drop_table("meeting_consent") diff --git a/server/migrations/versions/20250618140000_add_audio_deleted_field_to_transcript.py b/server/migrations/versions/20250618140000_add_audio_deleted_field_to_transcript.py index 928e8183..f3b364f1 100644 --- a/server/migrations/versions/20250618140000_add_audio_deleted_field_to_transcript.py +++ b/server/migrations/versions/20250618140000_add_audio_deleted_field_to_transcript.py @@ -5,6 +5,7 @@ Revises: 20250617140003 Create Date: 2025-06-18 14:00:00.000000 """ + from typing import Sequence, Union import sqlalchemy as sa @@ -22,4 +23,4 @@ def upgrade() -> None: def downgrade() -> None: - op.drop_column("transcript", "audio_deleted") \ No newline at end of file + op.drop_column("transcript", "audio_deleted") diff --git a/server/migrations/versions/2cf0b60a9d34_fix_transcript_duration_type.py b/server/migrations/versions/2cf0b60a9d34_fix_transcript_duration_type.py index 5ce9ea89..e4d4ccc3 100644 --- a/server/migrations/versions/2cf0b60a9d34_fix_transcript_duration_type.py +++ b/server/migrations/versions/2cf0b60a9d34_fix_transcript_duration_type.py @@ -5,36 +5,40 @@ Revises: ccd68dc784ff Create Date: 2025-07-15 16:53:40.397394 """ + from typing import Sequence, Union -from alembic import op import sqlalchemy as sa - +from alembic import op # revision identifiers, used by Alembic. -revision: str = '2cf0b60a9d34' -down_revision: Union[str, None] = 'ccd68dc784ff' +revision: str = "2cf0b60a9d34" +down_revision: Union[str, None] = "ccd68dc784ff" branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### - with op.batch_alter_table('transcript', schema=None) as batch_op: - batch_op.alter_column('duration', - existing_type=sa.INTEGER(), - type_=sa.Float(), - existing_nullable=True) + with op.batch_alter_table("transcript", schema=None) as batch_op: + batch_op.alter_column( + "duration", + existing_type=sa.INTEGER(), + type_=sa.Float(), + existing_nullable=True, + ) # ### end Alembic commands ### def downgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### - with op.batch_alter_table('transcript', schema=None) as batch_op: - batch_op.alter_column('duration', - existing_type=sa.Float(), - type_=sa.INTEGER(), - existing_nullable=True) + with op.batch_alter_table("transcript", schema=None) as batch_op: + batch_op.alter_column( + "duration", + existing_type=sa.Float(), + type_=sa.INTEGER(), + existing_nullable=True, + ) # ### end Alembic commands ### diff --git a/server/migrations/versions/38a927dcb099_rename_back_text_to_transcript.py b/server/migrations/versions/38a927dcb099_rename_back_text_to_transcript.py index dffe6fa1..4313ce23 100644 --- a/server/migrations/versions/38a927dcb099_rename_back_text_to_transcript.py +++ b/server/migrations/versions/38a927dcb099_rename_back_text_to_transcript.py @@ -5,17 +5,17 @@ Revises: 9920ecfe2735 Create Date: 2023-11-02 19:53:09.116240 """ + from typing import Sequence, Union -from alembic import op import sqlalchemy as sa -from sqlalchemy.sql import table, column +from alembic import op from sqlalchemy import select - +from sqlalchemy.sql import column, table # revision identifiers, used by Alembic. -revision: str = '38a927dcb099' -down_revision: Union[str, None] = '9920ecfe2735' +revision: str = "38a927dcb099" +down_revision: Union[str, None] = "9920ecfe2735" branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None diff --git a/server/migrations/versions/4814901632bc_fix_duration.py b/server/migrations/versions/4814901632bc_fix_duration.py index 66628bb5..2028f977 100644 --- a/server/migrations/versions/4814901632bc_fix_duration.py +++ b/server/migrations/versions/4814901632bc_fix_duration.py @@ -5,13 +5,13 @@ Revises: 38a927dcb099 Create Date: 2023-11-10 18:12:17.886522 """ + from typing import Sequence, Union -from alembic import op import sqlalchemy as sa -from sqlalchemy.sql import table, column +from alembic import op from sqlalchemy import select - +from sqlalchemy.sql import column, table # revision identifiers, used by Alembic. revision: str = "4814901632bc" @@ -24,9 +24,11 @@ def upgrade() -> None: # for all the transcripts, calculate the duration from the mp3 # and update the duration column from pathlib import Path - from reflector.settings import settings + import av + from reflector.settings import settings + bind = op.get_bind() transcript = table( "transcript", column("id", sa.String), column("duration", sa.Float) diff --git a/server/migrations/versions/543ed284d69a_init.py b/server/migrations/versions/543ed284d69a_init.py index 393f8357..dac83b80 100644 --- a/server/migrations/versions/543ed284d69a_init.py +++ b/server/migrations/versions/543ed284d69a_init.py @@ -5,14 +5,11 @@ Revises: Create Date: 2023-08-29 10:54:45.142974 """ + from typing import Sequence, Union -from alembic import op -import sqlalchemy as sa - - # revision identifiers, used by Alembic. -revision: str = '543ed284d69a' +revision: str = "543ed284d69a" down_revision: Union[str, None] = None branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None diff --git a/server/migrations/versions/62dea3db63a5_add_room_options.py b/server/migrations/versions/62dea3db63a5_add_room_options.py index aa47b98d..889e6c38 100644 --- a/server/migrations/versions/62dea3db63a5_add_room_options.py +++ b/server/migrations/versions/62dea3db63a5_add_room_options.py @@ -8,9 +8,8 @@ Create Date: 2025-06-27 09:04:21.006823 from typing import Sequence, Union -from alembic import op import sqlalchemy as sa - +from alembic import op # revision identifiers, used by Alembic. revision: str = "62dea3db63a5" diff --git a/server/migrations/versions/764ce6db4388_add_zulip_message_id.py b/server/migrations/versions/764ce6db4388_add_zulip_message_id.py index ba66a27e..2c3ddb04 100644 --- a/server/migrations/versions/764ce6db4388_add_zulip_message_id.py +++ b/server/migrations/versions/764ce6db4388_add_zulip_message_id.py @@ -5,26 +5,28 @@ Revises: 62dea3db63a5 Create Date: 2024-09-06 14:02:06.649665 """ + from typing import Sequence, Union -from alembic import op import sqlalchemy as sa - +from alembic import op # revision identifiers, used by Alembic. -revision: str = '764ce6db4388' -down_revision: Union[str, None] = '62dea3db63a5' +revision: str = "764ce6db4388" +down_revision: Union[str, None] = "62dea3db63a5" branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### - op.add_column('transcript', sa.Column('zulip_message_id', sa.Integer(), nullable=True)) + op.add_column( + "transcript", sa.Column("zulip_message_id", sa.Integer(), nullable=True) + ) # ### end Alembic commands ### def downgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### - op.drop_column('transcript', 'zulip_message_id') + op.drop_column("transcript", "zulip_message_id") # ### end Alembic commands ### diff --git a/server/migrations/versions/88d292678ba2_fix_transcript_json_nan_values.py b/server/migrations/versions/88d292678ba2_fix_transcript_json_nan_values.py index e28416bd..361d403e 100644 --- a/server/migrations/versions/88d292678ba2_fix_transcript_json_nan_values.py +++ b/server/migrations/versions/88d292678ba2_fix_transcript_json_nan_values.py @@ -9,8 +9,6 @@ Create Date: 2025-07-15 19:30:19.876332 from typing import Sequence, Union from alembic import op -import sqlalchemy as sa - # revision identifiers, used by Alembic. revision: str = "88d292678ba2" @@ -21,7 +19,7 @@ depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: import json - import re + from sqlalchemy import text # Get database connection @@ -58,7 +56,9 @@ def upgrade() -> None: fixed_events = json.dumps(jevents) assert "NaN" not in fixed_events except (json.JSONDecodeError, AssertionError) as e: - print(f"Warning: Invalid JSON for transcript {transcript_id}, skipping: {e}") + print( + f"Warning: Invalid JSON for transcript {transcript_id}, skipping: {e}" + ) continue # Update the record with fixed JSON diff --git a/server/migrations/versions/9920ecfe2735_rename_transcript_to_text.py b/server/migrations/versions/9920ecfe2735_rename_transcript_to_text.py index caecaefd..7215c000 100644 --- a/server/migrations/versions/9920ecfe2735_rename_transcript_to_text.py +++ b/server/migrations/versions/9920ecfe2735_rename_transcript_to_text.py @@ -5,13 +5,13 @@ Revises: 99365b0cd87b Create Date: 2023-11-02 18:55:17.019498 """ + from typing import Sequence, Union -from alembic import op import sqlalchemy as sa -from sqlalchemy.sql import table, column +from alembic import op from sqlalchemy import select - +from sqlalchemy.sql import column, table # revision identifiers, used by Alembic. revision: str = "9920ecfe2735" diff --git a/server/migrations/versions/99365b0cd87b_add_title_short_and_long_summary_and_.py b/server/migrations/versions/99365b0cd87b_add_title_short_and_long_summary_and_.py index a1b67945..97900478 100644 --- a/server/migrations/versions/99365b0cd87b_add_title_short_and_long_summary_and_.py +++ b/server/migrations/versions/99365b0cd87b_add_title_short_and_long_summary_and_.py @@ -8,8 +8,8 @@ Create Date: 2023-09-01 20:19:47.216334 from typing import Sequence, Union -from alembic import op import sqlalchemy as sa +from alembic import op # revision identifiers, used by Alembic. revision: str = "99365b0cd87b" diff --git a/server/migrations/versions/a9c9c229ee36_transcript_composite_index.py b/server/migrations/versions/a9c9c229ee36_transcript_composite_index.py index a206732a..b6fd735b 100644 --- a/server/migrations/versions/a9c9c229ee36_transcript_composite_index.py +++ b/server/migrations/versions/a9c9c229ee36_transcript_composite_index.py @@ -9,8 +9,6 @@ Create Date: 2025-07-15 20:09:40.253018 from typing import Sequence, Union from alembic import op -import sqlalchemy as sa -from sqlalchemy.dialects import postgresql # revision identifiers, used by Alembic. revision: str = "a9c9c229ee36" diff --git a/server/migrations/versions/b0e5f7876032_add_meeting_is_active.py b/server/migrations/versions/b0e5f7876032_add_meeting_is_active.py index a3be5df2..e7a8514c 100644 --- a/server/migrations/versions/b0e5f7876032_add_meeting_is_active.py +++ b/server/migrations/versions/b0e5f7876032_add_meeting_is_active.py @@ -5,30 +5,34 @@ Revises: 6ea59639f30e Create Date: 2025-01-28 10:06:50.446233 """ + from typing import Sequence, Union -from alembic import op import sqlalchemy as sa - +from alembic import op # revision identifiers, used by Alembic. -revision: str = 'b0e5f7876032' -down_revision: Union[str, None] = '6ea59639f30e' +revision: str = "b0e5f7876032" +down_revision: Union[str, None] = "6ea59639f30e" branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### - with op.batch_alter_table('meeting', schema=None) as batch_op: - batch_op.add_column(sa.Column('is_active', sa.Boolean(), server_default=sa.text('1'), nullable=False)) + with op.batch_alter_table("meeting", schema=None) as batch_op: + batch_op.add_column( + sa.Column( + "is_active", sa.Boolean(), server_default=sa.text("1"), nullable=False + ) + ) # ### end Alembic commands ### def downgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### - with op.batch_alter_table('meeting', schema=None) as batch_op: - batch_op.drop_column('is_active') + with op.batch_alter_table("meeting", schema=None) as batch_op: + batch_op.drop_column("is_active") # ### end Alembic commands ### diff --git a/server/migrations/versions/b3df9681cae9_add_transcript_table.py b/server/migrations/versions/b3df9681cae9_add_transcript_table.py index 27e3493d..79c8e9c0 100644 --- a/server/migrations/versions/b3df9681cae9_add_transcript_table.py +++ b/server/migrations/versions/b3df9681cae9_add_transcript_table.py @@ -8,9 +8,8 @@ Create Date: 2025-06-27 08:57:16.306940 from typing import Sequence, Union -from alembic import op import sqlalchemy as sa - +from alembic import op # revision identifiers, used by Alembic. revision: str = "b3df9681cae9" diff --git a/server/migrations/versions/b469348df210_remove_viewer_room_url.py b/server/migrations/versions/b469348df210_remove_viewer_room_url.py index d434ca1a..b31539e8 100644 --- a/server/migrations/versions/b469348df210_remove_viewer_room_url.py +++ b/server/migrations/versions/b469348df210_remove_viewer_room_url.py @@ -8,9 +8,8 @@ Create Date: 2024-10-11 13:45:28.914902 from typing import Sequence, Union -from alembic import op import sqlalchemy as sa - +from alembic import op # revision identifiers, used by Alembic. revision: str = "b469348df210" diff --git a/server/migrations/versions/b7df9609542c_add_unique_constraint_one_active_.py b/server/migrations/versions/b7df9609542c_add_unique_constraint_one_active_.py index 2ff02fef..6ee9cdda 100644 --- a/server/migrations/versions/b7df9609542c_add_unique_constraint_one_active_.py +++ b/server/migrations/versions/b7df9609542c_add_unique_constraint_one_active_.py @@ -5,15 +5,15 @@ Revises: d7fbb74b673b Create Date: 2025-07-25 16:27:06.959868 """ + from typing import Sequence, Union -from alembic import op import sqlalchemy as sa - +from alembic import op # revision identifiers, used by Alembic. -revision: str = 'b7df9609542c' -down_revision: Union[str, None] = 'd7fbb74b673b' +revision: str = "b7df9609542c" +down_revision: Union[str, None] = "d7fbb74b673b" branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None @@ -22,14 +22,14 @@ def upgrade() -> None: # Create a partial unique index that ensures only one active meeting per room # This works for both PostgreSQL and SQLite op.create_index( - 'idx_one_active_meeting_per_room', - 'meeting', - ['room_id'], + "idx_one_active_meeting_per_room", + "meeting", + ["room_id"], unique=True, - postgresql_where=sa.text('is_active = true'), - sqlite_where=sa.text('is_active = 1') + postgresql_where=sa.text("is_active = true"), + sqlite_where=sa.text("is_active = 1"), ) def downgrade() -> None: - op.drop_index('idx_one_active_meeting_per_room', table_name='meeting') + op.drop_index("idx_one_active_meeting_per_room", table_name="meeting") diff --git a/server/migrations/versions/b9348748bbbc_reviewed.py b/server/migrations/versions/b9348748bbbc_reviewed.py index f9f23c3e..e4395190 100644 --- a/server/migrations/versions/b9348748bbbc_reviewed.py +++ b/server/migrations/versions/b9348748bbbc_reviewed.py @@ -5,25 +5,31 @@ Revises: 125031f7cb78 Create Date: 2023-12-13 15:37:51.303970 """ + from typing import Sequence, Union -from alembic import op import sqlalchemy as sa +from alembic import op # revision identifiers, used by Alembic. -revision: str = 'b9348748bbbc' -down_revision: Union[str, None] = '125031f7cb78' +revision: str = "b9348748bbbc" +down_revision: Union[str, None] = "125031f7cb78" branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### - op.add_column('transcript', sa.Column('reviewed', sa.Boolean(), server_default=sa.text('0'), nullable=False)) + op.add_column( + "transcript", + sa.Column( + "reviewed", sa.Boolean(), server_default=sa.text("0"), nullable=False + ), + ) # ### end Alembic commands ### def downgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### - op.drop_column('transcript', 'reviewed') + op.drop_column("transcript", "reviewed") # ### end Alembic commands ### diff --git a/server/migrations/versions/ccd68dc784ff_add_performance_indexes.py b/server/migrations/versions/ccd68dc784ff_add_performance_indexes.py index ad6d214b..7481ef43 100644 --- a/server/migrations/versions/ccd68dc784ff_add_performance_indexes.py +++ b/server/migrations/versions/ccd68dc784ff_add_performance_indexes.py @@ -9,8 +9,6 @@ Create Date: 2025-07-15 11:48:42.854741 from typing import Sequence, Union from alembic import op -import sqlalchemy as sa - # revision identifiers, used by Alembic. revision: str = "ccd68dc784ff" diff --git a/server/migrations/versions/d3ff3a39297f_add_recordings.py b/server/migrations/versions/d3ff3a39297f_add_recordings.py index f99d9646..4989dee4 100644 --- a/server/migrations/versions/d3ff3a39297f_add_recordings.py +++ b/server/migrations/versions/d3ff3a39297f_add_recordings.py @@ -8,9 +8,8 @@ Create Date: 2025-06-27 09:27:25.302152 from typing import Sequence, Union -from alembic import op import sqlalchemy as sa - +from alembic import op # revision identifiers, used by Alembic. revision: str = "d3ff3a39297f" diff --git a/server/migrations/versions/d7fbb74b673b_add_room_id_to_transcript.py b/server/migrations/versions/d7fbb74b673b_add_room_id_to_transcript.py index 337fbc94..55cedc54 100644 --- a/server/migrations/versions/d7fbb74b673b_add_room_id_to_transcript.py +++ b/server/migrations/versions/d7fbb74b673b_add_room_id_to_transcript.py @@ -56,4 +56,4 @@ def downgrade() -> None: op.drop_index("idx_transcript_room_id", "transcript") # Drop the room_id column - op.drop_column("transcript", "room_id") \ No newline at end of file + op.drop_column("transcript", "room_id") diff --git a/server/migrations/versions/f819277e5169_audio_location.py b/server/migrations/versions/f819277e5169_audio_location.py index 061abec4..4d53c6ea 100644 --- a/server/migrations/versions/f819277e5169_audio_location.py +++ b/server/migrations/versions/f819277e5169_audio_location.py @@ -5,11 +5,11 @@ Revises: 4814901632bc Create Date: 2023-11-16 10:29:09.351664 """ + from typing import Sequence, Union -from alembic import op import sqlalchemy as sa - +from alembic import op # revision identifiers, used by Alembic. revision: str = "f819277e5169" diff --git a/server/reflector/app.py b/server/reflector/app.py index fa45256f..e1d07d20 100644 --- a/server/reflector/app.py +++ b/server/reflector/app.py @@ -1,12 +1,13 @@ from contextlib import asynccontextmanager -import reflector.auth # noqa -import reflector.db # noqa from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from fastapi.routing import APIRoute from fastapi_pagination import add_pagination from prometheus_fastapi_instrumentator import Instrumentator + +import reflector.auth # noqa +import reflector.db # noqa from reflector.events import subscribers_shutdown, subscribers_startup from reflector.logger import logger from reflector.metrics import metrics_init diff --git a/server/reflector/auth/__init__.py b/server/reflector/auth/__init__.py index 65e75d9b..6e1e010e 100644 --- a/server/reflector/auth/__init__.py +++ b/server/reflector/auth/__init__.py @@ -1,7 +1,8 @@ -from reflector.settings import settings -from reflector.logger import logger import importlib +from reflector.logger import logger +from reflector.settings import settings + logger.info(f"User authentication using {settings.AUTH_BACKEND}") module_name = f"reflector.auth.auth_{settings.AUTH_BACKEND}" auth_module = importlib.import_module(module_name) diff --git a/server/reflector/auth/auth_jwt.py b/server/reflector/auth/auth_jwt.py index ed76d84b..4cc8ba03 100644 --- a/server/reflector/auth/auth_jwt.py +++ b/server/reflector/auth/auth_jwt.py @@ -4,6 +4,7 @@ from fastapi import Depends, HTTPException from fastapi.security import OAuth2PasswordBearer from jose import JWTError, jwt from pydantic import BaseModel + from reflector.logger import logger from reflector.settings import settings diff --git a/server/reflector/auth/auth_none.py b/server/reflector/auth/auth_none.py index 1c1dd0fd..3ef7c923 100644 --- a/server/reflector/auth/auth_none.py +++ b/server/reflector/auth/auth_none.py @@ -1,7 +1,8 @@ -from pydantic import BaseModel from typing import Annotated + from fastapi import Depends from fastapi.security import OAuth2PasswordBearer +from pydantic import BaseModel oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token", auto_error=False) diff --git a/server/reflector/client.py b/server/reflector/client.py index 3e2d25de..7a214e55 100644 --- a/server/reflector/client.py +++ b/server/reflector/client.py @@ -1,12 +1,12 @@ import argparse import asyncio import signal +from typing import NoReturn from aiortc.contrib.signaling import add_signaling_arguments, create_signaling from reflector.logger import logger from reflector.stream_client import StreamClient -from typing import NoReturn async def main() -> NoReturn: diff --git a/server/reflector/db/__init__.py b/server/reflector/db/__init__.py index c3e08a2f..d1b9361a 100644 --- a/server/reflector/db/__init__.py +++ b/server/reflector/db/__init__.py @@ -1,5 +1,6 @@ import databases import sqlalchemy + from reflector.events import subscribers_shutdown, subscribers_startup from reflector.settings import settings diff --git a/server/reflector/db/meetings.py b/server/reflector/db/meetings.py index 48582497..3153757a 100644 --- a/server/reflector/db/meetings.py +++ b/server/reflector/db/meetings.py @@ -4,6 +4,7 @@ from typing import Literal import sqlalchemy as sa from fastapi import HTTPException from pydantic import BaseModel, Field + from reflector.db import database, metadata from reflector.db.rooms import Room from reflector.utils import generate_uuid4 diff --git a/server/reflector/db/recordings.py b/server/reflector/db/recordings.py index 15e769ca..94f9e3ad 100644 --- a/server/reflector/db/recordings.py +++ b/server/reflector/db/recordings.py @@ -3,6 +3,7 @@ from typing import Literal import sqlalchemy as sa from pydantic import BaseModel, Field + from reflector.db import database, metadata from reflector.utils import generate_uuid4 diff --git a/server/reflector/db/rooms.py b/server/reflector/db/rooms.py index 6e98acff..209bf5bb 100644 --- a/server/reflector/db/rooms.py +++ b/server/reflector/db/rooms.py @@ -5,9 +5,10 @@ from typing import Literal import sqlalchemy from fastapi import HTTPException from pydantic import BaseModel, Field +from sqlalchemy.sql import false, or_ + from reflector.db import database, metadata from reflector.utils import generate_uuid4 -from sqlalchemy.sql import false, or_ rooms = sqlalchemy.Table( "room", diff --git a/server/reflector/db/transcripts.py b/server/reflector/db/transcripts.py index 7974df8b..d72f0bed 100644 --- a/server/reflector/db/transcripts.py +++ b/server/reflector/db/transcripts.py @@ -10,13 +10,14 @@ from typing import Any, Literal import sqlalchemy from fastapi import HTTPException from pydantic import BaseModel, ConfigDict, Field, field_serializer +from sqlalchemy import Enum +from sqlalchemy.sql import false, or_ + from reflector.db import database, metadata from reflector.processors.types import Word as ProcessorWord from reflector.settings import settings from reflector.storage import get_transcripts_storage from reflector.utils import generate_uuid4 -from sqlalchemy import Enum -from sqlalchemy.sql import false, or_ class SourceKind(enum.StrEnum): diff --git a/server/reflector/llm/base.py b/server/reflector/llm/base.py index e5dd220b..d26ee36e 100644 --- a/server/reflector/llm/base.py +++ b/server/reflector/llm/base.py @@ -5,11 +5,12 @@ from typing import TypeVar import nltk from prometheus_client import Counter, Histogram +from transformers import GenerationConfig + from reflector.llm.llm_params import TaskParams from reflector.logger import logger as reflector_logger from reflector.settings import settings from reflector.utils.retry import retry -from transformers import GenerationConfig T = TypeVar("T", bound="LLM") diff --git a/server/reflector/llm/llm_modal.py b/server/reflector/llm/llm_modal.py index 65473102..327300c7 100644 --- a/server/reflector/llm/llm_modal.py +++ b/server/reflector/llm/llm_modal.py @@ -1,9 +1,10 @@ import httpx +from transformers import AutoTokenizer, GenerationConfig + from reflector.llm.base import LLM from reflector.logger import logger as reflector_logger from reflector.settings import settings from reflector.utils.retry import retry -from transformers import AutoTokenizer, GenerationConfig class ModalLLM(LLM): diff --git a/server/reflector/llm/openai_llm.py b/server/reflector/llm/openai_llm.py index 14a6aa18..90f31869 100644 --- a/server/reflector/llm/openai_llm.py +++ b/server/reflector/llm/openai_llm.py @@ -1,5 +1,6 @@ import httpx from transformers import AutoTokenizer + from reflector.logger import logger diff --git a/server/reflector/pipelines/main_live_pipeline.py b/server/reflector/pipelines/main_live_pipeline.py index 8e491b70..19ff5c4d 100644 --- a/server/reflector/pipelines/main_live_pipeline.py +++ b/server/reflector/pipelines/main_live_pipeline.py @@ -16,8 +16,10 @@ import functools from contextlib import asynccontextmanager import boto3 -from celery import chord, group, shared_task, current_task +from celery import chord, current_task, group, shared_task from pydantic import BaseModel +from structlog import BoundLogger as Logger + from reflector.db.meetings import meeting_consent_controller, meetings_controller from reflector.db.recordings import recordings_controller from reflector.db.rooms import rooms_controller @@ -61,7 +63,6 @@ from reflector.zulip import ( send_message_to_zulip, update_zulip_message, ) -from structlog import BoundLogger as Logger def asynctask(f): diff --git a/server/reflector/pipelines/runner.py b/server/reflector/pipelines/runner.py index 5f0e6864..38f844e9 100644 --- a/server/reflector/pipelines/runner.py +++ b/server/reflector/pipelines/runner.py @@ -18,6 +18,7 @@ During its lifecycle, it will emit the following status: import asyncio from pydantic import BaseModel, ConfigDict + from reflector.logger import logger from reflector.processors import Pipeline diff --git a/server/reflector/processors/audio_chunker.py b/server/reflector/processors/audio_chunker.py index 8ca132a0..ffe38a37 100644 --- a/server/reflector/processors/audio_chunker.py +++ b/server/reflector/processors/audio_chunker.py @@ -1,6 +1,7 @@ -from reflector.processors.base import Processor import av +from reflector.processors.base import Processor + class AudioChunkerProcessor(Processor): """ diff --git a/server/reflector/processors/audio_diarization_modal.py b/server/reflector/processors/audio_diarization_modal.py index 511b7f70..88c32272 100644 --- a/server/reflector/processors/audio_diarization_modal.py +++ b/server/reflector/processors/audio_diarization_modal.py @@ -1,4 +1,5 @@ import httpx + from reflector.processors.audio_diarization import AudioDiarizationProcessor from reflector.processors.audio_diarization_auto import AudioDiarizationAutoProcessor from reflector.processors.types import AudioDiarizationInput, TitleSummary diff --git a/server/reflector/processors/audio_file_writer.py b/server/reflector/processors/audio_file_writer.py index 380097ef..6d525e40 100644 --- a/server/reflector/processors/audio_file_writer.py +++ b/server/reflector/processors/audio_file_writer.py @@ -1,6 +1,7 @@ from pathlib import Path import av + from reflector.processors.base import Processor diff --git a/server/reflector/processors/audio_merge.py b/server/reflector/processors/audio_merge.py index 34c1741e..710de562 100644 --- a/server/reflector/processors/audio_merge.py +++ b/server/reflector/processors/audio_merge.py @@ -1,10 +1,12 @@ -from reflector.processors.base import Processor -from reflector.processors.types import AudioFile +import io from time import monotonic_ns from uuid import uuid4 -import io + import av +from reflector.processors.base import Processor +from reflector.processors.types import AudioFile + class AudioMergeProcessor(Processor): """ diff --git a/server/reflector/processors/audio_transcript.py b/server/reflector/processors/audio_transcript.py index 3f9dc85b..deb48c57 100644 --- a/server/reflector/processors/audio_transcript.py +++ b/server/reflector/processors/audio_transcript.py @@ -1,4 +1,5 @@ from prometheus_client import Counter, Histogram + from reflector.processors.base import Processor from reflector.processors.types import AudioFile, Transcript diff --git a/server/reflector/processors/audio_transcript_modal.py b/server/reflector/processors/audio_transcript_modal.py index 1fa649e1..ebd99a6a 100644 --- a/server/reflector/processors/audio_transcript_modal.py +++ b/server/reflector/processors/audio_transcript_modal.py @@ -13,6 +13,7 @@ API will be a POST request to TRANSCRIPT_URL: """ from openai import AsyncOpenAI + from reflector.processors.audio_transcript import AudioTranscriptProcessor from reflector.processors.audio_transcript_auto import AudioTranscriptAutoProcessor from reflector.processors.types import AudioFile, Transcript, Word diff --git a/server/reflector/processors/audio_transcript_whisper.py b/server/reflector/processors/audio_transcript_whisper.py index cd96e01a..73278577 100644 --- a/server/reflector/processors/audio_transcript_whisper.py +++ b/server/reflector/processors/audio_transcript_whisper.py @@ -1,4 +1,5 @@ from faster_whisper import WhisperModel + from reflector.processors.audio_transcript import AudioTranscriptProcessor from reflector.processors.audio_transcript_auto import AudioTranscriptAutoProcessor from reflector.processors.types import AudioFile, Transcript, Word diff --git a/server/reflector/processors/base.py b/server/reflector/processors/base.py index 00f0223b..a518c4e6 100644 --- a/server/reflector/processors/base.py +++ b/server/reflector/processors/base.py @@ -5,6 +5,7 @@ from uuid import uuid4 from prometheus_client import Counter, Gauge, Histogram from pydantic import BaseModel + from reflector.logger import logger diff --git a/server/reflector/processors/summary/summary_builder.py b/server/reflector/processors/summary/summary_builder.py index 195eda23..c6744183 100644 --- a/server/reflector/processors/summary/summary_builder.py +++ b/server/reflector/processors/summary/summary_builder.py @@ -18,6 +18,7 @@ from llama_index.core.program import LLMTextCompletionProgram from llama_index.core.response_synthesizers import TreeSummarize from llama_index.llms.openai_like import OpenAILike from pydantic import BaseModel, Field + from reflector.llm.base import LLM from reflector.llm.openai_llm import OpenAILLM from reflector.settings import settings diff --git a/server/reflector/processors/transcript_translator.py b/server/reflector/processors/transcript_translator.py index aee55580..8cb9b676 100644 --- a/server/reflector/processors/transcript_translator.py +++ b/server/reflector/processors/transcript_translator.py @@ -1,4 +1,5 @@ import httpx + from reflector.processors.base import Processor from reflector.processors.types import Transcript, TranslationLanguages from reflector.settings import settings diff --git a/server/reflector/processors/types.py b/server/reflector/processors/types.py index cedb23f9..11e63b07 100644 --- a/server/reflector/processors/types.py +++ b/server/reflector/processors/types.py @@ -5,6 +5,7 @@ from pathlib import Path from profanityfilter import ProfanityFilter from pydantic import BaseModel, PrivateAttr + from reflector.redis_cache import redis_cache PUNC_RE = re.compile(r"[.;:?!…]") diff --git a/server/reflector/redis_cache.py b/server/reflector/redis_cache.py index c31471cf..2215149e 100644 --- a/server/reflector/redis_cache.py +++ b/server/reflector/redis_cache.py @@ -2,6 +2,7 @@ import functools import json import redis + from reflector.settings import settings redis_clients = {} diff --git a/server/reflector/storage/base.py b/server/reflector/storage/base.py index b51f11f6..360930d8 100644 --- a/server/reflector/storage/base.py +++ b/server/reflector/storage/base.py @@ -1,6 +1,7 @@ import importlib from pydantic import BaseModel + from reflector.settings import settings diff --git a/server/reflector/storage/storage_aws.py b/server/reflector/storage/storage_aws.py index b8e47f42..de9ccf35 100644 --- a/server/reflector/storage/storage_aws.py +++ b/server/reflector/storage/storage_aws.py @@ -1,4 +1,5 @@ import aioboto3 + from reflector.logger import logger from reflector.storage.base import FileResult, Storage diff --git a/server/reflector/stream_client.py b/server/reflector/stream_client.py index ff3076d8..e18cba5a 100644 --- a/server/reflector/stream_client.py +++ b/server/reflector/stream_client.py @@ -7,6 +7,7 @@ import httpx import stamina from aiortc import RTCPeerConnection, RTCSessionDescription from aiortc.contrib.media import MediaPlayer, MediaRelay + from reflector.logger import logger diff --git a/server/reflector/tools/process.py b/server/reflector/tools/process.py index e2e352a8..2ff72677 100644 --- a/server/reflector/tools/process.py +++ b/server/reflector/tools/process.py @@ -1,6 +1,7 @@ import asyncio import av + from reflector.logger import logger from reflector.processors import ( AudioChunkerProcessor, diff --git a/server/reflector/tools/process_with_diarization.py b/server/reflector/tools/process_with_diarization.py index 78726cc1..c7310334 100644 --- a/server/reflector/tools/process_with_diarization.py +++ b/server/reflector/tools/process_with_diarization.py @@ -9,17 +9,18 @@ This tool processes audio files locally without requiring the full server infras import asyncio import tempfile +import uuid from pathlib import Path from typing import List -import uuid import av + from reflector.logger import logger from reflector.processors import ( AudioChunkerProcessor, + AudioFileWriterProcessor, AudioMergeProcessor, AudioTranscriptAutoProcessor, - AudioFileWriterProcessor, Pipeline, PipelineEvent, TranscriptFinalSummaryProcessor, @@ -155,9 +156,10 @@ async def process_audio_file_with_diarization( # For Modal backend, we need to upload the file to S3 first if diarization_backend == "modal": + from datetime import datetime + from reflector.storage import get_transcripts_storage from reflector.utils.s3_temp_file import S3TemporaryFile - from datetime import datetime storage = get_transcripts_storage() diff --git a/server/reflector/tools/test_diarization.py b/server/reflector/tools/test_diarization.py index 20383939..bd071d96 100644 --- a/server/reflector/tools/test_diarization.py +++ b/server/reflector/tools/test_diarization.py @@ -8,7 +8,6 @@ This script helps test the diarization functionality with sample audio files. """ import asyncio -import json import sys from pathlib import Path @@ -17,23 +16,20 @@ from reflector.logger import logger async def test_diarization(audio_file: str): """Test the diarization functionality""" - + # Import the processing function from process_with_diarization import process_audio_file_with_diarization - + # Collect events events = [] - + async def event_callback(event): - events.append({ - "processor": event.processor, - "data": event.data - }) + events.append({"processor": event.processor, "data": event.data}) logger.info(f"Event from {event.processor}") - + # Process the audio file logger.info(f"Processing audio file: {audio_file}") - + try: await process_audio_file_with_diarization( audio_file, @@ -44,10 +40,10 @@ async def test_diarization(audio_file: str): enable_diarization=True, diarization_backend="modal", ) - + # Analyze results logger.info(f"Processing complete. Received {len(events)} events") - + # Look for diarization results diarized_topics = [] for event in events: @@ -56,13 +52,17 @@ async def test_diarization(audio_file: str): if hasattr(event["data"], "transcript") and event["data"].transcript: words = event["data"].transcript.words if words and hasattr(words[0], "speaker"): - speakers = set(w.speaker for w in words if hasattr(w, "speaker")) - logger.info(f"Found {len(speakers)} speakers in topic: {event['data'].title}") + speakers = set( + w.speaker for w in words if hasattr(w, "speaker") + ) + logger.info( + f"Found {len(speakers)} speakers in topic: {event['data'].title}" + ) diarized_topics.append(event["data"]) - + if diarized_topics: logger.info(f"Successfully diarized {len(diarized_topics)} topics") - + # Print sample output sample_topic = diarized_topics[0] logger.info("Sample diarized output:") @@ -70,9 +70,9 @@ async def test_diarization(audio_file: str): logger.info(f" Word {i}: '{word.text}' - Speaker {word.speaker}") else: logger.warning("No diarization results found in output") - + return events - + except Exception as e: logger.error(f"Error during processing: {e}") raise @@ -82,15 +82,15 @@ def main(): if len(sys.argv) < 2: print("Usage: python test_diarization.py ") sys.exit(1) - + audio_file = sys.argv[1] if not Path(audio_file).exists(): print(f"Error: Audio file '{audio_file}' not found") sys.exit(1) - + # Run the test asyncio.run(test_diarization(audio_file)) if __name__ == "__main__": - main() \ No newline at end of file + main() diff --git a/server/reflector/utils/retry.py b/server/reflector/utils/retry.py index 1e226119..52a2f87b 100644 --- a/server/reflector/utils/retry.py +++ b/server/reflector/utils/retry.py @@ -1,8 +1,10 @@ -from reflector.logger import logger -from time import monotonic -from httpx import HTTPStatusError, Response -from random import random import asyncio +from random import random +from time import monotonic + +from httpx import HTTPStatusError, Response + +from reflector.logger import logger class RetryException(Exception): diff --git a/server/reflector/utils/s3_temp_file.py b/server/reflector/utils/s3_temp_file.py index 17b12aaa..7dfebe60 100644 --- a/server/reflector/utils/s3_temp_file.py +++ b/server/reflector/utils/s3_temp_file.py @@ -6,8 +6,9 @@ Provides automatic cleanup of S3 files with retry logic and proper error handlin """ from typing import Optional -from reflector.storage.base import Storage + from reflector.logger import logger +from reflector.storage.base import Storage from reflector.utils.retry import retry diff --git a/server/reflector/views/meetings.py b/server/reflector/views/meetings.py index 832b7c29..fe44b174 100644 --- a/server/reflector/views/meetings.py +++ b/server/reflector/views/meetings.py @@ -1,10 +1,10 @@ from datetime import datetime from typing import Annotated, Optional -import reflector.auth as auth -from fastapi import APIRouter, HTTPException, Request, Depends +from fastapi import APIRouter, Depends, HTTPException, Request from pydantic import BaseModel +import reflector.auth as auth from reflector.db.meetings import ( MeetingConsent, meeting_consent_controller, diff --git a/server/reflector/views/rooms.py b/server/reflector/views/rooms.py index d086040c..773ce69f 100644 --- a/server/reflector/views/rooms.py +++ b/server/reflector/views/rooms.py @@ -1,19 +1,20 @@ -from datetime import datetime, timedelta -from typing import Annotated, Optional, Literal import logging +import sqlite3 +from datetime import datetime, timedelta +from typing import Annotated, Literal, Optional -import reflector.auth as auth +import asyncpg.exceptions from fastapi import APIRouter, Depends, HTTPException from fastapi_pagination import Page from fastapi_pagination.ext.databases import paginate from pydantic import BaseModel + +import reflector.auth as auth from reflector.db import database from reflector.db.meetings import meetings_controller from reflector.db.rooms import rooms_controller from reflector.settings import settings from reflector.whereby import create_meeting, upload_logo -import asyncpg.exceptions -import sqlite3 logger = logging.getLogger(__name__) diff --git a/server/reflector/views/rtc_offer.py b/server/reflector/views/rtc_offer.py index c537e878..2235aec1 100644 --- a/server/reflector/views/rtc_offer.py +++ b/server/reflector/views/rtc_offer.py @@ -6,6 +6,7 @@ from aiortc import MediaStreamTrack, RTCPeerConnection, RTCSessionDescription from fastapi import APIRouter, Request from prometheus_client import Gauge from pydantic import BaseModel + from reflector.events import subscribers_shutdown from reflector.logger import logger from reflector.pipelines.runner import PipelineRunner diff --git a/server/reflector/views/transcripts.py b/server/reflector/views/transcripts.py index 7a57d092..cedb4a79 100644 --- a/server/reflector/views/transcripts.py +++ b/server/reflector/views/transcripts.py @@ -1,12 +1,13 @@ from datetime import datetime, timedelta, timezone from typing import Annotated, Literal, Optional -import reflector.auth as auth from fastapi import APIRouter, Depends, HTTPException from fastapi_pagination import Page from fastapi_pagination.ext.databases import paginate from jose import jwt from pydantic import BaseModel, Field, field_serializer + +import reflector.auth as auth from reflector.db.meetings import meetings_controller from reflector.db.rooms import rooms_controller from reflector.db.transcripts import ( diff --git a/server/reflector/views/transcripts_audio.py b/server/reflector/views/transcripts_audio.py index c457f472..f3dccc4c 100644 --- a/server/reflector/views/transcripts_audio.py +++ b/server/reflector/views/transcripts_audio.py @@ -7,9 +7,10 @@ Transcripts audio related endpoints from typing import Annotated, Optional import httpx -import reflector.auth as auth from fastapi import APIRouter, Depends, HTTPException, Request, Response, status from jose import jwt + +import reflector.auth as auth from reflector.db.transcripts import AudioWaveform, transcripts_controller from reflector.settings import settings from reflector.views.transcripts import ALGORITHM diff --git a/server/reflector/views/transcripts_participants.py b/server/reflector/views/transcripts_participants.py index f55668e9..6b407c69 100644 --- a/server/reflector/views/transcripts_participants.py +++ b/server/reflector/views/transcripts_participants.py @@ -6,9 +6,10 @@ Transcript participants API endpoints from typing import Annotated, Optional -import reflector.auth as auth from fastapi import APIRouter, Depends, HTTPException from pydantic import BaseModel, ConfigDict, Field + +import reflector.auth as auth from reflector.db.transcripts import TranscriptParticipant, transcripts_controller from reflector.views.types import DeletionStatus diff --git a/server/reflector/views/transcripts_process.py b/server/reflector/views/transcripts_process.py index a4f4a47f..8f6d3ab6 100644 --- a/server/reflector/views/transcripts_process.py +++ b/server/reflector/views/transcripts_process.py @@ -1,9 +1,10 @@ from typing import Annotated, Optional import celery -import reflector.auth as auth from fastapi import APIRouter, Depends, HTTPException from pydantic import BaseModel + +import reflector.auth as auth from reflector.db.transcripts import transcripts_controller from reflector.pipelines.main_live_pipeline import task_pipeline_process diff --git a/server/reflector/views/transcripts_speaker.py b/server/reflector/views/transcripts_speaker.py index 89b20fa0..e027bd44 100644 --- a/server/reflector/views/transcripts_speaker.py +++ b/server/reflector/views/transcripts_speaker.py @@ -6,9 +6,10 @@ Reassign speakers in a transcript from typing import Annotated, Optional -import reflector.auth as auth from fastapi import APIRouter, Depends, HTTPException from pydantic import BaseModel, Field + +import reflector.auth as auth from reflector.db.transcripts import transcripts_controller router = APIRouter() diff --git a/server/reflector/views/transcripts_upload.py b/server/reflector/views/transcripts_upload.py index 24355570..18e75dac 100644 --- a/server/reflector/views/transcripts_upload.py +++ b/server/reflector/views/transcripts_upload.py @@ -1,9 +1,10 @@ from typing import Annotated, Optional import av -import reflector.auth as auth from fastapi import APIRouter, Depends, HTTPException, UploadFile from pydantic import BaseModel + +import reflector.auth as auth from reflector.db.transcripts import transcripts_controller from reflector.pipelines.main_live_pipeline import task_pipeline_process diff --git a/server/reflector/views/transcripts_webrtc.py b/server/reflector/views/transcripts_webrtc.py index af451411..7c3f7a24 100644 --- a/server/reflector/views/transcripts_webrtc.py +++ b/server/reflector/views/transcripts_webrtc.py @@ -1,7 +1,8 @@ from typing import Annotated, Optional -import reflector.auth as auth from fastapi import APIRouter, Depends, HTTPException, Request + +import reflector.auth as auth from reflector.db.transcripts import transcripts_controller from .rtc_offer import RtcOffer, rtc_offer_base diff --git a/server/reflector/views/transcripts_websocket.py b/server/reflector/views/transcripts_websocket.py index 04f71a0c..c78e418c 100644 --- a/server/reflector/views/transcripts_websocket.py +++ b/server/reflector/views/transcripts_websocket.py @@ -5,6 +5,7 @@ Transcripts websocket API """ from fastapi import APIRouter, HTTPException, WebSocket, WebSocketDisconnect + from reflector.db.transcripts import transcripts_controller from reflector.ws_manager import get_ws_manager diff --git a/server/reflector/views/user.py b/server/reflector/views/user.py index 4952c471..fa68f79c 100644 --- a/server/reflector/views/user.py +++ b/server/reflector/views/user.py @@ -1,9 +1,10 @@ from typing import Annotated, Optional -import reflector.auth as auth from fastapi import APIRouter, Depends from pydantic import BaseModel +import reflector.auth as auth + router = APIRouter() diff --git a/server/reflector/views/whereby.py b/server/reflector/views/whereby.py index c4d23e0b..c1682621 100644 --- a/server/reflector/views/whereby.py +++ b/server/reflector/views/whereby.py @@ -7,6 +7,7 @@ from hashlib import sha256 from fastapi import APIRouter, HTTPException, Request from pydantic import BaseModel + from reflector.db.meetings import meetings_controller from reflector.settings import settings diff --git a/server/reflector/views/zulip.py b/server/reflector/views/zulip.py index 62d77f94..2cec6de8 100644 --- a/server/reflector/views/zulip.py +++ b/server/reflector/views/zulip.py @@ -1,8 +1,9 @@ from typing import Annotated, Optional -import reflector.auth as auth from fastapi import APIRouter, Depends, HTTPException from pydantic import BaseModel + +import reflector.auth as auth from reflector.zulip import get_zulip_streams, get_zulip_topics router = APIRouter() diff --git a/server/reflector/whereby.py b/server/reflector/whereby.py index 65067f4a..a90a8498 100644 --- a/server/reflector/whereby.py +++ b/server/reflector/whereby.py @@ -1,6 +1,7 @@ from datetime import datetime import httpx + from reflector.db.rooms import Room from reflector.settings import settings diff --git a/server/reflector/worker/app.py b/server/reflector/worker/app.py index bf32ee95..7e888f41 100644 --- a/server/reflector/worker/app.py +++ b/server/reflector/worker/app.py @@ -2,6 +2,7 @@ import celery import structlog from celery import Celery from celery.schedules import crontab + from reflector.settings import settings logger = structlog.get_logger(__name__) diff --git a/server/reflector/worker/healthcheck.py b/server/reflector/worker/healthcheck.py index e4ce6bc3..6cb16f38 100644 --- a/server/reflector/worker/healthcheck.py +++ b/server/reflector/worker/healthcheck.py @@ -1,6 +1,7 @@ import httpx import structlog from celery import shared_task + from reflector.settings import settings logger = structlog.get_logger(__name__) diff --git a/server/reflector/worker/process.py b/server/reflector/worker/process.py index 24d7359a..055b6755 100644 --- a/server/reflector/worker/process.py +++ b/server/reflector/worker/process.py @@ -9,6 +9,7 @@ import structlog from celery import shared_task from celery.utils.log import get_task_logger from pydantic import ValidationError + from reflector.db.meetings import meetings_controller from reflector.db.recordings import Recording, recordings_controller from reflector.db.rooms import rooms_controller diff --git a/server/reflector/ws_manager.py b/server/reflector/ws_manager.py index a84e3361..2bf5a404 100644 --- a/server/reflector/ws_manager.py +++ b/server/reflector/ws_manager.py @@ -15,6 +15,7 @@ import threading import redis.asyncio as redis from fastapi import WebSocket + from reflector.settings import settings diff --git a/server/reflector/zulip.py b/server/reflector/zulip.py index ca44a3d2..02e146c0 100644 --- a/server/reflector/zulip.py +++ b/server/reflector/zulip.py @@ -2,6 +2,7 @@ from datetime import timedelta from urllib.parse import urlparse import httpx + from reflector.db.transcripts import Transcript from reflector.settings import settings diff --git a/server/tests/conftest.py b/server/tests/conftest.py index eb242022..2707daed 100644 --- a/server/tests/conftest.py +++ b/server/tests/conftest.py @@ -1,5 +1,5 @@ -from unittest.mock import patch from tempfile import NamedTemporaryFile +from unittest.mock import patch import pytest @@ -178,14 +178,16 @@ def fake_mp3_upload(): @pytest.fixture async def fake_transcript_with_topics(tmpdir): - from reflector.settings import settings + import shutil + from pathlib import Path + + from httpx import AsyncClient + from reflector.app import app - from reflector.views.transcripts import transcripts_controller from reflector.db.transcripts import TranscriptTopic from reflector.processors.types import Word - from pathlib import Path - from httpx import AsyncClient - import shutil + from reflector.settings import settings + from reflector.views.transcripts import transcripts_controller settings.DATA_DIR = Path(tmpdir) diff --git a/server/tests/test_processor_audio_diarization.py b/server/tests/test_processor_audio_diarization.py index ad38e997..6d1041e7 100644 --- a/server/tests/test_processor_audio_diarization.py +++ b/server/tests/test_processor_audio_diarization.py @@ -1,6 +1,7 @@ -import pytest from unittest import mock +import pytest + @pytest.mark.parametrize( "name,diarization,expected", @@ -87,10 +88,10 @@ from unittest import mock async def test_processors_audio_diarization(name, diarization, expected): from reflector.processors.audio_diarization import AudioDiarizationProcessor from reflector.processors.types import ( + AudioDiarizationInput, TitleSummaryWithId, Transcript, Word, - AudioDiarizationInput, ) # create fake topic diff --git a/server/tests/test_processors_broadcast.py b/server/tests/test_processors_broadcast.py index 79aec14a..5480de36 100644 --- a/server/tests/test_processors_broadcast.py +++ b/server/tests/test_processors_broadcast.py @@ -3,7 +3,7 @@ import pytest @pytest.mark.asyncio async def test_processor_broadcast(nltk): - from reflector.processors.base import Processor, BroadcastProcessor, Pipeline + from reflector.processors.base import BroadcastProcessor, Pipeline, Processor class TestProcessor(Processor): INPUT_TYPE = str diff --git a/server/tests/test_processors_pipeline.py b/server/tests/test_processors_pipeline.py index cf93f94d..0124d5ba 100644 --- a/server/tests/test_processors_pipeline.py +++ b/server/tests/test_processors_pipeline.py @@ -11,10 +11,11 @@ async def test_basic_process( ): # goal is to start the server, and send rtc audio to it # validate the events received - from reflector.tools.process import process_audio_file - from reflector.settings import settings from pathlib import Path + from reflector.settings import settings + from reflector.tools.process import process_audio_file + # use an LLM test backend settings.LLM_BACKEND = "test" settings.TRANSCRIPT_BACKEND = "whisper" diff --git a/server/tests/test_s3_temp_file.py b/server/tests/test_s3_temp_file.py index b212fbbd..7543bcb9 100644 --- a/server/tests/test_s3_temp_file.py +++ b/server/tests/test_s3_temp_file.py @@ -3,8 +3,10 @@ Tests for S3 temporary file context manager. """ +from unittest.mock import AsyncMock, Mock + import pytest -from unittest.mock import Mock, AsyncMock + from reflector.utils.s3_temp_file import S3TemporaryFile diff --git a/server/tests/test_transcripts_audio_download.py b/server/tests/test_transcripts_audio_download.py index efedeb59..22a9cec1 100644 --- a/server/tests/test_transcripts_audio_download.py +++ b/server/tests/test_transcripts_audio_download.py @@ -1,13 +1,14 @@ -import pytest import shutil -from httpx import AsyncClient from pathlib import Path +import pytest +from httpx import AsyncClient + @pytest.fixture async def fake_transcript(tmpdir): - from reflector.settings import settings from reflector.app import app + from reflector.settings import settings from reflector.views.transcripts import transcripts_controller settings.DATA_DIR = Path(tmpdir) diff --git a/server/tests/test_transcripts_rtc_ws.py b/server/tests/test_transcripts_rtc_ws.py index 04d12563..24b70d6f 100644 --- a/server/tests/test_transcripts_rtc_ws.py +++ b/server/tests/test_transcripts_rtc_ws.py @@ -33,8 +33,8 @@ class ThreadedUvicorn: @pytest.fixture async def appserver(tmpdir, setup_database, celery_session_app, celery_session_worker): - from reflector.settings import settings from reflector.app import app + from reflector.settings import settings DATA_DIR = settings.DATA_DIR settings.DATA_DIR = Path(tmpdir) @@ -110,9 +110,11 @@ async def test_transcript_rtc_and_websocket( # create stream client import argparse - from reflector.stream_client import StreamClient + from aiortc.contrib.signaling import add_signaling_arguments, create_signaling + from reflector.stream_client import StreamClient + parser = argparse.ArgumentParser() add_signaling_arguments(parser) args = parser.parse_args(["-s", "tcp-socket"]) @@ -270,9 +272,11 @@ async def test_transcript_rtc_and_websocket_and_fr( # create stream client import argparse - from reflector.stream_client import StreamClient + from aiortc.contrib.signaling import add_signaling_arguments, create_signaling + from reflector.stream_client import StreamClient + parser = argparse.ArgumentParser() add_signaling_arguments(parser) args = parser.parse_args(["-s", "tcp-socket"])