data-syncmaster 0.2.1__tar.gz → 0.2.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.
Files changed (222) hide show
  1. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/PKG-INFO +1 -1
  2. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/pyproject.toml +1 -1
  3. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/__init__.py +1 -1
  4. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/migrations/versions/2023-11-23_0002_create_group_table.py +1 -1
  5. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/migrations/versions/2023-11-23_0004_create_connection_table.py +1 -1
  6. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/models/connection.py +1 -1
  7. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/models/group.py +1 -1
  8. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/repositories/group.py +1 -2
  9. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/repositories/queue.py +2 -2
  10. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/exceptions/group.py +0 -4
  11. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/__init__.py +0 -2
  12. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/connections/clickhouse.py +1 -1
  13. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/connections/connection.py +1 -1
  14. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/connections/connection_base.py +3 -3
  15. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/connections/ftp.py +1 -1
  16. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/connections/ftps.py +1 -1
  17. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/connections/hdfs.py +1 -1
  18. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/connections/hive.py +1 -1
  19. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/connections/mssql.py +1 -1
  20. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/connections/mysql.py +1 -1
  21. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/connections/oracle.py +1 -1
  22. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/connections/postgres.py +1 -1
  23. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/connections/s3.py +1 -1
  24. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/connections/samba.py +1 -1
  25. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/connections/sftp.py +1 -1
  26. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/connections/webdav.py +1 -1
  27. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/groups.py +3 -3
  28. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/queue.py +18 -6
  29. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/transfers/__init__.py +11 -11
  30. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/transfers/file/base.py +2 -2
  31. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/transfers/transformations/dataframe_columns_filter.py +1 -1
  32. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/transfers/transformations/dataframe_rows_filter.py +1 -1
  33. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/transfers/transformations/file_metadata_filter.py +1 -1
  34. data_syncmaster-0.2.2/syncmaster/schemas/v1/types.py +7 -0
  35. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/users.py +1 -5
  36. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/api/v1/groups.py +2 -2
  37. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/api/v1/queue.py +1 -1
  38. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/handler.py +0 -8
  39. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/settings/auth/keycloak.py +5 -5
  40. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/settings/server/cors.py +21 -9
  41. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/handlers/file/hdfs.py +2 -0
  42. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/spark.py +15 -4
  43. data_syncmaster-0.2.1/syncmaster/schemas/v1/types.py +0 -5
  44. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/LICENSE.txt +0 -0
  45. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/README.rst +0 -0
  46. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/__init__.py +0 -0
  47. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/factory.py +0 -0
  48. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/migrations/README +0 -0
  49. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/migrations/__main__.py +0 -0
  50. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/migrations/alembic.ini +0 -0
  51. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/migrations/env.py +0 -0
  52. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/migrations/script.py.mako +0 -0
  53. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/migrations/versions/2023-11-23_0001_create_user_table.py +0 -0
  54. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/migrations/versions/2023-11-23_0003_create_queue_table.py +0 -0
  55. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/migrations/versions/2023-11-23_0005_create_user_group_table.py +0 -0
  56. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/migrations/versions/2023-11-23_0006_create_auth_data_table.py +0 -0
  57. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/migrations/versions/2023-11-23_0007_create_transfer_table.py +0 -0
  58. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/migrations/versions/2023-11-23_0008_create_run_table.py +0 -0
  59. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/migrations/versions/2023-11-23_0009_create_celery_tables.py +0 -0
  60. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/migrations/versions/2024-10-07_0010_add_pg_trgm_extension.py +0 -0
  61. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/migrations/versions/2024-11-01_0011_create_apscheduler_table.py +0 -0
  62. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/migrations/versions/__init__.py +0 -0
  63. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/mixins/__init__.py +0 -0
  64. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/mixins/resource.py +0 -0
  65. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/mixins/timestamp.py +0 -0
  66. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/models/__init__.py +0 -0
  67. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/models/apscheduler_job.py +0 -0
  68. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/models/auth_data.py +0 -0
  69. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/models/base.py +0 -0
  70. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/models/queue.py +0 -0
  71. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/models/run.py +0 -0
  72. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/models/transfer.py +0 -0
  73. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/models/user.py +0 -0
  74. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/repositories/__init__.py +0 -0
  75. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/repositories/base.py +0 -0
  76. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/repositories/connection.py +0 -0
  77. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/repositories/credentials_repository.py +0 -0
  78. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/repositories/repository_with_owner.py +0 -0
  79. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/repositories/run.py +0 -0
  80. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/repositories/transfer.py +0 -0
  81. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/repositories/user.py +0 -0
  82. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/repositories/utils.py +0 -0
  83. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/utils.py +0 -0
  84. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/dto/__init__.py +0 -0
  85. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/dto/connections.py +0 -0
  86. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/dto/runs.py +0 -0
  87. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/dto/transfers.py +0 -0
  88. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/dto/transfers_resources.py +0 -0
  89. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/dto/transfers_strategy.py +0 -0
  90. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/errors/__init__.py +0 -0
  91. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/errors/base.py +0 -0
  92. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/errors/registration.py +0 -0
  93. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/errors/schemas/__init__.py +0 -0
  94. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/errors/schemas/bad_request.py +0 -0
  95. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/errors/schemas/invalid_request.py +0 -0
  96. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/errors/schemas/not_authorized.py +0 -0
  97. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/exceptions/__init__.py +0 -0
  98. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/exceptions/auth.py +0 -0
  99. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/exceptions/base.py +0 -0
  100. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/exceptions/connection.py +0 -0
  101. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/exceptions/credentials.py +0 -0
  102. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/exceptions/queue.py +0 -0
  103. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/exceptions/redirect.py +0 -0
  104. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/exceptions/run.py +0 -0
  105. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/exceptions/transfer.py +0 -0
  106. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/exceptions/user.py +0 -0
  107. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/scheduler/__init__.py +0 -0
  108. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/scheduler/__main__.py +0 -0
  109. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/scheduler/celery.py +0 -0
  110. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/scheduler/settings/__init__.py +0 -0
  111. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/scheduler/transfer_fetcher.py +0 -0
  112. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/scheduler/transfer_job_manager.py +0 -0
  113. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/scheduler/utils.py +0 -0
  114. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/__init__.py +0 -0
  115. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/ping.py +0 -0
  116. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/auth/__init__.py +0 -0
  117. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/auth/basic.py +0 -0
  118. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/auth/s3.py +0 -0
  119. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/auth/samba.py +0 -0
  120. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/auth/token.py +0 -0
  121. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/connection_types.py +0 -0
  122. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/connections/__init__.py +0 -0
  123. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/file_formats.py +0 -0
  124. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/page.py +0 -0
  125. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/transfer_types.py +0 -0
  126. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/transfers/db.py +0 -0
  127. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/transfers/file/__init__.py +0 -0
  128. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/transfers/file/ftp.py +0 -0
  129. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/transfers/file/ftps.py +0 -0
  130. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/transfers/file/hdfs.py +0 -0
  131. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/transfers/file/s3.py +0 -0
  132. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/transfers/file/samba.py +0 -0
  133. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/transfers/file/sftp.py +0 -0
  134. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/transfers/file/webdav.py +0 -0
  135. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/transfers/file_format.py +0 -0
  136. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/transfers/resources.py +0 -0
  137. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/transfers/run.py +0 -0
  138. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/transfers/strategy.py +0 -0
  139. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/transfers/transformations/__init__.py +0 -0
  140. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/transformation_types.py +0 -0
  141. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/__init__.py +0 -0
  142. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/__main__.py +0 -0
  143. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/api/__init__.py +0 -0
  144. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/api/monitoring.py +0 -0
  145. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/api/router.py +0 -0
  146. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/api/v1/__init__.py +0 -0
  147. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/api/v1/auth.py +0 -0
  148. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/api/v1/connections.py +0 -0
  149. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/api/v1/router.py +0 -0
  150. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/api/v1/runs.py +0 -0
  151. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/api/v1/transfers.py +0 -0
  152. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/api/v1/users.py +0 -0
  153. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/dependencies/__init__.py +0 -0
  154. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/dependencies/get_access_token.py +0 -0
  155. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/dependencies/stub.py +0 -0
  156. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/middlewares/__init__.py +0 -0
  157. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/middlewares/cors.py +0 -0
  158. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/middlewares/monitoring/__init__.py +0 -0
  159. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/middlewares/monitoring/metrics.py +0 -0
  160. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/middlewares/openapi.py +0 -0
  161. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/middlewares/request_id.py +0 -0
  162. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/middlewares/session.py +0 -0
  163. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/middlewares/static_files.py +0 -0
  164. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/providers/__init__.py +0 -0
  165. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/providers/auth/__init__.py +0 -0
  166. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/providers/auth/base_provider.py +0 -0
  167. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/providers/auth/dummy_provider.py +0 -0
  168. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/providers/auth/keycloak_provider.py +0 -0
  169. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/scripts/export_openapi_schema.py +0 -0
  170. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/scripts/manage_superusers.py +0 -0
  171. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/services/__init__.py +0 -0
  172. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/services/get_user.py +0 -0
  173. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/services/unit_of_work.py +0 -0
  174. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/settings/__init__.py +0 -0
  175. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/settings/auth/__init__.py +0 -0
  176. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/settings/auth/dummy.py +0 -0
  177. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/settings/auth/jwt.py +0 -0
  178. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/settings/server/__init__.py +0 -0
  179. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/settings/server/monitoring.py +0 -0
  180. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/settings/server/openapi.py +0 -0
  181. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/settings/server/request_id.py +0 -0
  182. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/settings/server/session.py +0 -0
  183. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/settings/server/static_files.py +0 -0
  184. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/utils/__init__.py +0 -0
  185. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/utils/jwt.py +0 -0
  186. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/utils/slug.py +0 -0
  187. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/utils/state.py +0 -0
  188. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/settings/__init__.py +0 -0
  189. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/settings/broker.py +0 -0
  190. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/settings/credentials.py +0 -0
  191. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/settings/database.py +0 -0
  192. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/settings/log/__init__.py +0 -0
  193. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/settings/log/colored.yml +0 -0
  194. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/settings/log/json.yml +0 -0
  195. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/settings/log/plain.yml +0 -0
  196. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/__init__.py +0 -0
  197. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/base.py +0 -0
  198. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/celery.py +0 -0
  199. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/controller.py +0 -0
  200. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/handlers/__init__.py +0 -0
  201. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/handlers/base.py +0 -0
  202. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/handlers/db/__init__.py +0 -0
  203. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/handlers/db/base.py +0 -0
  204. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/handlers/db/clickhouse.py +0 -0
  205. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/handlers/db/hive.py +0 -0
  206. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/handlers/db/mssql.py +0 -0
  207. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/handlers/db/mysql.py +0 -0
  208. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/handlers/db/oracle.py +0 -0
  209. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/handlers/db/postgres.py +0 -0
  210. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/handlers/file/__init__.py +0 -0
  211. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/handlers/file/base.py +0 -0
  212. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/handlers/file/ftp.py +0 -0
  213. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/handlers/file/ftps.py +0 -0
  214. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/handlers/file/local_df.py +0 -0
  215. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/handlers/file/remote_df.py +0 -0
  216. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/handlers/file/s3.py +0 -0
  217. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/handlers/file/samba.py +0 -0
  218. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/handlers/file/sftp.py +0 -0
  219. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/handlers/file/webdav.py +0 -0
  220. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/settings/__init__.py +0 -0
  221. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/settings/hwm_store.py +0 -0
  222. {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/transfer.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: data-syncmaster
3
- Version: 0.2.1
3
+ Version: 0.2.2
4
4
  Summary: Syncmaster REST API + Worker
5
5
  License: Apache-2.0
6
6
  Keywords: Syncmaster,REST,API,Worker,Spark,Transfer,ETL
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
4
4
 
5
5
  [tool.poetry]
6
6
  name = "data-syncmaster"
7
- version = "0.2.1"
7
+ version = "0.2.2"
8
8
  license = "Apache-2.0"
9
9
  description = "Syncmaster REST API + Worker"
10
10
  authors = ["DataOps.ETL <onetools@mts.ru>"]
@@ -1,6 +1,6 @@
1
1
  # SPDX-FileCopyrightText: 2023-2024 MTS PJSC
2
2
  # SPDX-License-Identifier: Apache-2.0
3
3
 
4
- _raw_version = "0.2.1"
4
+ _raw_version = "0.2.2"
5
5
  # version always contain only release number like 0.0.1
6
6
  __version__ = ".".join(_raw_version.split(".")[:3]) # noqa: WPS410
@@ -22,7 +22,7 @@ def upgrade():
22
22
  op.create_table(
23
23
  "group",
24
24
  sa.Column("id", sa.BigInteger(), nullable=False),
25
- sa.Column("name", sa.String(length=256), nullable=False),
25
+ sa.Column("name", sa.String(length=128), nullable=False),
26
26
  sa.Column("description", sa.String(length=512), nullable=False),
27
27
  sa.Column("owner_id", sa.BigInteger(), nullable=False),
28
28
  sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=False),
@@ -30,7 +30,7 @@ def upgrade():
30
30
  "connection",
31
31
  sa.Column("id", sa.BigInteger(), nullable=False),
32
32
  sa.Column("group_id", sa.BigInteger(), nullable=False),
33
- sa.Column("type", sa.String(length=23), nullable=False),
33
+ sa.Column("type", sa.String(length=32), nullable=False),
34
34
  sa.Column("name", sa.String(length=128), nullable=False),
35
35
  sa.Column("description", sa.String(length=512), nullable=False),
36
36
  sa.Column("data", sa.JSON(), nullable=False),
@@ -32,7 +32,7 @@ class ConnectionType(StrEnum):
32
32
 
33
33
 
34
34
  class Connection(Base, ResourceMixin, TimestampMixin):
35
- type: Mapped[ConnectionType] = mapped_column(ChoiceType(ConnectionType, impl=String(23)), nullable=False)
35
+ type: Mapped[ConnectionType] = mapped_column(ChoiceType(ConnectionType, impl=String(32)), nullable=False)
36
36
  data: Mapped[dict[str, Any]] = mapped_column(JSON, nullable=False, default={})
37
37
 
38
38
  group: Mapped[Group] = relationship("Group")
@@ -71,7 +71,7 @@ class GroupMemberRole(enum.StrEnum):
71
71
 
72
72
  class Group(Base, TimestampMixin):
73
73
  id: Mapped[int] = mapped_column(BigInteger, primary_key=True)
74
- name: Mapped[str] = mapped_column(String(256), nullable=False, unique=True)
74
+ name: Mapped[str] = mapped_column(String(128), nullable=False, unique=True)
75
75
  description: Mapped[str] = mapped_column(String(512), nullable=False, default="")
76
76
  owner_id: Mapped[int] = mapped_column(ForeignKey("user.id", ondelete="CASCADE"), nullable=False, index=True)
77
77
 
@@ -15,7 +15,6 @@ from syncmaster.exceptions import EntityNotFoundError, SyncmasterError
15
15
  from syncmaster.exceptions.group import (
16
16
  AlreadyIsGroupMemberError,
17
17
  AlreadyIsNotGroupMemberError,
18
- GroupAdminNotFoundError,
19
18
  GroupAlreadyExistsError,
20
19
  GroupNotFoundError,
21
20
  )
@@ -364,7 +363,7 @@ class GroupRepository(Repository[Group]):
364
363
  constraint = err.__cause__.__cause__.constraint_name
365
364
 
366
365
  if constraint == "fk__group__owner_id__user":
367
- raise GroupAdminNotFoundError from err
366
+ raise UserNotFoundError from err
368
367
 
369
368
  if constraint == "uq__group__name":
370
369
  raise GroupAlreadyExistsError from err
@@ -73,10 +73,10 @@ class QueueRepository(RepositoryWithOwner[Queue]):
73
73
  queue_data: UpdateQueueSchema,
74
74
  ) -> Queue:
75
75
  try:
76
- queue = await self.read_by_id(queue_id=queue_id)
77
76
  return await self._update(
78
77
  Queue.id == queue_id,
79
- description=queue_data.description or queue.description,
78
+ name=queue_data.name,
79
+ description=queue_data.description,
80
80
  )
81
81
  except IntegrityError as e:
82
82
  self._raise_error(e)
@@ -7,10 +7,6 @@ class GroupNameAlreadyExistsError(SyncmasterError):
7
7
  pass
8
8
 
9
9
 
10
- class GroupAdminNotFoundError(SyncmasterError):
11
- pass
12
-
13
-
14
10
  class GroupAlreadyExistsError(SyncmasterError):
15
11
  pass
16
12
 
@@ -55,7 +55,6 @@ from syncmaster.schemas.v1.users import (
55
55
  FullUserSchema,
56
56
  ReadGroupMember,
57
57
  ReadUserSchema,
58
- UpdateUserSchema,
59
58
  UserPageSchema,
60
59
  UserPageSchemaAsGroupMember,
61
60
  )
@@ -100,7 +99,6 @@ __all__ = [
100
99
  "JSONLine",
101
100
  "Parquet",
102
101
  "ReadUserSchema",
103
- "UpdateUserSchema",
104
102
  "FullUserSchema",
105
103
  "ReadGroupMember",
106
104
  "UserPageSchema",
@@ -29,7 +29,7 @@ class ReadClickhouseConnectionDataSchema(BaseModel):
29
29
 
30
30
 
31
31
  class CreateClickhouseConnectionSchema(CreateConnectionBaseSchema):
32
- type: CLICKHOUSE_TYPE = Field(..., description="Connection type")
32
+ type: CLICKHOUSE_TYPE = Field(description="Connection type")
33
33
  data: CreateClickhouseConnectionDataSchema = Field(
34
34
  ...,
35
35
  alias="connection_data",
@@ -125,7 +125,7 @@ UpdateConnectionSchema = Annotated[
125
125
 
126
126
  class ConnectionCopySchema(BaseModel):
127
127
  new_group_id: int
128
- new_name: NameConstr | None = None # noqa: F722
128
+ new_name: NameConstr | None = None
129
129
  remove_source: bool = False
130
130
 
131
131
 
@@ -10,9 +10,9 @@ ReadConnectionAuthDataSchema = ReadBasicAuthSchema | ReadS3AuthSchema | ReadSamb
10
10
 
11
11
 
12
12
  class CreateConnectionBaseSchema(BaseModel):
13
- group_id: int = Field(..., description="Connection owner group id")
14
- name: NameConstr = Field(..., description="Connection name") # noqa: F722
15
- description: str = Field(..., description="Additional description")
13
+ group_id: int = Field(description="Connection owner group id")
14
+ name: NameConstr = Field(description="Connection name")
15
+ description: str = Field(description="Additional description")
16
16
 
17
17
  model_config = ConfigDict(populate_by_name=True)
18
18
 
@@ -26,7 +26,7 @@ class ReadFTPConnectionDataSchema(BaseModel):
26
26
 
27
27
 
28
28
  class CreateFTPConnectionSchema(CreateConnectionBaseSchema):
29
- type: FTP_TYPE = Field(..., description="Connection type")
29
+ type: FTP_TYPE = Field(description="Connection type")
30
30
  data: CreateFTPConnectionDataSchema = Field(
31
31
  ...,
32
32
  alias="connection_data",
@@ -26,7 +26,7 @@ class ReadFTPSConnectionDataSchema(BaseModel):
26
26
 
27
27
 
28
28
  class CreateFTPSConnectionSchema(CreateConnectionBaseSchema):
29
- type: FTPS_TYPE = Field(..., description="Connection type")
29
+ type: FTPS_TYPE = Field(description="Connection type")
30
30
  data: CreateFTPSConnectionDataSchema = Field(
31
31
  ...,
32
32
  alias="connection_data",
@@ -24,7 +24,7 @@ class ReadHDFSConnectionDataSchema(BaseModel):
24
24
 
25
25
 
26
26
  class CreateHDFSConnectionSchema(CreateConnectionBaseSchema):
27
- type: HDFS_TYPE = Field(..., description="Connection type")
27
+ type: HDFS_TYPE = Field(description="Connection type")
28
28
  data: CreateHDFSConnectionDataSchema = Field(
29
29
  ...,
30
30
  alias="connection_data",
@@ -24,7 +24,7 @@ class ReadHiveConnectionDataSchema(BaseModel):
24
24
 
25
25
 
26
26
  class CreateHiveConnectionSchema(CreateConnectionBaseSchema):
27
- type: HIVE_TYPE = Field(..., description="Connection type")
27
+ type: HIVE_TYPE = Field(description="Connection type")
28
28
  data: CreateHiveConnectionDataSchema = Field(
29
29
  ...,
30
30
  alias="connection_data",
@@ -29,7 +29,7 @@ class ReadMSSQLConnectionDataSchema(BaseModel):
29
29
 
30
30
 
31
31
  class CreateMSSQLConnectionSchema(CreateConnectionBaseSchema):
32
- type: MSSQL_TYPE = Field(..., description="Connection type")
32
+ type: MSSQL_TYPE = Field(description="Connection type")
33
33
  data: CreateMSSQLConnectionDataSchema = Field(
34
34
  ...,
35
35
  alias="connection_data",
@@ -29,7 +29,7 @@ class ReadMySQLConnectionDataSchema(BaseModel):
29
29
 
30
30
 
31
31
  class CreateMySQLConnectionSchema(CreateConnectionBaseSchema):
32
- type: MYSQL_TYPE = Field(..., description="Connection type")
32
+ type: MYSQL_TYPE = Field(description="Connection type")
33
33
  data: CreateMySQLConnectionDataSchema = Field(
34
34
  ...,
35
35
  alias="connection_data",
@@ -39,7 +39,7 @@ class ReadOracleConnectionDataSchema(BaseModel):
39
39
 
40
40
 
41
41
  class CreateOracleConnectionSchema(CreateConnectionBaseSchema):
42
- type: ORACLE_TYPE = Field(..., description="Connection type")
42
+ type: ORACLE_TYPE = Field(description="Connection type")
43
43
  data: CreateOracleConnectionDataSchema = Field(
44
44
  ...,
45
45
  alias="connection_data",
@@ -30,7 +30,7 @@ class ReadPostgresConnectionDataSchema(BaseModel):
30
30
 
31
31
 
32
32
  class CreatePostgresConnectionSchema(CreateConnectionBaseSchema):
33
- type: POSTGRES_TYPE = Field(..., description="Connection type")
33
+ type: POSTGRES_TYPE = Field(description="Connection type")
34
34
  data: CreatePostgresConnectionDataSchema = Field(
35
35
  ...,
36
36
  alias="connection_data",
@@ -46,7 +46,7 @@ class ReadS3ConnectionDataSchema(BaseModel):
46
46
 
47
47
 
48
48
  class CreateS3ConnectionSchema(CreateConnectionBaseSchema):
49
- type: S3_TYPE = Field(..., description="Connection type")
49
+ type: S3_TYPE = Field(description="Connection type")
50
50
  data: CreateS3ConnectionDataSchema = Field(
51
51
  ...,
52
52
  alias="connection_data",
@@ -33,7 +33,7 @@ class ReadSambaConnectionDataSchema(BaseModel):
33
33
 
34
34
 
35
35
  class CreateSambaConnectionSchema(CreateConnectionBaseSchema):
36
- type: SAMBA_TYPE = Field(..., description="Connection type")
36
+ type: SAMBA_TYPE = Field(description="Connection type")
37
37
  data: CreateSambaConnectionDataSchema = Field(
38
38
  ...,
39
39
  alias="connection_data",
@@ -26,7 +26,7 @@ class ReadSFTPConnectionDataSchema(BaseModel):
26
26
 
27
27
 
28
28
  class CreateSFTPConnectionSchema(CreateConnectionBaseSchema):
29
- type: SFTP_TYPE = Field(..., description="Connection type")
29
+ type: SFTP_TYPE = Field(description="Connection type")
30
30
  data: CreateSFTPConnectionDataSchema = Field(
31
31
  ...,
32
32
  alias="connection_data",
@@ -30,7 +30,7 @@ class ReadWebDAVConnectionDataSchema(BaseModel):
30
30
 
31
31
 
32
32
  class CreateWebDAVConnectionSchema(CreateConnectionBaseSchema):
33
- type: WEBDAV_TYPE = Field(..., description="Connection type")
33
+ type: WEBDAV_TYPE = Field(description="Connection type")
34
34
  data: CreateWebDAVConnectionDataSchema = Field(
35
35
  ...,
36
36
  alias="connection_data",
@@ -8,13 +8,13 @@ from syncmaster.schemas.v1.types import NameConstr
8
8
 
9
9
 
10
10
  class UpdateGroupSchema(BaseModel):
11
- name: NameConstr # noqa: F722
11
+ name: NameConstr
12
12
  description: str
13
13
  owner_id: int
14
14
 
15
15
 
16
16
  class CreateGroupSchema(BaseModel):
17
- name: NameConstr # noqa: F722
17
+ name: NameConstr
18
18
  description: str
19
19
 
20
20
 
@@ -40,7 +40,7 @@ class AddUserSchema(BaseModel):
40
40
 
41
41
  class ReadGroupSchema(BaseModel):
42
42
  id: int
43
- name: NameConstr # noqa: F722
43
+ name: str
44
44
  description: str
45
45
  owner_id: int
46
46
 
@@ -1,22 +1,33 @@
1
1
  # SPDX-FileCopyrightText: 2023-2024 MTS PJSC
2
2
  # SPDX-License-Identifier: Apache-2.0
3
- from pydantic import BaseModel, ConfigDict, Field, computed_field, constr
3
+ import re
4
+ from typing import Annotated
5
+
6
+ from pydantic import BaseModel, ConfigDict, Field, StringConstraints, computed_field
4
7
 
5
8
  from syncmaster.schemas.v1.page import PageSchema
6
9
 
10
+ ALLOWED_PATTERN = re.compile(r"^[ -~]+$")
11
+ RESTRICTED_PATTERN = re.compile(r"[^a-zA-Z0-9]+")
12
+
13
+ QueueName = Annotated[
14
+ str,
15
+ StringConstraints(min_length=3, max_length=128, pattern=ALLOWED_PATTERN), # noqa: WPS432
16
+ ]
17
+
7
18
 
8
19
  class CreateQueueSchema(BaseModel):
9
- name: constr(max_length=128, pattern=r"^[-_a-zA-Z0-9]+$") = Field( # noqa: F722, WPS432
10
- ...,
20
+ name: QueueName = Field(
11
21
  description="Queue name that allows letters, numbers, dashes, and underscores",
12
22
  )
13
- group_id: int = Field(..., description="Queue owner group id")
23
+ group_id: int = Field(description="Queue owner group id")
14
24
  description: str = Field(default="", description="Additional description")
15
25
 
16
26
  @computed_field
17
27
  @property
18
28
  def slug(self) -> str:
19
- return f"{self.group_id}-{self.name}"
29
+ short_name = RESTRICTED_PATTERN.sub("_", self.name.lower()).strip("_")
30
+ return f"{self.group_id}-{short_name}"
20
31
 
21
32
 
22
33
  class ReadQueueSchema(BaseModel):
@@ -34,4 +45,5 @@ class QueuePageSchema(PageSchema):
34
45
 
35
46
 
36
47
  class UpdateQueueSchema(BaseModel):
37
- description: str | None = None
48
+ name: QueueName
49
+ description: str = ""
@@ -142,9 +142,9 @@ TransformationSchema = DataframeRowsFilter | DataframeColumnsFilter | FileMetada
142
142
  class CopyTransferSchema(BaseModel):
143
143
  new_group_id: int
144
144
  new_queue_id: int
145
- new_source_connection_name: NameConstr | None = None # noqa: F722
146
- new_target_connection_name: NameConstr | None = None # noqa: F722
147
- new_name: NameConstr | None = None # noqa: F722
145
+ new_source_connection_name: NameConstr | None = None
146
+ new_target_connection_name: NameConstr | None = None
147
+ new_name: NameConstr | None = None
148
148
  remove_source: bool = False
149
149
 
150
150
 
@@ -176,14 +176,14 @@ class ReadTransferSchema(BaseModel):
176
176
 
177
177
 
178
178
  class CreateTransferSchema(BaseModel):
179
- group_id: int = Field(..., description="Transfer owner group id")
180
- source_connection_id: int = Field(..., description="id of the connection that will be the data source")
181
- target_connection_id: int = Field(..., description="id of the connection that will be the data receiver")
182
- name: NameConstr = Field(..., description="Transfer name") # noqa: F722
183
- description: str = Field(..., description="Additional description")
184
- is_scheduled: bool = Field(..., description="Is the transfer on schedule")
185
- queue_id: int = Field(..., description="id of the queue in which the transfer will be performed")
186
- schedule: str | None = Field(None, description="Execution schedule in cron format")
179
+ group_id: int = Field(description="Transfer owner group id")
180
+ source_connection_id: int = Field(description="id of the connection that will be the data source")
181
+ target_connection_id: int = Field(description="id of the connection that will be the data receiver")
182
+ name: NameConstr = Field(description="Transfer name")
183
+ description: str = Field(description="Additional description")
184
+ is_scheduled: bool = Field(description="Is the transfer on schedule")
185
+ queue_id: int = Field(description="id of the queue in which the transfer will be performed")
186
+ schedule: str | None = Field(default=None, description="Execution schedule in cron format")
187
187
  source_params: CreateTransferSchemaSource = Field(
188
188
  ...,
189
189
  discriminator="type",
@@ -23,7 +23,7 @@ from syncmaster.schemas.v1.transfers.file_format import (
23
23
  # classes are identical but may change in the future
24
24
  class ReadFileTransferSource(BaseModel):
25
25
  directory_path: str
26
- file_format: CSV | JSONLine | JSON | Excel | XML | ORC | Parquet = Field(..., discriminator="type")
26
+ file_format: CSV | JSONLine | JSON | Excel | XML | ORC | Parquet = Field(discriminator="type")
27
27
  options: dict[str, Any]
28
28
 
29
29
 
@@ -42,7 +42,7 @@ class ReadFileTransferTarget(BaseModel):
42
42
  # classes are identical but may change in the future
43
43
  class CreateFileTransferSource(BaseModel):
44
44
  directory_path: str
45
- file_format: CSV | JSONLine | JSON | Excel | XML | ORC | Parquet = Field(..., discriminator="type")
45
+ file_format: CSV | JSONLine | JSON | Excel | XML | ORC | Parquet = Field(discriminator="type")
46
46
  options: dict[str, Any] = Field(default_factory=dict)
47
47
 
48
48
  model_config = ConfigDict(arbitrary_types_allowed=True)
@@ -30,4 +30,4 @@ ColumnsFilter = IncludeFilter | RenameFilter | CastFilter
30
30
 
31
31
  class DataframeColumnsFilter(BaseModel):
32
32
  type: DATAFRAME_COLUMNS_FILTER
33
- filters: list[Annotated[ColumnsFilter, Field(..., discriminator="type")]] = Field(default_factory=list)
33
+ filters: list[Annotated[ColumnsFilter, Field(discriminator="type")]] = Field(default_factory=list)
@@ -93,4 +93,4 @@ RowsFilter = (
93
93
 
94
94
  class DataframeRowsFilter(BaseModel):
95
95
  type: DATAFRAME_ROWS_FILTER
96
- filters: list[Annotated[RowsFilter, Field(..., discriminator="type")]] = Field(default_factory=list)
96
+ filters: list[Annotated[RowsFilter, Field(discriminator="type")]] = Field(default_factory=list)
@@ -50,4 +50,4 @@ MetadataFilter = NameGlobFilter | NameRegexpFilter | FileSizeMinFilter | FileSiz
50
50
 
51
51
  class FileMetadataFilter(BaseModel):
52
52
  type: FILE_METADATA_FILTER
53
- filters: list[Annotated[MetadataFilter, Field(..., discriminator="type")]] = Field(default_factory=list)
53
+ filters: list[Annotated[MetadataFilter, Field(discriminator="type")]] = Field(default_factory=list)
@@ -0,0 +1,7 @@
1
+ # SPDX-FileCopyrightText: 2023-2024 MTS PJSC
2
+ # SPDX-License-Identifier: Apache-2.0
3
+ from typing import Annotated
4
+
5
+ from pydantic import StringConstraints
6
+
7
+ NameConstr = Annotated[str, StringConstraints(min_length=3, max_length=128)] # noqa: WPS432
@@ -1,16 +1,12 @@
1
1
  # SPDX-FileCopyrightText: 2023-2024 MTS PJSC
2
2
  # SPDX-License-Identifier: Apache-2.0
3
- from pydantic import BaseModel, ConfigDict, constr
3
+ from pydantic import BaseModel, ConfigDict
4
4
 
5
5
  from syncmaster.db.models import GroupMemberRole
6
6
  from syncmaster.db.utils import Pagination
7
7
  from syncmaster.schemas.v1.page import MetaPageSchema, PageSchema
8
8
 
9
9
 
10
- class UpdateUserSchema(BaseModel):
11
- username: constr(pattern=r"^[_a-z0-9]+$") # noqa: F722
12
-
13
-
14
10
  class ReadGroupMember(BaseModel):
15
11
  id: int
16
12
  username: str
@@ -92,7 +92,7 @@ async def read_group(
92
92
  )
93
93
 
94
94
 
95
- @router.patch("/groups/{group_id}")
95
+ @router.put("/groups/{group_id}")
96
96
  async def update_group( # noqa: WPS217
97
97
  group_id: int,
98
98
  group_data: UpdateGroupSchema,
@@ -173,7 +173,7 @@ async def read_group_users(
173
173
  return UserPageSchemaAsGroupMember.from_pagination(pagination=pagination)
174
174
 
175
175
 
176
- @router.patch("/groups/{group_id}/users/{user_id}")
176
+ @router.put("/groups/{group_id}/users/{user_id}")
177
177
  async def update_user_role_group(
178
178
  group_id: int,
179
179
  user_id: int,
@@ -94,7 +94,7 @@ async def create_queue(
94
94
  return ReadQueueSchema.model_validate(queue, from_attributes=True)
95
95
 
96
96
 
97
- @router.patch("/queues/{queue_id}", description="Updating queue information")
97
+ @router.put("/queues/{queue_id}", description="Updating queue information")
98
98
  async def update_queue(
99
99
  queue_id: int,
100
100
  queue_data: UpdateQueueSchema,
@@ -25,7 +25,6 @@ from syncmaster.exceptions.group import (
25
25
  AlreadyIsGroupMemberError,
26
26
  AlreadyIsGroupOwnerError,
27
27
  AlreadyIsNotGroupMemberError,
28
- GroupAdminNotFoundError,
29
28
  GroupAlreadyExistsError,
30
29
  GroupNotFoundError,
31
30
  )
@@ -165,13 +164,6 @@ async def syncmsater_exception_handler(request: Request, exc: SyncmasterError):
165
164
  content=content,
166
165
  )
167
166
 
168
- if isinstance(exc, GroupAdminNotFoundError):
169
- content.code = "not_found"
170
- content.message = "Admin not found"
171
- return exception_json_response(
172
- status=status.HTTP_404_NOT_FOUND,
173
- content=content,
174
- )
175
167
  if isinstance(exc, GroupAlreadyExistsError):
176
168
  content.code = "conflict"
177
169
  content.message = "Group name already taken"
@@ -5,11 +5,11 @@ from pydantic import BaseModel, Field, SecretStr
5
5
 
6
6
  class KeycloakSettings(BaseModel):
7
7
 
8
- server_url: str = Field(..., description="Keycloak server URL")
9
- client_id: str = Field(..., description="Keycloak client ID")
10
- realm_name: str = Field(..., description="Keycloak realm name")
11
- client_secret: SecretStr = Field(..., description="Keycloak client secret")
12
- redirect_uri: str = Field(..., description="Redirect URI")
8
+ server_url: str = Field(description="Keycloak server URL")
9
+ client_id: str = Field(description="Keycloak client ID")
10
+ realm_name: str = Field(description="Keycloak realm name")
11
+ client_secret: SecretStr = Field(description="Keycloak client secret")
12
+ redirect_uri: str = Field(description="Redirect URI")
13
13
  verify_ssl: bool = Field(True, description="Verify SSL certificates")
14
14
  scope: str = Field("openid", description="Keycloak scope")
15
15
 
@@ -2,7 +2,10 @@
2
2
  # SPDX-License-Identifier: Apache-2.0
3
3
 
4
4
 
5
- from pydantic import BaseModel, ConfigDict, Field
5
+ import json
6
+ from typing import Any
7
+
8
+ from pydantic import BaseModel, ConfigDict, Field, field_validator
6
9
 
7
10
 
8
11
  class CORSSettings(BaseModel):
@@ -23,20 +26,20 @@ class CORSSettings(BaseModel):
23
26
  .. code-block:: bash
24
27
 
25
28
  SYNCMASTER__SERVER__CORS__ENABLED=True
26
- SYNCMASTER__SERVER__CORS__ALLOW_ORIGINS=["*"]
27
- SYNCMASTER__SERVER__CORS__ALLOW_METHODS=["*"]
28
- SYNCMASTER__SERVER__CORS__ALLOW_HEADERS=["*"]
29
- SYNCMASTER__SERVER__CORS__EXPOSE_HEADERS=["X-Request-ID"]
29
+ SYNCMASTER__SERVER__CORS__ALLOW_ORIGINS="*"
30
+ SYNCMASTER__SERVER__CORS__ALLOW_METHODS="*"
31
+ SYNCMASTER__SERVER__CORS__ALLOW_HEADERS="*"
32
+ SYNCMASTER__SERVER__CORS__EXPOSE_HEADERS=X-Request-ID,Location,Access-Control-Allow-Credentials
30
33
 
31
34
  For production environment:
32
35
 
33
36
  .. code-block:: bash
34
37
 
35
38
  SYNCMASTER__SERVER__CORS__ENABLED=True
36
- SYNCMASTER__SERVER__CORS__ALLOW_ORIGINS=["production.example.com"]
37
- SYNCMASTER__SERVER__CORS__ALLOW_METHODS=["GET"]
38
- SYNCMASTER__SERVER__CORS__ALLOW_HEADERS=["X-Request-ID", "X-Request-With"]
39
- SYNCMASTER__SERVER__CORS__EXPOSE_HEADERS=["X-Request-ID"]
39
+ SYNCMASTER__SERVER__CORS__ALLOW_ORIGINS="production.example.com"
40
+ SYNCMASTER__SERVER__CORS__ALLOW_METHODS="GET"
41
+ SYNCMASTER__SERVER__CORS__ALLOW_HEADERS="X-Request-ID,X-Request-With"
42
+ SYNCMASTER__SERVER__CORS__EXPOSE_HEADERS="X-Request-ID"
40
43
  # custom option passed directly to middleware
41
44
  SYNCMASTER__SERVER__CORS__MAX_AGE=600
42
45
  """
@@ -55,4 +58,13 @@ class CORSSettings(BaseModel):
55
58
  )
56
59
  expose_headers: list[str] = Field(default=["X-Request-ID"], description="HTTP headers exposed from server")
57
60
 
61
+ @field_validator("allow_origins", "allow_methods", "allow_headers", "expose_headers", mode="before")
62
+ @classmethod
63
+ def _validate_bootstrap_servers(cls, value: Any):
64
+ if not isinstance(value, str):
65
+ return value
66
+ if "[" in value:
67
+ return json.loads(value)
68
+ return [item.strip() for item in value.split(",")]
69
+
58
70
  model_config = ConfigDict(extra="allow")
@@ -25,4 +25,6 @@ class HDFSHandler(RemoteDFFileHandler):
25
25
 
26
26
  self.file_connection = HDFS(
27
27
  cluster=self.connection_dto.cluster,
28
+ user=self.connection_dto.user,
29
+ password=self.connection_dto.password,
28
30
  ).check()
@@ -6,8 +6,14 @@ import logging
6
6
  import math
7
7
  from typing import TYPE_CHECKING
8
8
 
9
+ from onetl.connection.kerberos_helpers import kinit_password
10
+
9
11
  from syncmaster.db.models import Run
10
- from syncmaster.dto.connections import ConnectionDTO
12
+ from syncmaster.dto.connections import (
13
+ ConnectionDTO,
14
+ HDFSConnectionDTO,
15
+ HiveConnectionDTO,
16
+ )
11
17
 
12
18
  if TYPE_CHECKING:
13
19
  from pyspark.sql import SparkSession
@@ -29,9 +35,14 @@ def get_worker_spark_session(
29
35
  for k, v in get_spark_session_conf(source, target, run.transfer.resources).items():
30
36
  spark_builder = spark_builder.config(k, v)
31
37
 
32
- if source.type == "hive" or target.type == "hive": # type: ignore
33
- log.debug("Enabling Hive support")
34
- spark_builder = spark_builder.enableHiveSupport()
38
+ for entity in source, target:
39
+ if isinstance(entity, HiveConnectionDTO):
40
+ log.debug("Enabling Hive support")
41
+ spark_builder = spark_builder.enableHiveSupport()
42
+
43
+ if isinstance(entity, (HiveConnectionDTO, HDFSConnectionDTO)):
44
+ log.debug("Using Kerberos auth for %s", entity.user)
45
+ kinit_password(entity.user, entity.password)
35
46
 
36
47
  return spark_builder.getOrCreate()
37
48
 
@@ -1,5 +0,0 @@
1
- # SPDX-FileCopyrightText: 2023-2024 MTS PJSC
2
- # SPDX-License-Identifier: Apache-2.0
3
- from pydantic import constr
4
-
5
- NameConstr = constr(min_length=1)