data-syncmaster 0.3.2__tar.gz → 0.3.3__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.
Files changed (237) hide show
  1. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/PKG-INFO +16 -15
  2. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/README.rst +1 -1
  3. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/data_syncmaster.egg-info/PKG-INFO +16 -15
  4. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/data_syncmaster.egg-info/SOURCES.txt +1 -0
  5. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/data_syncmaster.egg-info/requires.txt +14 -13
  6. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/pyproject.toml +30 -28
  7. data_syncmaster-0.3.3/syncmaster/VERSION +1 -0
  8. data_syncmaster-0.3.3/syncmaster/db/migrations/versions/2026-04-02_0013_add_celery_date_done_indexes.py +39 -0
  9. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/worker/handlers/db/clickhouse.py +53 -1
  10. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/worker/handlers/db/mysql.py +1 -0
  11. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/worker/ivy2.py +1 -1
  12. data_syncmaster-0.3.2/syncmaster/VERSION +0 -1
  13. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/LICENSE.txt +0 -0
  14. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/data_syncmaster.egg-info/dependency_links.txt +0 -0
  15. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/data_syncmaster.egg-info/top_level.txt +0 -0
  16. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/setup.cfg +0 -0
  17. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/__init__.py +0 -0
  18. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/db/__init__.py +0 -0
  19. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/db/factory.py +0 -0
  20. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/db/migrations/__init__.py +0 -0
  21. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/db/migrations/__main__.py +0 -0
  22. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/db/migrations/alembic.ini +0 -0
  23. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/db/migrations/env.py +0 -0
  24. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/db/migrations/versions/2023-11-23_0001_create_user_table.py +0 -0
  25. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/db/migrations/versions/2023-11-23_0002_create_group_table.py +0 -0
  26. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/db/migrations/versions/2023-11-23_0003_create_queue_table.py +0 -0
  27. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/db/migrations/versions/2023-11-23_0004_create_connection_table.py +0 -0
  28. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/db/migrations/versions/2023-11-23_0005_create_user_group_table.py +0 -0
  29. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/db/migrations/versions/2023-11-23_0006_create_auth_data_table.py +0 -0
  30. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/db/migrations/versions/2023-11-23_0007_create_transfer_table.py +0 -0
  31. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/db/migrations/versions/2023-11-23_0008_create_run_table.py +0 -0
  32. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/db/migrations/versions/2023-11-23_0009_create_celery_tables.py +0 -0
  33. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/db/migrations/versions/2024-10-07_0010_add_pg_trgm_extension.py +0 -0
  34. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/db/migrations/versions/2024-11-01_0011_create_apscheduler_table.py +0 -0
  35. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/db/migrations/versions/2025-08-10_0012_update_ts.py +0 -0
  36. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/db/migrations/versions/__init__.py +0 -0
  37. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/db/mixins/__init__.py +0 -0
  38. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/db/mixins/resource.py +0 -0
  39. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/db/mixins/timestamp.py +0 -0
  40. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/db/models/__init__.py +0 -0
  41. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/db/models/apscheduler_job.py +0 -0
  42. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/db/models/auth_data.py +0 -0
  43. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/db/models/base.py +0 -0
  44. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/db/models/connection.py +0 -0
  45. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/db/models/group.py +0 -0
  46. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/db/models/queue.py +0 -0
  47. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/db/models/run.py +0 -0
  48. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/db/models/transfer.py +0 -0
  49. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/db/models/user.py +0 -0
  50. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/db/repositories/__init__.py +0 -0
  51. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/db/repositories/base.py +0 -0
  52. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/db/repositories/connection.py +0 -0
  53. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/db/repositories/credentials_repository.py +0 -0
  54. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/db/repositories/group.py +0 -0
  55. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/db/repositories/queue.py +0 -0
  56. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/db/repositories/repository_with_owner.py +0 -0
  57. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/db/repositories/run.py +0 -0
  58. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/db/repositories/search.py +0 -0
  59. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/db/repositories/transfer.py +0 -0
  60. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/db/repositories/user.py +0 -0
  61. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/db/repositories/utils.py +0 -0
  62. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/db/utils.py +0 -0
  63. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/dto/__init__.py +0 -0
  64. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/dto/connections.py +0 -0
  65. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/dto/runs.py +0 -0
  66. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/dto/transfers.py +0 -0
  67. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/dto/transfers_resources.py +0 -0
  68. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/dto/transfers_strategy.py +0 -0
  69. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/errors/__init__.py +0 -0
  70. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/errors/base.py +0 -0
  71. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/errors/registration.py +0 -0
  72. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/errors/schemas/__init__.py +0 -0
  73. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/errors/schemas/bad_request.py +0 -0
  74. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/errors/schemas/invalid_request.py +0 -0
  75. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/errors/schemas/not_authorized.py +0 -0
  76. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/exceptions/__init__.py +0 -0
  77. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/exceptions/auth.py +0 -0
  78. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/exceptions/base.py +0 -0
  79. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/exceptions/connection.py +0 -0
  80. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/exceptions/credentials.py +0 -0
  81. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/exceptions/group.py +0 -0
  82. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/exceptions/queue.py +0 -0
  83. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/exceptions/redirect.py +0 -0
  84. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/exceptions/run.py +0 -0
  85. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/exceptions/transfer.py +0 -0
  86. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/exceptions/user.py +0 -0
  87. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/scheduler/__init__.py +0 -0
  88. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/scheduler/__main__.py +0 -0
  89. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/scheduler/celery.py +0 -0
  90. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/scheduler/settings/__init__.py +0 -0
  91. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/scheduler/transfer_fetcher.py +0 -0
  92. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/scheduler/transfer_job_manager.py +0 -0
  93. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/scheduler/utils.py +0 -0
  94. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/__init__.py +0 -0
  95. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/ping.py +0 -0
  96. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/__init__.py +0 -0
  97. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/auth/__init__.py +0 -0
  98. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/auth/basic.py +0 -0
  99. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/auth/iceberg_rest_s3_delegated/__init__.py +0 -0
  100. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/auth/iceberg_rest_s3_delegated/bearer.py +0 -0
  101. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/auth/iceberg_rest_s3_delegated/oauth2_client_credentials.py +0 -0
  102. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/auth/iceberg_rest_s3_direct/__init__.py +0 -0
  103. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/auth/iceberg_rest_s3_direct/bearer.py +0 -0
  104. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/auth/iceberg_rest_s3_direct/oauth2_client_credentials.py +0 -0
  105. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/auth/mixins.py +0 -0
  106. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/auth/s3.py +0 -0
  107. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/auth/samba.py +0 -0
  108. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/auth/token.py +0 -0
  109. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/connection_types.py +0 -0
  110. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/connections/__init__.py +0 -0
  111. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/connections/clickhouse.py +0 -0
  112. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/connections/connection_base.py +0 -0
  113. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/connections/ftp.py +0 -0
  114. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/connections/ftps.py +0 -0
  115. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/connections/hdfs.py +0 -0
  116. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/connections/hive.py +0 -0
  117. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/connections/iceberg.py +0 -0
  118. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/connections/mssql.py +0 -0
  119. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/connections/mysql.py +0 -0
  120. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/connections/oracle.py +0 -0
  121. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/connections/postgres.py +0 -0
  122. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/connections/s3.py +0 -0
  123. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/connections/samba.py +0 -0
  124. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/connections/sftp.py +0 -0
  125. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/connections/webdav.py +0 -0
  126. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/file_formats.py +0 -0
  127. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/groups.py +0 -0
  128. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/page.py +0 -0
  129. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/queue.py +0 -0
  130. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/transfers/__init__.py +0 -0
  131. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/transfers/db.py +0 -0
  132. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/transfers/file/__init__.py +0 -0
  133. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/transfers/file/base.py +0 -0
  134. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/transfers/file/ftp.py +0 -0
  135. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/transfers/file/ftps.py +0 -0
  136. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/transfers/file/hdfs.py +0 -0
  137. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/transfers/file/s3.py +0 -0
  138. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/transfers/file/samba.py +0 -0
  139. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/transfers/file/sftp.py +0 -0
  140. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/transfers/file/webdav.py +0 -0
  141. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/transfers/file_format.py +0 -0
  142. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/transfers/resources.py +0 -0
  143. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/transfers/run.py +0 -0
  144. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/transfers/strategy.py +0 -0
  145. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/transfers/transformations/__init__.py +0 -0
  146. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/transfers/transformations/dataframe_columns_filter.py +0 -0
  147. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/transfers/transformations/dataframe_rows_filter.py +0 -0
  148. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/transfers/transformations/file_metadata_filter.py +0 -0
  149. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/transfers/transformations/sql.py +0 -0
  150. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/transformation_types.py +0 -0
  151. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/types.py +0 -0
  152. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/schemas/v1/users.py +0 -0
  153. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/server/__init__.py +0 -0
  154. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/server/__main__.py +0 -0
  155. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/server/api/__init__.py +0 -0
  156. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/server/api/monitoring.py +0 -0
  157. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/server/api/router.py +0 -0
  158. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/server/api/v1/__init__.py +0 -0
  159. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/server/api/v1/auth.py +0 -0
  160. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/server/api/v1/connections.py +0 -0
  161. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/server/api/v1/groups.py +0 -0
  162. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/server/api/v1/queue.py +0 -0
  163. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/server/api/v1/router.py +0 -0
  164. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/server/api/v1/runs.py +0 -0
  165. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/server/api/v1/transfers.py +0 -0
  166. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/server/api/v1/users.py +0 -0
  167. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/server/dependencies/__init__.py +0 -0
  168. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/server/dependencies/get_access_token.py +0 -0
  169. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/server/dependencies/stub.py +0 -0
  170. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/server/handler.py +0 -0
  171. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/server/middlewares/__init__.py +0 -0
  172. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/server/middlewares/cors.py +0 -0
  173. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/server/middlewares/monitoring/__init__.py +0 -0
  174. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/server/middlewares/monitoring/metrics.py +0 -0
  175. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/server/middlewares/openapi.py +0 -0
  176. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/server/middlewares/request_id.py +0 -0
  177. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/server/middlewares/static_files.py +0 -0
  178. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/server/providers/__init__.py +0 -0
  179. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/server/providers/auth/__init__.py +0 -0
  180. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/server/providers/auth/base_provider.py +0 -0
  181. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/server/providers/auth/dummy_provider.py +0 -0
  182. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/server/providers/auth/keycloak_provider.py +0 -0
  183. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/server/providers/auth/oauth2_gateway_provider.py +0 -0
  184. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/server/scripts/export_openapi_schema.py +0 -0
  185. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/server/scripts/manage_superusers.py +0 -0
  186. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/server/services/__init__.py +0 -0
  187. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/server/services/get_user.py +0 -0
  188. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/server/services/unit_of_work.py +0 -0
  189. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/server/settings/__init__.py +0 -0
  190. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/server/settings/auth/__init__.py +0 -0
  191. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/server/settings/auth/dummy.py +0 -0
  192. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/server/settings/auth/jwt.py +0 -0
  193. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/server/settings/auth/keycloak.py +0 -0
  194. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/server/settings/auth/oauth2_gateway.py +0 -0
  195. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/server/settings/server/__init__.py +0 -0
  196. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/server/settings/server/cors.py +0 -0
  197. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/server/settings/server/monitoring.py +0 -0
  198. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/server/settings/server/openapi.py +0 -0
  199. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/server/settings/server/request_id.py +0 -0
  200. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/server/settings/server/static_files.py +0 -0
  201. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/server/utils/__init__.py +0 -0
  202. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/server/utils/jwt.py +0 -0
  203. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/server/utils/slug.py +0 -0
  204. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/settings/__init__.py +0 -0
  205. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/settings/base.py +0 -0
  206. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/settings/broker.py +0 -0
  207. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/settings/credentials.py +0 -0
  208. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/settings/database.py +0 -0
  209. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/settings/logging.py +0 -0
  210. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/worker/__init__.py +0 -0
  211. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/worker/base.py +0 -0
  212. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/worker/celery.py +0 -0
  213. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/worker/controller.py +0 -0
  214. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/worker/handlers/__init__.py +0 -0
  215. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/worker/handlers/base.py +0 -0
  216. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/worker/handlers/db/__init__.py +0 -0
  217. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/worker/handlers/db/base.py +0 -0
  218. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/worker/handlers/db/hive.py +0 -0
  219. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/worker/handlers/db/iceberg.py +0 -0
  220. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/worker/handlers/db/mssql.py +0 -0
  221. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/worker/handlers/db/oracle.py +0 -0
  222. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/worker/handlers/db/postgres.py +0 -0
  223. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/worker/handlers/file/__init__.py +0 -0
  224. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/worker/handlers/file/base.py +0 -0
  225. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/worker/handlers/file/ftp.py +0 -0
  226. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/worker/handlers/file/ftps.py +0 -0
  227. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/worker/handlers/file/hdfs.py +0 -0
  228. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/worker/handlers/file/local_df.py +0 -0
  229. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/worker/handlers/file/remote_df.py +0 -0
  230. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/worker/handlers/file/s3.py +0 -0
  231. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/worker/handlers/file/samba.py +0 -0
  232. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/worker/handlers/file/sftp.py +0 -0
  233. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/worker/handlers/file/webdav.py +0 -0
  234. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/worker/settings/__init__.py +0 -0
  235. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/worker/settings/hwm_store.py +0 -0
  236. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/worker/spark.py +0 -0
  237. {data_syncmaster-0.3.2 → data_syncmaster-0.3.3}/syncmaster/worker/transfer.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: data-syncmaster
3
- Version: 0.3.2
3
+ Version: 0.3.3
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
@@ -26,45 +26,46 @@ Classifier: Typing :: Typed
26
26
  Requires-Python: >=3.11
27
27
  Description-Content-Type: text/x-rst
28
28
  License-File: LICENSE.txt
29
- Requires-Dist: pydantic~=2.12.5
30
- Requires-Dist: pydantic-settings<2.14,>=2.12
29
+ Requires-Dist: pydantic~=2.13.4
30
+ Requires-Dist: pydantic-settings~=2.14.1
31
31
  Requires-Dist: pydantic-settings-logging~=0.1.1
32
- Requires-Dist: sqlalchemy~=2.0.44
32
+ Requires-Dist: sqlalchemy~=2.0.49
33
33
  Requires-Dist: sqlalchemy-utils~=0.42.0
34
34
  Requires-Dist: pyyaml~=6.0.3
35
35
  Requires-Dist: coloredlogs~=15.0.1
36
- Requires-Dist: python-json-logger~=4.0.0
36
+ Requires-Dist: python-json-logger~=4.1.0
37
37
  Requires-Dist: asgi-correlation-id~=4.3.4
38
38
  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.129; extra == "server"
42
+ Requires-Dist: fastapi<0.137.0,>=0.135.3; extra == "server"
43
+ Requires-Dist: starlette<1.0; extra == "server"
43
44
  Requires-Dist: starlette-exporter~=0.23.0; extra == "server"
44
- Requires-Dist: python-multipart~=0.0.21; extra == "server"
45
- Requires-Dist: uvicorn~=0.41.0; extra == "server"
46
- Requires-Dist: alembic~=1.18.1; extra == "server"
47
- Requires-Dist: pyjwt~=2.11.0; extra == "server"
48
- Requires-Dist: asyncpg~=0.31; extra == "server"
49
- Requires-Dist: python-keycloak<7.2.0,>=7.0.1; extra == "server"
45
+ Requires-Dist: python-multipart~=0.0.26; extra == "server"
46
+ Requires-Dist: uvicorn<0.48,>=0.44; extra == "server"
47
+ Requires-Dist: alembic~=1.18.4; extra == "server"
48
+ Requires-Dist: pyjwt~=2.12.1; extra == "server"
49
+ Requires-Dist: asyncpg~=0.31.0; extra == "server"
50
+ Requires-Dist: python-keycloak~=7.1.1; extra == "server"
50
51
  Requires-Dist: itsdangerous~=2.2.0; extra == "server"
51
52
  Provides-Extra: scheduler
52
53
  Requires-Dist: asyncpg~=0.31; extra == "scheduler"
53
54
  Requires-Dist: apscheduler~=3.11.1; extra == "scheduler"
54
55
  Provides-Extra: worker
55
- Requires-Dist: onetl[files]~=0.15.0; extra == "worker"
56
+ Requires-Dist: onetl[files]~=0.16.0; extra == "worker"
56
57
  Requires-Dist: pyspark<4.0.0; extra == "worker"
57
58
  Requires-Dist: horizon-hwm-store~=1.1.4; extra == "worker"
58
59
  Requires-Dist: jinja2~=3.1.6; extra == "worker"
59
60
  Provides-Extra: kerberos
60
- Requires-Dist: onetl[kerberos]~=0.15.0; extra == "kerberos"
61
+ Requires-Dist: onetl[kerberos]~=0.16.0; extra == "kerberos"
61
62
  Dynamic: license-file
62
63
 
63
64
  .. _readme:
64
65
 
65
66
  |Logo|
66
67
 
67
- .. |Logo| image:: https://raw.githubusercontent.com/MTSWebServices/syncmaster/b6622b1b139137070f2287e288a4105c1110c1e4/docs/_static/logo_wide.svg
68
+ .. |Logo| image:: https://raw.githubusercontent.com/MTSWebServices/syncmaster/0eb2ba2be6656f81ea9706523c3b7942df212640/docs/_static/logo_wide.svg
68
69
  :alt: Data.SyncMaster logo
69
70
  :target: https://github.com/MTSWebServices/data-syncmaster
70
71
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  |Logo|
4
4
 
5
- .. |Logo| image:: https://raw.githubusercontent.com/MTSWebServices/syncmaster/b6622b1b139137070f2287e288a4105c1110c1e4/docs/_static/logo_wide.svg
5
+ .. |Logo| image:: https://raw.githubusercontent.com/MTSWebServices/syncmaster/0eb2ba2be6656f81ea9706523c3b7942df212640/docs/_static/logo_wide.svg
6
6
  :alt: Data.SyncMaster logo
7
7
  :target: https://github.com/MTSWebServices/data-syncmaster
8
8
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: data-syncmaster
3
- Version: 0.3.2
3
+ Version: 0.3.3
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
@@ -26,45 +26,46 @@ Classifier: Typing :: Typed
26
26
  Requires-Python: >=3.11
27
27
  Description-Content-Type: text/x-rst
28
28
  License-File: LICENSE.txt
29
- Requires-Dist: pydantic~=2.12.5
30
- Requires-Dist: pydantic-settings<2.14,>=2.12
29
+ Requires-Dist: pydantic~=2.13.4
30
+ Requires-Dist: pydantic-settings~=2.14.1
31
31
  Requires-Dist: pydantic-settings-logging~=0.1.1
32
- Requires-Dist: sqlalchemy~=2.0.44
32
+ Requires-Dist: sqlalchemy~=2.0.49
33
33
  Requires-Dist: sqlalchemy-utils~=0.42.0
34
34
  Requires-Dist: pyyaml~=6.0.3
35
35
  Requires-Dist: coloredlogs~=15.0.1
36
- Requires-Dist: python-json-logger~=4.0.0
36
+ Requires-Dist: python-json-logger~=4.1.0
37
37
  Requires-Dist: asgi-correlation-id~=4.3.4
38
38
  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.129; extra == "server"
42
+ Requires-Dist: fastapi<0.137.0,>=0.135.3; extra == "server"
43
+ Requires-Dist: starlette<1.0; extra == "server"
43
44
  Requires-Dist: starlette-exporter~=0.23.0; extra == "server"
44
- Requires-Dist: python-multipart~=0.0.21; extra == "server"
45
- Requires-Dist: uvicorn~=0.41.0; extra == "server"
46
- Requires-Dist: alembic~=1.18.1; extra == "server"
47
- Requires-Dist: pyjwt~=2.11.0; extra == "server"
48
- Requires-Dist: asyncpg~=0.31; extra == "server"
49
- Requires-Dist: python-keycloak<7.2.0,>=7.0.1; extra == "server"
45
+ Requires-Dist: python-multipart~=0.0.26; extra == "server"
46
+ Requires-Dist: uvicorn<0.48,>=0.44; extra == "server"
47
+ Requires-Dist: alembic~=1.18.4; extra == "server"
48
+ Requires-Dist: pyjwt~=2.12.1; extra == "server"
49
+ Requires-Dist: asyncpg~=0.31.0; extra == "server"
50
+ Requires-Dist: python-keycloak~=7.1.1; extra == "server"
50
51
  Requires-Dist: itsdangerous~=2.2.0; extra == "server"
51
52
  Provides-Extra: scheduler
52
53
  Requires-Dist: asyncpg~=0.31; extra == "scheduler"
53
54
  Requires-Dist: apscheduler~=3.11.1; extra == "scheduler"
54
55
  Provides-Extra: worker
55
- Requires-Dist: onetl[files]~=0.15.0; extra == "worker"
56
+ Requires-Dist: onetl[files]~=0.16.0; extra == "worker"
56
57
  Requires-Dist: pyspark<4.0.0; extra == "worker"
57
58
  Requires-Dist: horizon-hwm-store~=1.1.4; extra == "worker"
58
59
  Requires-Dist: jinja2~=3.1.6; extra == "worker"
59
60
  Provides-Extra: kerberos
60
- Requires-Dist: onetl[kerberos]~=0.15.0; extra == "kerberos"
61
+ Requires-Dist: onetl[kerberos]~=0.16.0; extra == "kerberos"
61
62
  Dynamic: license-file
62
63
 
63
64
  .. _readme:
64
65
 
65
66
  |Logo|
66
67
 
67
- .. |Logo| image:: https://raw.githubusercontent.com/MTSWebServices/syncmaster/b6622b1b139137070f2287e288a4105c1110c1e4/docs/_static/logo_wide.svg
68
+ .. |Logo| image:: https://raw.githubusercontent.com/MTSWebServices/syncmaster/0eb2ba2be6656f81ea9706523c3b7942df212640/docs/_static/logo_wide.svg
68
69
  :alt: Data.SyncMaster logo
69
70
  :target: https://github.com/MTSWebServices/data-syncmaster
70
71
 
@@ -27,6 +27,7 @@ syncmaster/db/migrations/versions/2023-11-23_0009_create_celery_tables.py
27
27
  syncmaster/db/migrations/versions/2024-10-07_0010_add_pg_trgm_extension.py
28
28
  syncmaster/db/migrations/versions/2024-11-01_0011_create_apscheduler_table.py
29
29
  syncmaster/db/migrations/versions/2025-08-10_0012_update_ts.py
30
+ syncmaster/db/migrations/versions/2026-04-02_0013_add_celery_date_done_indexes.py
30
31
  syncmaster/db/migrations/versions/__init__.py
31
32
  syncmaster/db/mixins/__init__.py
32
33
  syncmaster/db/mixins/resource.py
@@ -1,36 +1,37 @@
1
- pydantic~=2.12.5
2
- pydantic-settings<2.14,>=2.12
1
+ pydantic~=2.13.4
2
+ pydantic-settings~=2.14.1
3
3
  pydantic-settings-logging~=0.1.1
4
- sqlalchemy~=2.0.44
4
+ sqlalchemy~=2.0.49
5
5
  sqlalchemy-utils~=0.42.0
6
6
  pyyaml~=6.0.3
7
7
  coloredlogs~=15.0.1
8
- python-json-logger~=4.0.0
8
+ python-json-logger~=4.1.0
9
9
  asgi-correlation-id~=4.3.4
10
10
  uuid6~=2025.0.1
11
11
  celery~=5.6.0
12
12
  psycopg2-binary~=2.9.11
13
13
 
14
14
  [kerberos]
15
- onetl[kerberos]~=0.15.0
15
+ onetl[kerberos]~=0.16.0
16
16
 
17
17
  [scheduler]
18
18
  asyncpg~=0.31
19
19
  apscheduler~=3.11.1
20
20
 
21
21
  [server]
22
- fastapi~=0.129
22
+ fastapi<0.137.0,>=0.135.3
23
+ starlette<1.0
23
24
  starlette-exporter~=0.23.0
24
- python-multipart~=0.0.21
25
- uvicorn~=0.41.0
26
- alembic~=1.18.1
27
- pyjwt~=2.11.0
28
- asyncpg~=0.31
29
- python-keycloak<7.2.0,>=7.0.1
25
+ python-multipart~=0.0.26
26
+ uvicorn<0.48,>=0.44
27
+ alembic~=1.18.4
28
+ pyjwt~=2.12.1
29
+ asyncpg~=0.31.0
30
+ python-keycloak~=7.1.1
30
31
  itsdangerous~=2.2.0
31
32
 
32
33
  [worker]
33
- onetl[files]~=0.15.0
34
+ onetl[files]~=0.16.0
34
35
  pyspark<4.0.0
35
36
  horizon-hwm-store~=1.1.4
36
37
  jinja2~=3.1.6
@@ -33,14 +33,14 @@ classifiers = [
33
33
  keywords = ["Syncmaster", "REST", "API", "Worker", "Spark", "Transfer", "ETL"]
34
34
  requires-python = ">=3.11"
35
35
  dependencies = [
36
- "pydantic~=2.12.5",
37
- "pydantic-settings>=2.12,<2.14",
36
+ "pydantic~=2.13.4",
37
+ "pydantic-settings~=2.14.1",
38
38
  "pydantic-settings-logging~=0.1.1",
39
- "sqlalchemy~=2.0.44",
39
+ "sqlalchemy~=2.0.49",
40
40
  "sqlalchemy-utils~=0.42.0",
41
41
  "pyyaml~=6.0.3",
42
42
  "coloredlogs~=15.0.1",
43
- "python-json-logger~=4.0.0",
43
+ "python-json-logger~=4.1.0",
44
44
  "asgi-correlation-id~=4.3.4",
45
45
  "uuid6~=2025.0.1",
46
46
  "celery~=5.6.0",
@@ -65,14 +65,16 @@ exclude = ["docs", "tests"]
65
65
 
66
66
  [project.optional-dependencies]
67
67
  server = [
68
- "fastapi~=0.129",
68
+ "fastapi>=0.135.3,<0.137.0",
69
+ # starlette 1.0.0 break cookies
70
+ "starlette<1.0",
69
71
  "starlette-exporter~=0.23.0",
70
- "python-multipart~=0.0.21",
71
- "uvicorn~=0.41.0",
72
- "alembic~=1.18.1",
73
- "pyjwt~=2.11.0",
74
- "asyncpg~=0.31",
75
- "python-keycloak>=7.0.1,<7.2.0",
72
+ "python-multipart~=0.0.26",
73
+ "uvicorn>=0.44,<0.48",
74
+ "alembic~=1.18.4",
75
+ "pyjwt~=2.12.1",
76
+ "asyncpg~=0.31.0",
77
+ "python-keycloak~=7.1.1",
76
78
  "itsdangerous~=2.2.0",
77
79
  ]
78
80
  scheduler = [
@@ -80,13 +82,13 @@ scheduler = [
80
82
  "apscheduler~=3.11.1",
81
83
  ]
82
84
  worker = [
83
- "onetl[files]~=0.15.0",
85
+ "onetl[files]~=0.16.0",
84
86
  "pyspark<4.0.0",
85
87
  "horizon-hwm-store~=1.1.4",
86
88
  "jinja2~=3.1.6",
87
89
  ]
88
90
  kerberos = [
89
- "onetl[kerberos]~=0.15.0",
91
+ "onetl[kerberos]~=0.16.0",
90
92
  ]
91
93
 
92
94
  [dependency-groups]
@@ -94,36 +96,36 @@ test = [
94
96
  "pytest~=8.4.2",
95
97
  "httpx~=0.28.1",
96
98
  "pytest-asyncio>=0.26.0,<1.0",
97
- "pytest-randomly~=4.0.1",
99
+ "pytest-randomly>=4.0.1,<4.2.0",
98
100
  "pytest-rerunfailures~=16.1",
99
- "pytest-deadfixtures>=3.0,<3.2",
101
+ "pytest-deadfixtures~=3.1.0",
100
102
  "pytest-mock~=3.15.1",
101
103
  "pytest-lazy-fixtures~=1.4.0",
102
- "faker~=40.1",
103
- "coverage~=7.13.0",
104
- "gevent~=25.9.1",
105
- "respx~=0.22.0",
104
+ "faker~=40.13",
105
+ "coverage~=7.14.0",
106
+ "gevent>=26.4,<26.6",
107
+ "respx~=0.23.1",
106
108
  "dirty-equals~=0.11.0",
107
109
  ]
108
110
  dev = [
109
- "ruff~=0.15.0",
110
- "mypy~=1.19.1",
111
- "prek~=0.3.2",
112
- "sqlalchemy[mypy]~=2.0.44",
111
+ "ruff~=0.15.12",
112
+ "mypy~=2.1.0",
113
+ "prek>=0.3.2,<0.5.0",
114
+ "sqlalchemy[mypy]~=2.0.49",
113
115
  "types-jwcrypto~=1.5.0",
114
116
  ]
115
117
  docs = [
116
- "setuptools-git-versioning>=2.1,<3.1",
118
+ "setuptools-git-versioning>=3.0.1,<3.2.0",
117
119
  "autodoc-pydantic~=2.2.0",
118
120
  "numpydoc~=1.10.0",
119
- "sphinx>=8.2.3,<9.1.0",
121
+ "sphinx~=9.0.4",
120
122
  "furo~=2025.12.19",
121
123
  "sphinx-copybutton~=0.5.2",
122
124
  "sphinxcontrib-towncrier~=0.5.0a0",
123
125
  "towncrier~=25.8.0",
124
- "sphinx-issues~=5.0.1",
125
- "sphinx-design>=0.6.1,<0.8.0",
126
- "sphinx-favicon>=1.0.1,<1.2.0",
126
+ "sphinx-issues~=6.0.0",
127
+ "sphinx-design~=0.7.0",
128
+ "sphinx-favicon~=1.1.0",
127
129
  "sphinx-argparse~=0.5.2",
128
130
  # https://github.com/mgeier/sphinx-last-updated-by-git/pull/77
129
131
  "sphinx-last-updated-by-git~=0.3.8",
@@ -0,0 +1 @@
1
+ 0.3.3
@@ -0,0 +1,39 @@
1
+ # SPDX-FileCopyrightText: 2025-present MTS PJSC
2
+ # SPDX-License-Identifier: Apache-2.0
3
+ """Add celery_*_date_done indexex
4
+
5
+ Revision ID: 0013
6
+ Revises: 0012
7
+ Create Date: 2026-04-02 11:06:44.293882
8
+
9
+ """
10
+
11
+ from alembic import op
12
+
13
+ # revision identifiers, used by Alembic.
14
+ revision = "0013"
15
+ down_revision = "0012"
16
+ branch_labels = None
17
+ depends_on = None
18
+
19
+
20
+ def upgrade() -> None:
21
+ op.create_index(
22
+ op.f("ix_celery_taskmeta_date_done"),
23
+ "celery_taskmeta",
24
+ ["date_done"],
25
+ unique=False,
26
+ if_not_exists=True,
27
+ )
28
+ op.create_index(
29
+ op.f("ix_celery_tasksetmeta_date_done"),
30
+ "celery_tasksetmeta",
31
+ ["date_done"],
32
+ unique=False,
33
+ if_not_exists=True,
34
+ )
35
+
36
+
37
+ def downgrade() -> None:
38
+ op.drop_index(op.f("ix_celery_tasksetmeta_date_done"), table_name="celery_tasksetmeta", if_exists=True)
39
+ op.drop_index(op.f("ix_celery_taskmeta_date_done"), table_name="celery_taskmeta", if_exists=True)
@@ -3,16 +3,36 @@
3
3
 
4
4
  from __future__ import annotations
5
5
 
6
+ from datetime import UTC, datetime
7
+ from decimal import Decimal
6
8
  from typing import TYPE_CHECKING, ClassVar
7
9
 
8
10
  from onetl.connection import Clickhouse
9
11
  from onetl.db import DBWriter
10
12
  from onetl.hooks import slot, support_hooks
13
+ from pyspark.sql import functions as F # noqa: N812
14
+ from pyspark.sql.types import (
15
+ ArrayType,
16
+ BooleanType,
17
+ ByteType,
18
+ DataType,
19
+ DateType,
20
+ DecimalType,
21
+ DoubleType,
22
+ FloatType,
23
+ IntegerType,
24
+ LongType,
25
+ MapType,
26
+ ShortType,
27
+ StringType,
28
+ TimestampNTZType,
29
+ TimestampType,
30
+ )
11
31
 
12
32
  from syncmaster.worker.handlers.db.base import DBHandler
13
33
 
14
34
  if TYPE_CHECKING:
15
- from pyspark.sql import SparkSession
35
+ from pyspark.sql import Column, SparkSession
16
36
  from pyspark.sql.dataframe import DataFrame
17
37
 
18
38
  from syncmaster.dto.connections import ClickhouseConnectionDTO
@@ -38,6 +58,7 @@ class ClickhouseHandler(DBHandler):
38
58
  host=self.connection_dto.host,
39
59
  port=self.connection_dto.port,
40
60
  user=self.connection_dto.user,
61
+ database=self.connection_dto.database_name,
41
62
  password=self.connection_dto.password,
42
63
  extra=self.connection_dto.additional_params,
43
64
  spark=spark,
@@ -54,6 +75,7 @@ class ClickhouseHandler(DBHandler):
54
75
  (col for col in normalized_df.columns if col.lower().endswith("id")),
55
76
  normalized_df.columns[0], # if there is no column with "id", take the first column
56
77
  )
78
+ normalized_df = self._normalize_column_to_non_nullable(normalized_df, sort_column)
57
79
  self.transfer_dto.options["createTableOptions"] = (
58
80
  f"ENGINE = MergeTree() ORDER BY {self._quote_field(sort_column)}"
59
81
  )
@@ -73,6 +95,36 @@ class ClickhouseHandler(DBHandler):
73
95
  df = df.withColumnRenamed(column_name, column_name.lower())
74
96
  return df
75
97
 
98
+ def _normalize_column_to_non_nullable(self, df: DataFrame, column: str) -> DataFrame:
99
+ """Rewrite ``column`` with ``coalesce`` so Spark marks it non-nullable.
100
+
101
+ TODO: remove this workaround if Spark infers ``nullable=false`` without a dummy literal:
102
+ https://issues.apache.org/jira/browse/SPARK-54302
103
+ """
104
+ field = df.schema[column]
105
+ if not field.nullable:
106
+ return df
107
+
108
+ field_type: DataType = field.dataType
109
+ sentinel: Column
110
+ if isinstance(field_type, (ByteType, ShortType, IntegerType, LongType, FloatType, DoubleType, BooleanType)):
111
+ sentinel = F.lit(0).cast(field_type)
112
+ elif isinstance(field_type, DecimalType):
113
+ sentinel = F.lit(Decimal(0)).cast(field_type)
114
+ elif isinstance(field_type, StringType):
115
+ sentinel = F.lit("")
116
+ elif isinstance(field_type, (DateType, TimestampType, TimestampNTZType)):
117
+ sentinel = F.lit(datetime(1970, 1, 1, 0, 0, 0, tzinfo=UTC)).cast(field_type)
118
+ elif isinstance(field_type, ArrayType):
119
+ sentinel = F.array().cast(field_type)
120
+ elif isinstance(field_type, MapType):
121
+ sentinel = F.map_from_arrays(F.array(), F.array()).cast(field_type)
122
+ else:
123
+ msg = f"Unsupported Spark type for non-null: {field_type!r} (column {column!r})"
124
+ raise TypeError(msg)
125
+
126
+ return df.withColumn(column, F.coalesce(F.col(column), sentinel))
127
+
76
128
  def _make_rows_filter_expression(self, filters: list[dict]) -> str | None:
77
129
  expressions = []
78
130
  for filter_ in filters:
@@ -35,6 +35,7 @@ class MySQLHandler(DBHandler):
35
35
  user=self.connection_dto.user,
36
36
  password=self.connection_dto.password,
37
37
  database=self.connection_dto.database_name,
38
+ extra=self.connection_dto.additional_params,
38
39
  spark=spark,
39
40
  ).check()
40
41
 
@@ -31,7 +31,7 @@ def get_packages(connection_types: set[str]) -> list[str]:
31
31
  if connection_types & {"oracle", "all"}:
32
32
  result.extend(Oracle.get_packages())
33
33
  if connection_types & {"clickhouse", "all"}:
34
- result.append("io.github.mtsongithub.doetl:spark-dialect-extension_2.12:0.0.2")
34
+ result.append("io.github.mtsongithub.doetl:spark-dialect-extension_2.12:0.0.4")
35
35
  result.extend(Clickhouse.get_packages())
36
36
  if connection_types & {"mssql", "all"}:
37
37
  result.extend(MSSQL.get_packages())
@@ -1 +0,0 @@
1
- 0.3.2