data-syncmaster 0.3.1__tar.gz → 0.3.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/PKG-INFO +18 -18
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/README.rst +8 -8
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/data_syncmaster.egg-info/PKG-INFO +18 -18
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/data_syncmaster.egg-info/SOURCES.txt +1 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/data_syncmaster.egg-info/requires.txt +5 -5
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/pyproject.toml +17 -16
- data_syncmaster-0.3.2/syncmaster/VERSION +1 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/db/migrations/versions/2023-11-23_0007_create_transfer_table.py +2 -4
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/db/migrations/versions/2025-08-10_0012_update_ts.py +1 -2
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/auth/basic.py +1 -1
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/auth/iceberg_rest_s3_delegated/bearer.py +1 -1
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/auth/iceberg_rest_s3_delegated/oauth2_client_credentials.py +4 -1
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/auth/iceberg_rest_s3_direct/bearer.py +4 -1
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/auth/iceberg_rest_s3_direct/oauth2_client_credentials.py +4 -1
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/auth/s3.py +1 -1
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/auth/samba.py +1 -1
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/connections/iceberg.py +2 -2
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/transfers/db.py +10 -2
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/transfers/file_format.py +12 -12
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/transfers/transformations/__init__.py +4 -1
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/transfers/transformations/dataframe_columns_filter.py +6 -6
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/transfers/transformations/dataframe_rows_filter.py +24 -24
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/transfers/transformations/file_metadata_filter.py +9 -9
- data_syncmaster-0.3.2/syncmaster/schemas/v1/transfers/transformations/sql.py +28 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/transformation_types.py +1 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/worker/handlers/db/base.py +19 -1
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/worker/handlers/file/base.py +6 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/worker/handlers/file/local_df.py +10 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/worker/handlers/file/remote_df.py +10 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/worker/handlers/file/s3.py +10 -0
- data_syncmaster-0.3.1/syncmaster/VERSION +0 -1
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/LICENSE.txt +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/data_syncmaster.egg-info/dependency_links.txt +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/data_syncmaster.egg-info/top_level.txt +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/setup.cfg +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/__init__.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/db/__init__.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/db/factory.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/db/migrations/__init__.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/db/migrations/__main__.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/db/migrations/alembic.ini +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/db/migrations/env.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/db/migrations/versions/2023-11-23_0001_create_user_table.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/db/migrations/versions/2023-11-23_0002_create_group_table.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/db/migrations/versions/2023-11-23_0003_create_queue_table.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/db/migrations/versions/2023-11-23_0004_create_connection_table.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/db/migrations/versions/2023-11-23_0005_create_user_group_table.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/db/migrations/versions/2023-11-23_0006_create_auth_data_table.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/db/migrations/versions/2023-11-23_0008_create_run_table.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/db/migrations/versions/2023-11-23_0009_create_celery_tables.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/db/migrations/versions/2024-10-07_0010_add_pg_trgm_extension.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/db/migrations/versions/2024-11-01_0011_create_apscheduler_table.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/db/migrations/versions/__init__.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/db/mixins/__init__.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/db/mixins/resource.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/db/mixins/timestamp.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/db/models/__init__.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/db/models/apscheduler_job.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/db/models/auth_data.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/db/models/base.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/db/models/connection.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/db/models/group.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/db/models/queue.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/db/models/run.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/db/models/transfer.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/db/models/user.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/db/repositories/__init__.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/db/repositories/base.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/db/repositories/connection.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/db/repositories/credentials_repository.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/db/repositories/group.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/db/repositories/queue.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/db/repositories/repository_with_owner.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/db/repositories/run.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/db/repositories/search.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/db/repositories/transfer.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/db/repositories/user.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/db/repositories/utils.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/db/utils.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/dto/__init__.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/dto/connections.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/dto/runs.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/dto/transfers.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/dto/transfers_resources.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/dto/transfers_strategy.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/errors/__init__.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/errors/base.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/errors/registration.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/errors/schemas/__init__.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/errors/schemas/bad_request.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/errors/schemas/invalid_request.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/errors/schemas/not_authorized.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/exceptions/__init__.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/exceptions/auth.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/exceptions/base.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/exceptions/connection.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/exceptions/credentials.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/exceptions/group.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/exceptions/queue.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/exceptions/redirect.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/exceptions/run.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/exceptions/transfer.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/exceptions/user.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/scheduler/__init__.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/scheduler/__main__.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/scheduler/celery.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/scheduler/settings/__init__.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/scheduler/transfer_fetcher.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/scheduler/transfer_job_manager.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/scheduler/utils.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/__init__.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/ping.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/__init__.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/auth/__init__.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/auth/iceberg_rest_s3_delegated/__init__.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/auth/iceberg_rest_s3_direct/__init__.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/auth/mixins.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/auth/token.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/connection_types.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/connections/__init__.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/connections/clickhouse.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/connections/connection_base.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/connections/ftp.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/connections/ftps.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/connections/hdfs.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/connections/hive.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/connections/mssql.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/connections/mysql.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/connections/oracle.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/connections/postgres.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/connections/s3.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/connections/samba.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/connections/sftp.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/connections/webdav.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/file_formats.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/groups.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/page.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/queue.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/transfers/__init__.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/transfers/file/__init__.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/transfers/file/base.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/transfers/file/ftp.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/transfers/file/ftps.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/transfers/file/hdfs.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/transfers/file/s3.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/transfers/file/samba.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/transfers/file/sftp.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/transfers/file/webdav.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/transfers/resources.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/transfers/run.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/transfers/strategy.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/types.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/users.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/server/__init__.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/server/__main__.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/server/api/__init__.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/server/api/monitoring.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/server/api/router.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/server/api/v1/__init__.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/server/api/v1/auth.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/server/api/v1/connections.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/server/api/v1/groups.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/server/api/v1/queue.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/server/api/v1/router.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/server/api/v1/runs.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/server/api/v1/transfers.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/server/api/v1/users.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/server/dependencies/__init__.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/server/dependencies/get_access_token.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/server/dependencies/stub.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/server/handler.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/server/middlewares/__init__.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/server/middlewares/cors.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/server/middlewares/monitoring/__init__.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/server/middlewares/monitoring/metrics.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/server/middlewares/openapi.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/server/middlewares/request_id.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/server/middlewares/static_files.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/server/providers/__init__.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/server/providers/auth/__init__.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/server/providers/auth/base_provider.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/server/providers/auth/dummy_provider.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/server/providers/auth/keycloak_provider.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/server/providers/auth/oauth2_gateway_provider.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/server/scripts/export_openapi_schema.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/server/scripts/manage_superusers.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/server/services/__init__.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/server/services/get_user.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/server/services/unit_of_work.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/server/settings/__init__.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/server/settings/auth/__init__.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/server/settings/auth/dummy.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/server/settings/auth/jwt.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/server/settings/auth/keycloak.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/server/settings/auth/oauth2_gateway.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/server/settings/server/__init__.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/server/settings/server/cors.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/server/settings/server/monitoring.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/server/settings/server/openapi.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/server/settings/server/request_id.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/server/settings/server/static_files.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/server/utils/__init__.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/server/utils/jwt.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/server/utils/slug.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/settings/__init__.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/settings/base.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/settings/broker.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/settings/credentials.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/settings/database.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/settings/logging.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/worker/__init__.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/worker/base.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/worker/celery.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/worker/controller.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/worker/handlers/__init__.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/worker/handlers/base.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/worker/handlers/db/__init__.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/worker/handlers/db/clickhouse.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/worker/handlers/db/hive.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/worker/handlers/db/iceberg.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/worker/handlers/db/mssql.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/worker/handlers/db/mysql.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/worker/handlers/db/oracle.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/worker/handlers/db/postgres.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/worker/handlers/file/__init__.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/worker/handlers/file/ftp.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/worker/handlers/file/ftps.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/worker/handlers/file/hdfs.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/worker/handlers/file/samba.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/worker/handlers/file/sftp.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/worker/handlers/file/webdav.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/worker/ivy2.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/worker/settings/__init__.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/worker/settings/hwm_store.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/worker/spark.py +0 -0
- {data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/worker/transfer.py +0 -0
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: data-syncmaster
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.2
|
|
4
4
|
Summary: Syncmaster REST API + scheduler + Worker
|
|
5
5
|
Author-email: MWS Data Bridge <onetools@mts.ru>
|
|
6
6
|
License-Expression: Apache-2.0
|
|
7
|
-
Project-URL: Homepage, https://github.com/
|
|
7
|
+
Project-URL: Homepage, https://github.com/MTSWebServices/syncmaster
|
|
8
8
|
Project-URL: Documentation, https://syncmaster.readthedocs.io/
|
|
9
|
-
Project-URL: Source, https://github.com/
|
|
10
|
-
Project-URL: CI/CD, https://github.com/
|
|
11
|
-
Project-URL: Tracker, https://github.com/
|
|
9
|
+
Project-URL: Source, https://github.com/MTSWebServices/syncmaster
|
|
10
|
+
Project-URL: CI/CD, https://github.com/MTSWebServices/syncmaster/actions
|
|
11
|
+
Project-URL: Tracker, https://github.com/MTSWebServices/syncmaster/issues
|
|
12
12
|
Keywords: Syncmaster,REST,API,Worker,Spark,Transfer,ETL
|
|
13
13
|
Classifier: Development Status :: 3 - Alpha
|
|
14
14
|
Classifier: Framework :: Pydantic
|
|
@@ -27,7 +27,7 @@ Requires-Python: >=3.11
|
|
|
27
27
|
Description-Content-Type: text/x-rst
|
|
28
28
|
License-File: LICENSE.txt
|
|
29
29
|
Requires-Dist: pydantic~=2.12.5
|
|
30
|
-
Requires-Dist: pydantic-settings
|
|
30
|
+
Requires-Dist: pydantic-settings<2.14,>=2.12
|
|
31
31
|
Requires-Dist: pydantic-settings-logging~=0.1.1
|
|
32
32
|
Requires-Dist: sqlalchemy~=2.0.44
|
|
33
33
|
Requires-Dist: sqlalchemy-utils~=0.42.0
|
|
@@ -39,14 +39,14 @@ Requires-Dist: uuid6~=2025.0.1
|
|
|
39
39
|
Requires-Dist: celery~=5.6.0
|
|
40
40
|
Requires-Dist: psycopg2-binary~=2.9.11
|
|
41
41
|
Provides-Extra: server
|
|
42
|
-
Requires-Dist: fastapi~=0.
|
|
42
|
+
Requires-Dist: fastapi~=0.129; extra == "server"
|
|
43
43
|
Requires-Dist: starlette-exporter~=0.23.0; extra == "server"
|
|
44
44
|
Requires-Dist: python-multipart~=0.0.21; extra == "server"
|
|
45
|
-
Requires-Dist: uvicorn~=0.
|
|
45
|
+
Requires-Dist: uvicorn~=0.41.0; extra == "server"
|
|
46
46
|
Requires-Dist: alembic~=1.18.1; extra == "server"
|
|
47
|
-
Requires-Dist: pyjwt~=2.
|
|
47
|
+
Requires-Dist: pyjwt~=2.11.0; extra == "server"
|
|
48
48
|
Requires-Dist: asyncpg~=0.31; extra == "server"
|
|
49
|
-
Requires-Dist: python-keycloak
|
|
49
|
+
Requires-Dist: python-keycloak<7.2.0,>=7.0.1; extra == "server"
|
|
50
50
|
Requires-Dist: itsdangerous~=2.2.0; extra == "server"
|
|
51
51
|
Provides-Extra: scheduler
|
|
52
52
|
Requires-Dist: asyncpg~=0.31; extra == "scheduler"
|
|
@@ -64,9 +64,9 @@ Dynamic: license-file
|
|
|
64
64
|
|
|
65
65
|
|Logo|
|
|
66
66
|
|
|
67
|
-
.. |Logo| image:: https://raw.githubusercontent.com/
|
|
67
|
+
.. |Logo| image:: https://raw.githubusercontent.com/MTSWebServices/syncmaster/b6622b1b139137070f2287e288a4105c1110c1e4/docs/_static/logo_wide.svg
|
|
68
68
|
:alt: Data.SyncMaster logo
|
|
69
|
-
:target: https://github.com/
|
|
69
|
+
:target: https://github.com/MTSWebServices/data-syncmaster
|
|
70
70
|
|
|
71
71
|
|Repo Status| |Docker image| |PyPI| |PyPI License| |PyPI Python Version| |Documentation|
|
|
72
72
|
|Build Status| |Coverage| |pre-commit.ci|
|
|
@@ -78,18 +78,18 @@ Dynamic: license-file
|
|
|
78
78
|
.. |PyPI| image:: https://img.shields.io/pypi/v/data-syncmaster
|
|
79
79
|
:target: https://pypi.org/project/data-syncmaster/
|
|
80
80
|
.. |PyPI License| image:: https://img.shields.io/pypi/l/data-syncmaster.svg
|
|
81
|
-
:target: https://github.com/
|
|
81
|
+
:target: https://github.com/MTSWebServices/syncmaster/blob/develop/LICENSE.txt
|
|
82
82
|
.. |PyPI Python Version| image:: https://img.shields.io/pypi/pyversions/data-syncmaster.svg
|
|
83
83
|
:target: https://badge.fury.io/py/data-syncmaster
|
|
84
84
|
.. |Documentation| image:: https://readthedocs.org/projects/syncmaster/badge/?version=stable
|
|
85
85
|
:target: https://syncmaster.readthedocs.io
|
|
86
|
-
.. |Build Status| image:: https://github.com/
|
|
87
|
-
:target: https://github.com/
|
|
86
|
+
.. |Build Status| image:: https://github.com/MTSWebServices/syncmaster/workflows/Run%20All%20Tests/badge.svg
|
|
87
|
+
:target: https://github.com/MTSWebServices/syncmaster/actions
|
|
88
88
|
.. |Coverage| image:: https://img.shields.io/endpoint?url=https://gist.githubusercontent.com/
|
|
89
89
|
MTSOnGithub/03e73a82ecc4709934540ce8201cc3b4/raw/syncmaster_badge.json
|
|
90
|
-
:target: https://github.com/
|
|
91
|
-
.. |pre-commit.ci| image:: https://results.pre-commit.ci/badge/github/
|
|
92
|
-
:target: https://results.pre-commit.ci/latest/github/
|
|
90
|
+
:target: https://github.com/MTSWebServices/syncmaster/actions
|
|
91
|
+
.. |pre-commit.ci| image:: https://results.pre-commit.ci/badge/github/MTSWebServices/syncmaster/develop.svg
|
|
92
|
+
:target: https://results.pre-commit.ci/latest/github/MTSWebServices/syncmaster/develop
|
|
93
93
|
|
|
94
94
|
What is Data.SyncMaster?
|
|
95
95
|
------------------------
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
|Logo|
|
|
4
4
|
|
|
5
|
-
.. |Logo| image:: https://raw.githubusercontent.com/
|
|
5
|
+
.. |Logo| image:: https://raw.githubusercontent.com/MTSWebServices/syncmaster/b6622b1b139137070f2287e288a4105c1110c1e4/docs/_static/logo_wide.svg
|
|
6
6
|
:alt: Data.SyncMaster logo
|
|
7
|
-
:target: https://github.com/
|
|
7
|
+
:target: https://github.com/MTSWebServices/data-syncmaster
|
|
8
8
|
|
|
9
9
|
|Repo Status| |Docker image| |PyPI| |PyPI License| |PyPI Python Version| |Documentation|
|
|
10
10
|
|Build Status| |Coverage| |pre-commit.ci|
|
|
@@ -16,18 +16,18 @@
|
|
|
16
16
|
.. |PyPI| image:: https://img.shields.io/pypi/v/data-syncmaster
|
|
17
17
|
:target: https://pypi.org/project/data-syncmaster/
|
|
18
18
|
.. |PyPI License| image:: https://img.shields.io/pypi/l/data-syncmaster.svg
|
|
19
|
-
:target: https://github.com/
|
|
19
|
+
:target: https://github.com/MTSWebServices/syncmaster/blob/develop/LICENSE.txt
|
|
20
20
|
.. |PyPI Python Version| image:: https://img.shields.io/pypi/pyversions/data-syncmaster.svg
|
|
21
21
|
:target: https://badge.fury.io/py/data-syncmaster
|
|
22
22
|
.. |Documentation| image:: https://readthedocs.org/projects/syncmaster/badge/?version=stable
|
|
23
23
|
:target: https://syncmaster.readthedocs.io
|
|
24
|
-
.. |Build Status| image:: https://github.com/
|
|
25
|
-
:target: https://github.com/
|
|
24
|
+
.. |Build Status| image:: https://github.com/MTSWebServices/syncmaster/workflows/Run%20All%20Tests/badge.svg
|
|
25
|
+
:target: https://github.com/MTSWebServices/syncmaster/actions
|
|
26
26
|
.. |Coverage| image:: https://img.shields.io/endpoint?url=https://gist.githubusercontent.com/
|
|
27
27
|
MTSOnGithub/03e73a82ecc4709934540ce8201cc3b4/raw/syncmaster_badge.json
|
|
28
|
-
:target: https://github.com/
|
|
29
|
-
.. |pre-commit.ci| image:: https://results.pre-commit.ci/badge/github/
|
|
30
|
-
:target: https://results.pre-commit.ci/latest/github/
|
|
28
|
+
:target: https://github.com/MTSWebServices/syncmaster/actions
|
|
29
|
+
.. |pre-commit.ci| image:: https://results.pre-commit.ci/badge/github/MTSWebServices/syncmaster/develop.svg
|
|
30
|
+
:target: https://results.pre-commit.ci/latest/github/MTSWebServices/syncmaster/develop
|
|
31
31
|
|
|
32
32
|
What is Data.SyncMaster?
|
|
33
33
|
------------------------
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: data-syncmaster
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.2
|
|
4
4
|
Summary: Syncmaster REST API + scheduler + Worker
|
|
5
5
|
Author-email: MWS Data Bridge <onetools@mts.ru>
|
|
6
6
|
License-Expression: Apache-2.0
|
|
7
|
-
Project-URL: Homepage, https://github.com/
|
|
7
|
+
Project-URL: Homepage, https://github.com/MTSWebServices/syncmaster
|
|
8
8
|
Project-URL: Documentation, https://syncmaster.readthedocs.io/
|
|
9
|
-
Project-URL: Source, https://github.com/
|
|
10
|
-
Project-URL: CI/CD, https://github.com/
|
|
11
|
-
Project-URL: Tracker, https://github.com/
|
|
9
|
+
Project-URL: Source, https://github.com/MTSWebServices/syncmaster
|
|
10
|
+
Project-URL: CI/CD, https://github.com/MTSWebServices/syncmaster/actions
|
|
11
|
+
Project-URL: Tracker, https://github.com/MTSWebServices/syncmaster/issues
|
|
12
12
|
Keywords: Syncmaster,REST,API,Worker,Spark,Transfer,ETL
|
|
13
13
|
Classifier: Development Status :: 3 - Alpha
|
|
14
14
|
Classifier: Framework :: Pydantic
|
|
@@ -27,7 +27,7 @@ Requires-Python: >=3.11
|
|
|
27
27
|
Description-Content-Type: text/x-rst
|
|
28
28
|
License-File: LICENSE.txt
|
|
29
29
|
Requires-Dist: pydantic~=2.12.5
|
|
30
|
-
Requires-Dist: pydantic-settings
|
|
30
|
+
Requires-Dist: pydantic-settings<2.14,>=2.12
|
|
31
31
|
Requires-Dist: pydantic-settings-logging~=0.1.1
|
|
32
32
|
Requires-Dist: sqlalchemy~=2.0.44
|
|
33
33
|
Requires-Dist: sqlalchemy-utils~=0.42.0
|
|
@@ -39,14 +39,14 @@ Requires-Dist: uuid6~=2025.0.1
|
|
|
39
39
|
Requires-Dist: celery~=5.6.0
|
|
40
40
|
Requires-Dist: psycopg2-binary~=2.9.11
|
|
41
41
|
Provides-Extra: server
|
|
42
|
-
Requires-Dist: fastapi~=0.
|
|
42
|
+
Requires-Dist: fastapi~=0.129; extra == "server"
|
|
43
43
|
Requires-Dist: starlette-exporter~=0.23.0; extra == "server"
|
|
44
44
|
Requires-Dist: python-multipart~=0.0.21; extra == "server"
|
|
45
|
-
Requires-Dist: uvicorn~=0.
|
|
45
|
+
Requires-Dist: uvicorn~=0.41.0; extra == "server"
|
|
46
46
|
Requires-Dist: alembic~=1.18.1; extra == "server"
|
|
47
|
-
Requires-Dist: pyjwt~=2.
|
|
47
|
+
Requires-Dist: pyjwt~=2.11.0; extra == "server"
|
|
48
48
|
Requires-Dist: asyncpg~=0.31; extra == "server"
|
|
49
|
-
Requires-Dist: python-keycloak
|
|
49
|
+
Requires-Dist: python-keycloak<7.2.0,>=7.0.1; extra == "server"
|
|
50
50
|
Requires-Dist: itsdangerous~=2.2.0; extra == "server"
|
|
51
51
|
Provides-Extra: scheduler
|
|
52
52
|
Requires-Dist: asyncpg~=0.31; extra == "scheduler"
|
|
@@ -64,9 +64,9 @@ Dynamic: license-file
|
|
|
64
64
|
|
|
65
65
|
|Logo|
|
|
66
66
|
|
|
67
|
-
.. |Logo| image:: https://raw.githubusercontent.com/
|
|
67
|
+
.. |Logo| image:: https://raw.githubusercontent.com/MTSWebServices/syncmaster/b6622b1b139137070f2287e288a4105c1110c1e4/docs/_static/logo_wide.svg
|
|
68
68
|
:alt: Data.SyncMaster logo
|
|
69
|
-
:target: https://github.com/
|
|
69
|
+
:target: https://github.com/MTSWebServices/data-syncmaster
|
|
70
70
|
|
|
71
71
|
|Repo Status| |Docker image| |PyPI| |PyPI License| |PyPI Python Version| |Documentation|
|
|
72
72
|
|Build Status| |Coverage| |pre-commit.ci|
|
|
@@ -78,18 +78,18 @@ Dynamic: license-file
|
|
|
78
78
|
.. |PyPI| image:: https://img.shields.io/pypi/v/data-syncmaster
|
|
79
79
|
:target: https://pypi.org/project/data-syncmaster/
|
|
80
80
|
.. |PyPI License| image:: https://img.shields.io/pypi/l/data-syncmaster.svg
|
|
81
|
-
:target: https://github.com/
|
|
81
|
+
:target: https://github.com/MTSWebServices/syncmaster/blob/develop/LICENSE.txt
|
|
82
82
|
.. |PyPI Python Version| image:: https://img.shields.io/pypi/pyversions/data-syncmaster.svg
|
|
83
83
|
:target: https://badge.fury.io/py/data-syncmaster
|
|
84
84
|
.. |Documentation| image:: https://readthedocs.org/projects/syncmaster/badge/?version=stable
|
|
85
85
|
:target: https://syncmaster.readthedocs.io
|
|
86
|
-
.. |Build Status| image:: https://github.com/
|
|
87
|
-
:target: https://github.com/
|
|
86
|
+
.. |Build Status| image:: https://github.com/MTSWebServices/syncmaster/workflows/Run%20All%20Tests/badge.svg
|
|
87
|
+
:target: https://github.com/MTSWebServices/syncmaster/actions
|
|
88
88
|
.. |Coverage| image:: https://img.shields.io/endpoint?url=https://gist.githubusercontent.com/
|
|
89
89
|
MTSOnGithub/03e73a82ecc4709934540ce8201cc3b4/raw/syncmaster_badge.json
|
|
90
|
-
:target: https://github.com/
|
|
91
|
-
.. |pre-commit.ci| image:: https://results.pre-commit.ci/badge/github/
|
|
92
|
-
:target: https://results.pre-commit.ci/latest/github/
|
|
90
|
+
:target: https://github.com/MTSWebServices/syncmaster/actions
|
|
91
|
+
.. |pre-commit.ci| image:: https://results.pre-commit.ci/badge/github/MTSWebServices/syncmaster/develop.svg
|
|
92
|
+
:target: https://results.pre-commit.ci/latest/github/MTSWebServices/syncmaster/develop
|
|
93
93
|
|
|
94
94
|
What is Data.SyncMaster?
|
|
95
95
|
------------------------
|
|
@@ -142,6 +142,7 @@ syncmaster/schemas/v1/transfers/transformations/__init__.py
|
|
|
142
142
|
syncmaster/schemas/v1/transfers/transformations/dataframe_columns_filter.py
|
|
143
143
|
syncmaster/schemas/v1/transfers/transformations/dataframe_rows_filter.py
|
|
144
144
|
syncmaster/schemas/v1/transfers/transformations/file_metadata_filter.py
|
|
145
|
+
syncmaster/schemas/v1/transfers/transformations/sql.py
|
|
145
146
|
syncmaster/server/__init__.py
|
|
146
147
|
syncmaster/server/__main__.py
|
|
147
148
|
syncmaster/server/handler.py
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
pydantic~=2.12.5
|
|
2
|
-
pydantic-settings
|
|
2
|
+
pydantic-settings<2.14,>=2.12
|
|
3
3
|
pydantic-settings-logging~=0.1.1
|
|
4
4
|
sqlalchemy~=2.0.44
|
|
5
5
|
sqlalchemy-utils~=0.42.0
|
|
@@ -19,14 +19,14 @@ asyncpg~=0.31
|
|
|
19
19
|
apscheduler~=3.11.1
|
|
20
20
|
|
|
21
21
|
[server]
|
|
22
|
-
fastapi~=0.
|
|
22
|
+
fastapi~=0.129
|
|
23
23
|
starlette-exporter~=0.23.0
|
|
24
24
|
python-multipart~=0.0.21
|
|
25
|
-
uvicorn~=0.
|
|
25
|
+
uvicorn~=0.41.0
|
|
26
26
|
alembic~=1.18.1
|
|
27
|
-
pyjwt~=2.
|
|
27
|
+
pyjwt~=2.11.0
|
|
28
28
|
asyncpg~=0.31
|
|
29
|
-
python-keycloak
|
|
29
|
+
python-keycloak<7.2.0,>=7.0.1
|
|
30
30
|
itsdangerous~=2.2.0
|
|
31
31
|
|
|
32
32
|
[worker]
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
[build-system]
|
|
2
|
-
requires = [ "setuptools>=41", "wheel", "setuptools-git-versioning
|
|
2
|
+
requires = [ "setuptools>=41", "wheel", "setuptools-git-versioning<4,>=3.0", ]
|
|
3
3
|
build-backend = "setuptools.build_meta"
|
|
4
4
|
|
|
5
5
|
[tool.setuptools-git-versioning]
|
|
@@ -34,7 +34,7 @@ keywords = ["Syncmaster", "REST", "API", "Worker", "Spark", "Transfer", "ETL"]
|
|
|
34
34
|
requires-python = ">=3.11"
|
|
35
35
|
dependencies = [
|
|
36
36
|
"pydantic~=2.12.5",
|
|
37
|
-
"pydantic-settings
|
|
37
|
+
"pydantic-settings>=2.12,<2.14",
|
|
38
38
|
"pydantic-settings-logging~=0.1.1",
|
|
39
39
|
"sqlalchemy~=2.0.44",
|
|
40
40
|
"sqlalchemy-utils~=0.42.0",
|
|
@@ -56,23 +56,23 @@ exclude = ["docs", "tests"]
|
|
|
56
56
|
"*" = ["py.typed", "*.yml", "*.ini", "VERSION"]
|
|
57
57
|
|
|
58
58
|
[project.urls] # Optional
|
|
59
|
-
"Homepage" = "https://github.com/
|
|
59
|
+
"Homepage" = "https://github.com/MTSWebServices/syncmaster"
|
|
60
60
|
"Documentation" = "https://syncmaster.readthedocs.io/"
|
|
61
|
-
"Source" = "https://github.com/
|
|
62
|
-
"CI/CD" = "https://github.com/
|
|
63
|
-
"Tracker" = "https://github.com/
|
|
61
|
+
"Source" = "https://github.com/MTSWebServices/syncmaster"
|
|
62
|
+
"CI/CD" = "https://github.com/MTSWebServices/syncmaster/actions"
|
|
63
|
+
"Tracker" = "https://github.com/MTSWebServices/syncmaster/issues"
|
|
64
64
|
|
|
65
65
|
|
|
66
66
|
[project.optional-dependencies]
|
|
67
67
|
server = [
|
|
68
|
-
"fastapi~=0.
|
|
68
|
+
"fastapi~=0.129",
|
|
69
69
|
"starlette-exporter~=0.23.0",
|
|
70
70
|
"python-multipart~=0.0.21",
|
|
71
|
-
"uvicorn~=0.
|
|
71
|
+
"uvicorn~=0.41.0",
|
|
72
72
|
"alembic~=1.18.1",
|
|
73
|
-
"pyjwt~=2.
|
|
73
|
+
"pyjwt~=2.11.0",
|
|
74
74
|
"asyncpg~=0.31",
|
|
75
|
-
"python-keycloak
|
|
75
|
+
"python-keycloak>=7.0.1,<7.2.0",
|
|
76
76
|
"itsdangerous~=2.2.0",
|
|
77
77
|
]
|
|
78
78
|
scheduler = [
|
|
@@ -96,7 +96,7 @@ test = [
|
|
|
96
96
|
"pytest-asyncio>=0.26.0,<1.0",
|
|
97
97
|
"pytest-randomly~=4.0.1",
|
|
98
98
|
"pytest-rerunfailures~=16.1",
|
|
99
|
-
"pytest-deadfixtures
|
|
99
|
+
"pytest-deadfixtures>=3.0,<3.2",
|
|
100
100
|
"pytest-mock~=3.15.1",
|
|
101
101
|
"pytest-lazy-fixtures~=1.4.0",
|
|
102
102
|
"faker~=40.1",
|
|
@@ -106,23 +106,24 @@ test = [
|
|
|
106
106
|
"dirty-equals~=0.11.0",
|
|
107
107
|
]
|
|
108
108
|
dev = [
|
|
109
|
+
"ruff~=0.15.0",
|
|
109
110
|
"mypy~=1.19.1",
|
|
110
|
-
"prek~=0.2
|
|
111
|
+
"prek~=0.3.2",
|
|
111
112
|
"sqlalchemy[mypy]~=2.0.44",
|
|
112
113
|
"types-jwcrypto~=1.5.0",
|
|
113
114
|
]
|
|
114
115
|
docs = [
|
|
115
|
-
"setuptools-git-versioning
|
|
116
|
+
"setuptools-git-versioning>=2.1,<3.1",
|
|
116
117
|
"autodoc-pydantic~=2.2.0",
|
|
117
118
|
"numpydoc~=1.10.0",
|
|
118
|
-
"sphinx
|
|
119
|
+
"sphinx>=8.2.3,<9.1.0",
|
|
119
120
|
"furo~=2025.12.19",
|
|
120
121
|
"sphinx-copybutton~=0.5.2",
|
|
121
122
|
"sphinxcontrib-towncrier~=0.5.0a0",
|
|
122
123
|
"towncrier~=25.8.0",
|
|
123
124
|
"sphinx-issues~=5.0.1",
|
|
124
|
-
"sphinx-design
|
|
125
|
-
"sphinx-favicon
|
|
125
|
+
"sphinx-design>=0.6.1,<0.8.0",
|
|
126
|
+
"sphinx-favicon>=1.0.1,<1.2.0",
|
|
126
127
|
"sphinx-argparse~=0.5.2",
|
|
127
128
|
# https://github.com/mgeier/sphinx-last-updated-by-git/pull/77
|
|
128
129
|
"sphinx-last-updated-by-git~=0.3.8",
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0.3.2
|
|
@@ -20,8 +20,7 @@ depends_on = None
|
|
|
20
20
|
|
|
21
21
|
def upgrade():
|
|
22
22
|
sql_expression = (
|
|
23
|
-
"to_tsvector('english'::regconfig, "
|
|
24
|
-
"name || ' ' || "
|
|
23
|
+
"to_tsvector('english'::regconfig, name || ' ' || "
|
|
25
24
|
"COALESCE(json_extract_path_text(source_params, 'table_name'), '') || ' ' || "
|
|
26
25
|
"COALESCE(json_extract_path_text(target_params, 'table_name'), '') || ' ' || "
|
|
27
26
|
"COALESCE(json_extract_path_text(source_params, 'directory_path'), '') || ' ' || "
|
|
@@ -30,8 +29,7 @@ def upgrade():
|
|
|
30
29
|
"COALESCE(translate(json_extract_path_text(source_params, 'table_name'), './', ' '), '') || ' ' || "
|
|
31
30
|
"COALESCE(translate(json_extract_path_text(target_params, 'table_name'), './', ' '), '') || ' ' || "
|
|
32
31
|
"COALESCE(translate(json_extract_path_text(source_params, 'directory_path'), './', ' '), '') || ' ' || "
|
|
33
|
-
"COALESCE(translate(json_extract_path_text(target_params, 'directory_path'), './', ' '), '')"
|
|
34
|
-
")"
|
|
32
|
+
"COALESCE(translate(json_extract_path_text(target_params, 'directory_path'), './', ' '), ''))"
|
|
35
33
|
)
|
|
36
34
|
op.create_table(
|
|
37
35
|
"transfer",
|
|
@@ -201,8 +201,7 @@ def downgrade() -> None:
|
|
|
201
201
|
"search_vector",
|
|
202
202
|
postgresql.TSVECTOR(),
|
|
203
203
|
sa.Computed(
|
|
204
|
-
"to_tsvector('english'::regconfig, "
|
|
205
|
-
"name || ' ') || "
|
|
204
|
+
"to_tsvector('english'::regconfig, name || ' ' || "
|
|
206
205
|
"COALESCE(json_extract_path_text(source_params, VARIADIC ARRAY['table_name']), '') || ' ' || "
|
|
207
206
|
"COALESCE(json_extract_path_text(target_params, VARIADIC ARRAY['table_name']), '') || ' ' || "
|
|
208
207
|
"COALESCE(json_extract_path_text(source_params, VARIADIC ARRAY['directory_path']), '') || ' ' || "
|
|
@@ -8,7 +8,7 @@ from syncmaster.schemas.v1.auth.mixins import SecretDumpMixin
|
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
class ReadBasicAuthSchema(SecretDumpMixin):
|
|
11
|
-
type: Literal["basic"] = Field(description="Auth type")
|
|
11
|
+
type: Literal["basic"] = Field(default="basic", description="Auth type")
|
|
12
12
|
user: str
|
|
13
13
|
|
|
14
14
|
|
|
@@ -8,7 +8,7 @@ from syncmaster.schemas.v1.auth.mixins import SecretDumpMixin
|
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
class ReadIcebergRESTCatalogBearerAuthSchema(SecretDumpMixin):
|
|
11
|
-
type: Literal["iceberg_rest_bearer"] = Field(description="Auth type")
|
|
11
|
+
type: Literal["iceberg_rest_bearer"] = Field(default="iceberg_rest_bearer", description="Auth type")
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
class CreateIcebergRESTCatalogBearerAuthSchema(ReadIcebergRESTCatalogBearerAuthSchema):
|
|
@@ -9,7 +9,10 @@ from syncmaster.schemas.v1.types import URL
|
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
class ReadIcebergRESTCatalogOAuth2ClientCredentialsAuthSchema(SecretDumpMixin):
|
|
12
|
-
type: Literal["iceberg_rest_oauth2_client_credentials"] = Field(
|
|
12
|
+
type: Literal["iceberg_rest_oauth2_client_credentials"] = Field(
|
|
13
|
+
default="iceberg_rest_oauth2_client_credentials",
|
|
14
|
+
description="Auth type",
|
|
15
|
+
)
|
|
13
16
|
rest_catalog_oauth2_client_id: str
|
|
14
17
|
rest_catalog_oauth2_scopes: list[str] = Field(default_factory=list)
|
|
15
18
|
rest_catalog_oauth2_resource: str | None = None
|
|
@@ -8,7 +8,10 @@ from syncmaster.schemas.v1.auth.mixins import SecretDumpMixin
|
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
class ReadIcebergRESTCatalogBearerS3BasicAuthSchema(SecretDumpMixin):
|
|
11
|
-
type: Literal["iceberg_rest_bearer_s3_basic"] = Field(
|
|
11
|
+
type: Literal["iceberg_rest_bearer_s3_basic"] = Field(
|
|
12
|
+
default="iceberg_rest_bearer_s3_basic",
|
|
13
|
+
description="Auth type",
|
|
14
|
+
)
|
|
12
15
|
s3_access_key: str
|
|
13
16
|
|
|
14
17
|
|
|
@@ -8,7 +8,10 @@ from syncmaster.schemas.v1.auth.mixins import SecretDumpMixin
|
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
class ReadIcebergRESTCatalogOAuth2ClientCredentialsS3BasicAuthSchema(SecretDumpMixin):
|
|
11
|
-
type: Literal["iceberg_rest_oauth2_client_credentials_s3_basic"] = Field(
|
|
11
|
+
type: Literal["iceberg_rest_oauth2_client_credentials_s3_basic"] = Field(
|
|
12
|
+
default="iceberg_rest_oauth2_client_credentials_s3_basic",
|
|
13
|
+
description="Auth type",
|
|
14
|
+
)
|
|
12
15
|
rest_catalog_oauth2_client_id: str
|
|
13
16
|
rest_catalog_oauth2_scopes: list[str] = Field(default_factory=list)
|
|
14
17
|
rest_catalog_oauth2_resource: str | None = None
|
|
@@ -8,7 +8,7 @@ from syncmaster.schemas.v1.auth.mixins import SecretDumpMixin
|
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
class ReadSambaAuthSchema(SecretDumpMixin):
|
|
11
|
-
type: Literal["samba"] = Field(description="Auth type")
|
|
11
|
+
type: Literal["samba"] = Field(default="samba", description="Auth type")
|
|
12
12
|
user: str
|
|
13
13
|
auth_type: Literal["NTLMv1", "NTLMv2"] = "NTLMv2"
|
|
14
14
|
|
{data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/connections/iceberg.py
RENAMED
|
@@ -24,7 +24,7 @@ from syncmaster.schemas.v1.types import URL
|
|
|
24
24
|
|
|
25
25
|
|
|
26
26
|
class IcebergRESTCatalogS3DirectConnectionDataSchema(BaseModel):
|
|
27
|
-
type: Literal["iceberg_rest_s3_direct"]
|
|
27
|
+
type: Literal["iceberg_rest_s3_direct"] = "iceberg_rest_s3_direct"
|
|
28
28
|
rest_catalog_url: URL
|
|
29
29
|
s3_warehouse_path: str
|
|
30
30
|
s3_host: str
|
|
@@ -37,7 +37,7 @@ class IcebergRESTCatalogS3DirectConnectionDataSchema(BaseModel):
|
|
|
37
37
|
|
|
38
38
|
|
|
39
39
|
class IcebergRESTCatalogS3DelegatedConnectionDataSchema(BaseModel):
|
|
40
|
-
type: Literal["iceberg_rest_s3_delegated"]
|
|
40
|
+
type: Literal["iceberg_rest_s3_delegated"] = "iceberg_rest_s3_delegated"
|
|
41
41
|
rest_catalog_url: URL
|
|
42
42
|
s3_warehouse_name: str | None = None
|
|
43
43
|
s3_access_delegation: Literal["vended-credentials", "remote-signing"] = "vended-credentials"
|
|
@@ -20,7 +20,11 @@ from syncmaster.schemas.v1.connection_types import (
|
|
|
20
20
|
|
|
21
21
|
class DBTransfer(BaseModel):
|
|
22
22
|
TABLE_NAME_PATTERN: ClassVar[str] = r"^[\w\d]+\.[\w\d]+$"
|
|
23
|
-
table_name: str = Field(
|
|
23
|
+
table_name: str = Field(
|
|
24
|
+
description="Table name",
|
|
25
|
+
json_schema_extra={"pattern": TABLE_NAME_PATTERN},
|
|
26
|
+
examples=["myschema.mytable"],
|
|
27
|
+
)
|
|
24
28
|
|
|
25
29
|
# make error message more user friendly
|
|
26
30
|
@field_validator("table_name", mode="before")
|
|
@@ -60,7 +64,11 @@ class IcebergTransferSourceOrTarget(DBTransfer):
|
|
|
60
64
|
type: ICEBERG_TYPE
|
|
61
65
|
|
|
62
66
|
TABLE_NAME_PATTERN: ClassVar[str] = r"^[\w\d]+(\.[\w\d]+)+$"
|
|
63
|
-
table_name: str = Field(
|
|
67
|
+
table_name: str = Field(
|
|
68
|
+
description="Table name",
|
|
69
|
+
json_schema_extra={"pattern": TABLE_NAME_PATTERN},
|
|
70
|
+
examples=["myschema.mytable"],
|
|
71
|
+
)
|
|
64
72
|
|
|
65
73
|
# make error message more user friendly
|
|
66
74
|
@field_validator("table_name", mode="before")
|
{data_syncmaster-0.3.1 → data_syncmaster-0.3.2}/syncmaster/schemas/v1/transfers/file_format.py
RENAMED
|
@@ -17,21 +17,21 @@ from syncmaster.schemas.v1.file_formats import (
|
|
|
17
17
|
)
|
|
18
18
|
|
|
19
19
|
|
|
20
|
-
class ORCCompression(str, Enum):
|
|
20
|
+
class ORCCompression(str, Enum): # noqa: UP042
|
|
21
21
|
NONE = "none"
|
|
22
22
|
SNAPPY = "snappy"
|
|
23
23
|
ZLIB = "zlib"
|
|
24
24
|
LZ4 = "lz4"
|
|
25
25
|
|
|
26
26
|
|
|
27
|
-
class ParquetCompression(str, Enum):
|
|
27
|
+
class ParquetCompression(str, Enum): # noqa: UP042
|
|
28
28
|
NONE = "none"
|
|
29
29
|
SNAPPY = "snappy"
|
|
30
30
|
GZIP = "gzip"
|
|
31
31
|
LZ4 = "lz4"
|
|
32
32
|
|
|
33
33
|
|
|
34
|
-
class JSONCompression(str, Enum):
|
|
34
|
+
class JSONCompression(str, Enum): # noqa: UP042
|
|
35
35
|
NONE = "none"
|
|
36
36
|
BZIP2 = "bzip2"
|
|
37
37
|
GZIP = "gzip"
|
|
@@ -40,7 +40,7 @@ class JSONCompression(str, Enum):
|
|
|
40
40
|
DEFLATE = "deflate"
|
|
41
41
|
|
|
42
42
|
|
|
43
|
-
class CSVCompression(str, Enum):
|
|
43
|
+
class CSVCompression(str, Enum): # noqa: UP042
|
|
44
44
|
NONE = "none"
|
|
45
45
|
BZIP2 = "bzip2"
|
|
46
46
|
GZIP = "gzip"
|
|
@@ -49,7 +49,7 @@ class CSVCompression(str, Enum):
|
|
|
49
49
|
DEFLATE = "deflate"
|
|
50
50
|
|
|
51
51
|
|
|
52
|
-
class XMLCompression(str, Enum):
|
|
52
|
+
class XMLCompression(str, Enum): # noqa: UP042
|
|
53
53
|
NONE = "none"
|
|
54
54
|
BZIP2 = "bzip2"
|
|
55
55
|
GZIP = "gzip"
|
|
@@ -58,7 +58,7 @@ class XMLCompression(str, Enum):
|
|
|
58
58
|
|
|
59
59
|
|
|
60
60
|
class CSV(BaseModel):
|
|
61
|
-
type: CSV_FORMAT
|
|
61
|
+
type: CSV_FORMAT = "csv"
|
|
62
62
|
delimiter: str = ","
|
|
63
63
|
encoding: str = "utf-8"
|
|
64
64
|
quote: str = '"'
|
|
@@ -69,37 +69,37 @@ class CSV(BaseModel):
|
|
|
69
69
|
|
|
70
70
|
|
|
71
71
|
class JSONLine(BaseModel):
|
|
72
|
-
type: JSONLINE_FORMAT
|
|
72
|
+
type: JSONLINE_FORMAT = "jsonline"
|
|
73
73
|
encoding: str = "utf-8"
|
|
74
74
|
line_sep: str = "\n"
|
|
75
75
|
compression: JSONCompression = JSONCompression.GZIP
|
|
76
76
|
|
|
77
77
|
|
|
78
78
|
class JSON(BaseModel):
|
|
79
|
-
type: JSON_FORMAT
|
|
79
|
+
type: JSON_FORMAT = "json"
|
|
80
80
|
encoding: str = "utf-8"
|
|
81
81
|
line_sep: str = "\n"
|
|
82
82
|
compression: JSONCompression = JSONCompression.GZIP
|
|
83
83
|
|
|
84
84
|
|
|
85
85
|
class Excel(BaseModel):
|
|
86
|
-
type: EXCEL_FORMAT
|
|
86
|
+
type: EXCEL_FORMAT = "excel"
|
|
87
87
|
include_header: bool = False
|
|
88
88
|
start_cell: str | None = None
|
|
89
89
|
|
|
90
90
|
|
|
91
91
|
class XML(BaseModel):
|
|
92
|
-
type: XML_FORMAT
|
|
92
|
+
type: XML_FORMAT = "xml"
|
|
93
93
|
root_tag: str
|
|
94
94
|
row_tag: str
|
|
95
95
|
compression: XMLCompression = XMLCompression.GZIP
|
|
96
96
|
|
|
97
97
|
|
|
98
98
|
class ORC(BaseModel):
|
|
99
|
-
type: ORC_FORMAT
|
|
99
|
+
type: ORC_FORMAT = "orc"
|
|
100
100
|
compression: ORCCompression = ORCCompression.ZLIB
|
|
101
101
|
|
|
102
102
|
|
|
103
103
|
class Parquet(BaseModel):
|
|
104
|
-
type: PARQUET_FORMAT
|
|
104
|
+
type: PARQUET_FORMAT = "parquet"
|
|
105
105
|
compression: ParquetCompression = ParquetCompression.SNAPPY
|
|
@@ -14,9 +14,12 @@ from syncmaster.schemas.v1.transfers.transformations.dataframe_rows_filter impor
|
|
|
14
14
|
from syncmaster.schemas.v1.transfers.transformations.file_metadata_filter import (
|
|
15
15
|
FileMetadataFilter,
|
|
16
16
|
)
|
|
17
|
+
from syncmaster.schemas.v1.transfers.transformations.sql import (
|
|
18
|
+
Sql,
|
|
19
|
+
)
|
|
17
20
|
|
|
18
21
|
TransformationSchema = Annotated[
|
|
19
|
-
DataframeRowsFilter | DataframeColumnsFilter | FileMetadataFilter,
|
|
22
|
+
DataframeRowsFilter | DataframeColumnsFilter | FileMetadataFilter | Sql,
|
|
20
23
|
Field(discriminator="type"),
|
|
21
24
|
]
|
|
22
25
|
|
|
@@ -10,22 +10,22 @@ class BaseColumnsFilter(BaseModel):
|
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
class IncludeFilter(BaseColumnsFilter):
|
|
13
|
-
type: Literal["include"]
|
|
13
|
+
type: Literal["include"] = "include"
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
class RenameFilter(BaseColumnsFilter):
|
|
17
|
-
type: Literal["rename"]
|
|
18
|
-
to: str
|
|
17
|
+
type: Literal["rename"] = "rename"
|
|
18
|
+
to: str = Field(examples=["new_column_name"])
|
|
19
19
|
|
|
20
20
|
|
|
21
21
|
class CastFilter(BaseColumnsFilter):
|
|
22
|
-
type: Literal["cast"]
|
|
23
|
-
as_type: str
|
|
22
|
+
type: Literal["cast"] = "cast"
|
|
23
|
+
as_type: str = Field(examples=["int"])
|
|
24
24
|
|
|
25
25
|
|
|
26
26
|
ColumnsFilter = IncludeFilter | RenameFilter | CastFilter
|
|
27
27
|
|
|
28
28
|
|
|
29
29
|
class DataframeColumnsFilter(BaseModel):
|
|
30
|
-
type: Literal["dataframe_columns_filter"]
|
|
30
|
+
type: Literal["dataframe_columns_filter"] = "dataframe_columns_filter"
|
|
31
31
|
filters: list[Annotated[ColumnsFilter, Field(discriminator="type")]] = Field(default_factory=list)
|