data_dp_ssis2sp 0.12.0__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 (418) hide show
  1. data_dp_ssis2sp-0.12.0/.env.example +29 -0
  2. data_dp_ssis2sp-0.12.0/.gitignore +48 -0
  3. data_dp_ssis2sp-0.12.0/.pre-commit-config.yaml +53 -0
  4. data_dp_ssis2sp-0.12.0/.python-version +1 -0
  5. data_dp_ssis2sp-0.12.0/PKG-INFO +1423 -0
  6. data_dp_ssis2sp-0.12.0/README.md +1396 -0
  7. data_dp_ssis2sp-0.12.0/azure-pipelines.yaml +79 -0
  8. data_dp_ssis2sp-0.12.0/conftest.py +28 -0
  9. data_dp_ssis2sp-0.12.0/data_dp_global_settings/__init__.py +3 -0
  10. data_dp_ssis2sp-0.12.0/data_dp_global_settings/settings.py +866 -0
  11. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/__init__.py +21 -0
  12. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/__main__.py +7 -0
  13. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/_naming.py +120 -0
  14. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/adf/__init__.py +1 -0
  15. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/adf/activities.py +468 -0
  16. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/adf/converter.py +536 -0
  17. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/adf/emitter.py +70 -0
  18. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/adf/finalise.py +122 -0
  19. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/adf/flow.py +161 -0
  20. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/adf/notify.py +136 -0
  21. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/adf/par_params.py +107 -0
  22. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/adf/reader.py +91 -0
  23. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/adf/schedule.py +133 -0
  24. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/adf/sharepoint.py +236 -0
  25. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/adf/sql_assets.py +45 -0
  26. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/adf/sql_format.py +158 -0
  27. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/adf/ssis_proc.py +115 -0
  28. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/agent/__init__.py +8 -0
  29. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/agent/command_parser.py +112 -0
  30. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/agent/extractor.py +342 -0
  31. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/agent/json_emitter.py +56 -0
  32. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/agent/manifest.py +217 -0
  33. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/agent/model.py +77 -0
  34. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/batch.py +693 -0
  35. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/cli.py +1244 -0
  36. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/column_rename.py +387 -0
  37. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/component_types.py +112 -0
  38. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/config.py +268 -0
  39. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/connection.py +142 -0
  40. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/control_graph.py +185 -0
  41. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/dialect.py +57 -0
  42. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/errors.py +48 -0
  43. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/export.py +163 -0
  44. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/expressions/__init__.py +49 -0
  45. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/expressions/ast.py +91 -0
  46. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/expressions/lexer.py +158 -0
  47. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/expressions/parser.py +186 -0
  48. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/expressions/translator.py +310 -0
  49. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/fix_tsql.py +313 -0
  50. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/flatten.py +186 -0
  51. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/generator.py +781 -0
  52. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/graph.py +110 -0
  53. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/inventory.py +91 -0
  54. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/linked_services.py +206 -0
  55. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/load_procs.py +79 -0
  56. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/model.py +261 -0
  57. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/observability.py +212 -0
  58. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/packages/__init__.py +23 -0
  59. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/packages/extractor.py +258 -0
  60. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/packages/model.py +40 -0
  61. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/packages/store_msdb.py +56 -0
  62. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/packages/store_ssisdb.py +215 -0
  63. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/parser.py +561 -0
  64. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/proc_render.py +159 -0
  65. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/project.py +130 -0
  66. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/register/__init__.py +3 -0
  67. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/register/linked_service_emitter.py +90 -0
  68. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/register/params.py +144 -0
  69. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/register/pipeline_emitter.py +169 -0
  70. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/register/proc_emitter.py +274 -0
  71. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/register/reader.py +97 -0
  72. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/register/sources.py +148 -0
  73. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/relation.py +65 -0
  74. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/rename_migration.py +139 -0
  75. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/report_server/__init__.py +15 -0
  76. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/report_server/models.py +50 -0
  77. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/report_server/rdl_builder.py +638 -0
  78. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/report_server/rdl_loader.py +579 -0
  79. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/schema_snapshot.py +289 -0
  80. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/sql/__init__.py +6 -0
  81. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/sql/datafactory_create_schema_role.sql +51 -0
  82. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/sql/usp_WaitForSsisExecution.sql +69 -0
  83. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/sql_gate.py +200 -0
  84. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/sqltypes.py +193 -0
  85. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/transforms/__init__.py +25 -0
  86. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/transforms/base.py +799 -0
  87. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/transforms/column_ops.py +91 -0
  88. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/transforms/conditional_split.py +73 -0
  89. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/transforms/context.py +388 -0
  90. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/transforms/destination.py +86 -0
  91. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/transforms/flow.py +104 -0
  92. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/transforms/grouping.py +124 -0
  93. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/transforms/lookup.py +176 -0
  94. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/transforms/registry.py +89 -0
  95. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/transforms/set_ops.py +296 -0
  96. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/transforms/source.py +294 -0
  97. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/tsql_ident.py +65 -0
  98. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/ui/__init__.py +9 -0
  99. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/ui/app.tcss +38 -0
  100. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/ui/log_style.py +120 -0
  101. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/ui/picker.py +113 -0
  102. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/ui/steps.py +301 -0
  103. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/ui/themes.py +63 -0
  104. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/ui/widgets.py +404 -0
  105. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/util.py +154 -0
  106. data_dp_ssis2sp-0.12.0/data_dp_ssis2sp/web.py +862 -0
  107. data_dp_ssis2sp-0.12.0/justfile +97 -0
  108. data_dp_ssis2sp-0.12.0/pyproject.toml +181 -0
  109. data_dp_ssis2sp-0.12.0/run.bat +177 -0
  110. data_dp_ssis2sp-0.12.0/scripts/validate_replication.py +360 -0
  111. data_dp_ssis2sp-0.12.0/stored_procedures/spEmailExample.sql +59 -0
  112. data_dp_ssis2sp-0.12.0/tests/__init__.py +0 -0
  113. data_dp_ssis2sp-0.12.0/tests/conftest.py +25 -0
  114. data_dp_ssis2sp-0.12.0/tests/fixtures/agent_manifest/injected_proc.json +11 -0
  115. data_dp_ssis2sp-0.12.0/tests/fixtures/agent_manifest/invalid_json.json +6 -0
  116. data_dp_ssis2sp-0.12.0/tests/fixtures/agent_manifest/missing_version.json +10 -0
  117. data_dp_ssis2sp-0.12.0/tests/fixtures/agent_manifest/traversal_dtsx.json +11 -0
  118. data_dp_ssis2sp-0.12.0/tests/fixtures/agent_manifest/valid.json +21 -0
  119. data_dp_ssis2sp-0.12.0/tests/fixtures/agent_manifest/wrong_version.json +11 -0
  120. data_dp_ssis2sp-0.12.0/tests/fixtures/agent_step_commands.json +89 -0
  121. data_dp_ssis2sp-0.12.0/tests/fixtures/determinism_tree/subdir/child_a.dtsx +48 -0
  122. data_dp_ssis2sp-0.12.0/tests/fixtures/determinism_tree/subdir/child_b.dtsx +48 -0
  123. data_dp_ssis2sp-0.12.0/tests/fixtures/determinism_tree/subdir/main.dtsx +34 -0
  124. data_dp_ssis2sp-0.12.0/tests/fixtures/determinism_tree/top_a.dtsx +48 -0
  125. data_dp_ssis2sp-0.12.0/tests/fixtures/determinism_tree/top_b.dtsx +48 -0
  126. data_dp_ssis2sp-0.12.0/tests/fixtures/expanded_project/@Project.manifest +22 -0
  127. data_dp_ssis2sp-0.12.0/tests/fixtures/expanded_project/LoadDims.dtsx +53 -0
  128. data_dp_ssis2sp-0.12.0/tests/fixtures/expanded_project/LoadSales.dtsx +56 -0
  129. data_dp_ssis2sp-0.12.0/tests/fixtures/expanded_project/Project.params +26 -0
  130. data_dp_ssis2sp-0.12.0/tests/fixtures/expanded_project/Staging.conmgr +10 -0
  131. data_dp_ssis2sp-0.12.0/tests/fixtures/flatfile/flat_file_no_header.dtsx +80 -0
  132. data_dp_ssis2sp-0.12.0/tests/fixtures/golden_adf/DW_Nightly_Notify_Load.pipeline.json +197 -0
  133. data_dp_ssis2sp-0.12.0/tests/fixtures/golden_adf/isserver_catalog_job.pipeline.json +112 -0
  134. data_dp_ssis2sp-0.12.0/tests/fixtures/golden_adf/isserver_with_env_token_job.pipeline.json +367 -0
  135. data_dp_ssis2sp-0.12.0/tests/fixtures/golden_adf/isserver_with_manifest_job.pipeline.json +360 -0
  136. data_dp_ssis2sp-0.12.0/tests/fixtures/golden_adf/ls_notify_function.json +18 -0
  137. data_dp_ssis2sp-0.12.0/tests/fixtures/golden_adf_jobs/branch_on_fail_retry_job.json +51 -0
  138. data_dp_ssis2sp-0.12.0/tests/fixtures/golden_adf_jobs/cmdexec_job.json +25 -0
  139. data_dp_ssis2sp-0.12.0/tests/fixtures/golden_adf_jobs/file_not_in_catalog_job.json +25 -0
  140. data_dp_ssis2sp-0.12.0/tests/fixtures/golden_adf_jobs/isserver_catalog_job.json +39 -0
  141. data_dp_ssis2sp-0.12.0/tests/fixtures/golden_adf_jobs/isserver_with_env_token_job.json +39 -0
  142. data_dp_ssis2sp-0.12.0/tests/fixtures/golden_adf_jobs/isserver_with_manifest_job.json +25 -0
  143. data_dp_ssis2sp-0.12.0/tests/fixtures/golden_adf_jobs/notify_failure_job.json +59 -0
  144. data_dp_ssis2sp-0.12.0/tests/fixtures/golden_adf_jobs/rewritten_audit_job.json +28 -0
  145. data_dp_ssis2sp-0.12.0/tests/fixtures/golden_adf_jobs/sql_store_job.json +25 -0
  146. data_dp_ssis2sp-0.12.0/tests/fixtures/golden_adf_jobs/ultracs_daily_job.json +115 -0
  147. data_dp_ssis2sp-0.12.0/tests/fixtures/golden_conn_e2e/LoadSalesJob.pipeline.json +138 -0
  148. data_dp_ssis2sp-0.12.0/tests/fixtures/golden_jobs/example_job.json +59 -0
  149. data_dp_ssis2sp-0.12.0/tests/fixtures/golden_rdl_procs/DW_PRESENTATION.reporting.usp_SalesByDate.StoredProcedure.sql +37 -0
  150. data_dp_ssis2sp-0.12.0/tests/fixtures/golden_register_pipelines/validate_dw_presentation.json +21 -0
  151. data_dp_ssis2sp-0.12.0/tests/fixtures/golden_register_procs/usp_ARF_743_0_param_available.sql +11 -0
  152. data_dp_ssis2sp-0.12.0/tests/fixtures/golden_register_procs/usp_Lendfast_FeeOverrides.sql +12 -0
  153. data_dp_ssis2sp-0.12.0/tests/fixtures/main_first/childa.dtsx +48 -0
  154. data_dp_ssis2sp-0.12.0/tests/fixtures/main_first/childb.dtsx +48 -0
  155. data_dp_ssis2sp-0.12.0/tests/fixtures/main_first/main.dtsx +34 -0
  156. data_dp_ssis2sp-0.12.0/tests/fixtures/main_first_all_dangling/main.dtsx +27 -0
  157. data_dp_ssis2sp-0.12.0/tests/fixtures/main_first_collision/main.dtsx +27 -0
  158. data_dp_ssis2sp-0.12.0/tests/fixtures/main_first_collision/x1.dtsx +5 -0
  159. data_dp_ssis2sp-0.12.0/tests/fixtures/main_first_collision/x2.dtsx +5 -0
  160. data_dp_ssis2sp-0.12.0/tests/fixtures/main_first_container/after_child.dtsx +5 -0
  161. data_dp_ssis2sp-0.12.0/tests/fixtures/main_first_container/main.dtsx +40 -0
  162. data_dp_ssis2sp-0.12.0/tests/fixtures/main_first_container/nested_child.dtsx +5 -0
  163. data_dp_ssis2sp-0.12.0/tests/fixtures/main_first_cycle/child_a.dtsx +48 -0
  164. data_dp_ssis2sp-0.12.0/tests/fixtures/main_first_cycle/child_b.dtsx +48 -0
  165. data_dp_ssis2sp-0.12.0/tests/fixtures/main_first_cycle/main.dtsx +39 -0
  166. data_dp_ssis2sp-0.12.0/tests/fixtures/main_first_dangling/child_a.dtsx +48 -0
  167. data_dp_ssis2sp-0.12.0/tests/fixtures/main_first_dangling/main.dtsx +24 -0
  168. data_dp_ssis2sp-0.12.0/tests/fixtures/main_first_main_with_dataflow/child.dtsx +48 -0
  169. data_dp_ssis2sp-0.12.0/tests/fixtures/main_first_main_with_dataflow/main.dtsx +77 -0
  170. data_dp_ssis2sp-0.12.0/tests/fixtures/main_first_main_with_dataflow_multi/childa.dtsx +48 -0
  171. data_dp_ssis2sp-0.12.0/tests/fixtures/main_first_main_with_dataflow_multi/childb.dtsx +48 -0
  172. data_dp_ssis2sp-0.12.0/tests/fixtures/main_first_main_with_dataflow_multi/main.dtsx +75 -0
  173. data_dp_ssis2sp-0.12.0/tests/fixtures/main_first_malformed_main/childa.dtsx +48 -0
  174. data_dp_ssis2sp-0.12.0/tests/fixtures/main_first_malformed_main/main.dtsx +17 -0
  175. data_dp_ssis2sp-0.12.0/tests/fixtures/main_first_missing_child/main.dtsx +17 -0
  176. data_dp_ssis2sp-0.12.0/tests/fixtures/main_first_nested/grandchild.dtsx +5 -0
  177. data_dp_ssis2sp-0.12.0/tests/fixtures/main_first_nested/main.dtsx +17 -0
  178. data_dp_ssis2sp-0.12.0/tests/fixtures/main_first_nested/nested_parent.dtsx +17 -0
  179. data_dp_ssis2sp-0.12.0/tests/fixtures/main_first_no_children/main.dtsx +48 -0
  180. data_dp_ssis2sp-0.12.0/tests/fixtures/main_first_no_main/nomainchilda.dtsx +48 -0
  181. data_dp_ssis2sp-0.12.0/tests/fixtures/main_first_no_main/nomainchildb.dtsx +48 -0
  182. data_dp_ssis2sp-0.12.0/tests/fixtures/main_first_outside_dir/main.dtsx +17 -0
  183. data_dp_ssis2sp-0.12.0/tests/fixtures/main_first_sanitiser_collision/Foo Bar.dtsx +48 -0
  184. data_dp_ssis2sp-0.12.0/tests/fixtures/main_first_sanitiser_collision/Foo.Bar.dtsx +48 -0
  185. data_dp_ssis2sp-0.12.0/tests/fixtures/main_first_sanitiser_collision/Foo_Bar.dtsx +48 -0
  186. data_dp_ssis2sp-0.12.0/tests/fixtures/main_first_sanitiser_collision/main.dtsx +37 -0
  187. data_dp_ssis2sp-0.12.0/tests/fixtures/main_first_url_encoded/Child%20A.dtsx +48 -0
  188. data_dp_ssis2sp-0.12.0/tests/fixtures/main_first_url_encoded/Child%20B.dtsx +48 -0
  189. data_dp_ssis2sp-0.12.0/tests/fixtures/main_first_url_encoded/main.dtsx +27 -0
  190. data_dp_ssis2sp-0.12.0/tests/fixtures/main_orch_with_db/childa.dtsx +44 -0
  191. data_dp_ssis2sp-0.12.0/tests/fixtures/main_orch_with_db/childb.dtsx +32 -0
  192. data_dp_ssis2sp-0.12.0/tests/fixtures/main_orch_with_db/main.dtsx +59 -0
  193. data_dp_ssis2sp-0.12.0/tests/fixtures/manifest/crafted_with_env_token.manifest +44 -0
  194. data_dp_ssis2sp-0.12.0/tests/fixtures/manifest/crafted_with_pkg_param.manifest +41 -0
  195. data_dp_ssis2sp-0.12.0/tests/fixtures/manifest/crafted_with_required_missing.manifest +20 -0
  196. data_dp_ssis2sp-0.12.0/tests/fixtures/manifest/ultracs_main.manifest +1342 -0
  197. data_dp_ssis2sp-0.12.0/tests/fixtures/rdl/conversion_register.csv +4 -0
  198. data_dp_ssis2sp-0.12.0/tests/fixtures/rdl/dax_report.rdl +12 -0
  199. data_dp_ssis2sp-0.12.0/tests/fixtures/rdl/monthly_sales.rdl +26 -0
  200. data_dp_ssis2sp-0.12.0/tests/fixtures/register_sample.csv +7 -0
  201. data_dp_ssis2sp-0.12.0/tests/fixtures/register_sharepoint_sample.csv +12 -0
  202. data_dp_ssis2sp-0.12.0/tests/fixtures/report_params_sample.csv +8 -0
  203. data_dp_ssis2sp-0.12.0/tests/fixtures/sales_etl_baseline.sql +232 -0
  204. data_dp_ssis2sp-0.12.0/tests/fixtures/sales_etl_flattened_baseline.sql +137 -0
  205. data_dp_ssis2sp-0.12.0/tests/test_adf_activities.py +635 -0
  206. data_dp_ssis2sp-0.12.0/tests/test_adf_connection_param.py +305 -0
  207. data_dp_ssis2sp-0.12.0/tests/test_adf_converter.py +975 -0
  208. data_dp_ssis2sp-0.12.0/tests/test_adf_emitter_determinism.py +154 -0
  209. data_dp_ssis2sp-0.12.0/tests/test_adf_flow.py +490 -0
  210. data_dp_ssis2sp-0.12.0/tests/test_adf_par_params.py +235 -0
  211. data_dp_ssis2sp-0.12.0/tests/test_adf_pipeline_params.py +460 -0
  212. data_dp_ssis2sp-0.12.0/tests/test_adf_review_fixes.py +588 -0
  213. data_dp_ssis2sp-0.12.0/tests/test_adf_schedule.py +245 -0
  214. data_dp_ssis2sp-0.12.0/tests/test_adf_sharepoint.py +393 -0
  215. data_dp_ssis2sp-0.12.0/tests/test_adf_stored_proc_notify.py +323 -0
  216. data_dp_ssis2sp-0.12.0/tests/test_adf_tsql_connection_concat.py +349 -0
  217. data_dp_ssis2sp-0.12.0/tests/test_agent_command_parser.py +141 -0
  218. data_dp_ssis2sp-0.12.0/tests/test_agent_extractor.py +323 -0
  219. data_dp_ssis2sp-0.12.0/tests/test_agent_json_determinism.py +177 -0
  220. data_dp_ssis2sp-0.12.0/tests/test_agent_manifest.py +245 -0
  221. data_dp_ssis2sp-0.12.0/tests/test_agent_manifest_connections.py +87 -0
  222. data_dp_ssis2sp-0.12.0/tests/test_agent_step_connection_identity.py +131 -0
  223. data_dp_ssis2sp-0.12.0/tests/test_agent_step_rewriter.py +325 -0
  224. data_dp_ssis2sp-0.12.0/tests/test_agent_warnings_log.py +85 -0
  225. data_dp_ssis2sp-0.12.0/tests/test_b1_shared_proc_shell.py +62 -0
  226. data_dp_ssis2sp-0.12.0/tests/test_batch.py +960 -0
  227. data_dp_ssis2sp-0.12.0/tests/test_batch_main_first.py +105 -0
  228. data_dp_ssis2sp-0.12.0/tests/test_batch_main_with_dataflow.py +61 -0
  229. data_dp_ssis2sp-0.12.0/tests/test_batch_negative_paths.py +161 -0
  230. data_dp_ssis2sp-0.12.0/tests/test_batch_no_children.py +45 -0
  231. data_dp_ssis2sp-0.12.0/tests/test_batch_no_main.py +103 -0
  232. data_dp_ssis2sp-0.12.0/tests/test_batch_proc_manifest.py +110 -0
  233. data_dp_ssis2sp-0.12.0/tests/test_batch_proc_manifest_connections.py +81 -0
  234. data_dp_ssis2sp-0.12.0/tests/test_cli.py +572 -0
  235. data_dp_ssis2sp-0.12.0/tests/test_cli_deploy_stored_procedures.py +533 -0
  236. data_dp_ssis2sp-0.12.0/tests/test_cli_emit_adf.py +337 -0
  237. data_dp_ssis2sp-0.12.0/tests/test_cli_emit_adf_from_register.py +170 -0
  238. data_dp_ssis2sp-0.12.0/tests/test_cli_emit_adf_sharepoint.py +151 -0
  239. data_dp_ssis2sp-0.12.0/tests/test_cli_emit_procs_from_register.py +152 -0
  240. data_dp_ssis2sp-0.12.0/tests/test_cli_emit_procs_from_reportserver.py +199 -0
  241. data_dp_ssis2sp-0.12.0/tests/test_cli_exit_codes.py +223 -0
  242. data_dp_ssis2sp-0.12.0/tests/test_cli_extract_agent_jobs_proc_manifest.py +76 -0
  243. data_dp_ssis2sp-0.12.0/tests/test_cli_extract_packages.py +148 -0
  244. data_dp_ssis2sp-0.12.0/tests/test_cli_finalise_adf.py +65 -0
  245. data_dp_ssis2sp-0.12.0/tests/test_cli_generate_linked_services.py +61 -0
  246. data_dp_ssis2sp-0.12.0/tests/test_cli_inventory.py +63 -0
  247. data_dp_ssis2sp-0.12.0/tests/test_cli_load_stored_procedures.py +806 -0
  248. data_dp_ssis2sp-0.12.0/tests/test_cli_pipeline.py +68 -0
  249. data_dp_ssis2sp-0.12.0/tests/test_cli_proc_commands.py +134 -0
  250. data_dp_ssis2sp-0.12.0/tests/test_column_rename.py +481 -0
  251. data_dp_ssis2sp-0.12.0/tests/test_component_types.py +85 -0
  252. data_dp_ssis2sp-0.12.0/tests/test_config.py +317 -0
  253. data_dp_ssis2sp-0.12.0/tests/test_conn_cli_default.py +66 -0
  254. data_dp_ssis2sp-0.12.0/tests/test_conn_e2e.py +214 -0
  255. data_dp_ssis2sp-0.12.0/tests/test_connection.py +141 -0
  256. data_dp_ssis2sp-0.12.0/tests/test_connection_identity.py +94 -0
  257. data_dp_ssis2sp-0.12.0/tests/test_connection_resolution.py +147 -0
  258. data_dp_ssis2sp-0.12.0/tests/test_control_graph.py +243 -0
  259. data_dp_ssis2sp-0.12.0/tests/test_convert_project.py +142 -0
  260. data_dp_ssis2sp-0.12.0/tests/test_dialect.py +64 -0
  261. data_dp_ssis2sp-0.12.0/tests/test_email_stored_proc_ddl.py +124 -0
  262. data_dp_ssis2sp-0.12.0/tests/test_ept_path_references.py +80 -0
  263. data_dp_ssis2sp-0.12.0/tests/test_export.py +106 -0
  264. data_dp_ssis2sp-0.12.0/tests/test_expressions.py +188 -0
  265. data_dp_ssis2sp-0.12.0/tests/test_finalise.py +155 -0
  266. data_dp_ssis2sp-0.12.0/tests/test_finalise_settings.py +48 -0
  267. data_dp_ssis2sp-0.12.0/tests/test_flatten.py +303 -0
  268. data_dp_ssis2sp-0.12.0/tests/test_flatten_equivalence.py +164 -0
  269. data_dp_ssis2sp-0.12.0/tests/test_fqdn_e2e.py +262 -0
  270. data_dp_ssis2sp-0.12.0/tests/test_generator.py +889 -0
  271. data_dp_ssis2sp-0.12.0/tests/test_generator_determinism.py +111 -0
  272. data_dp_ssis2sp-0.12.0/tests/test_generator_proc_name.py +49 -0
  273. data_dp_ssis2sp-0.12.0/tests/test_global_settings.py +23 -0
  274. data_dp_ssis2sp-0.12.0/tests/test_graph.py +60 -0
  275. data_dp_ssis2sp-0.12.0/tests/test_gs1_config_shim.py +180 -0
  276. data_dp_ssis2sp-0.12.0/tests/test_gs2_cli_flags.py +190 -0
  277. data_dp_ssis2sp-0.12.0/tests/test_gs3_env_migration.py +201 -0
  278. data_dp_ssis2sp-0.12.0/tests/test_input_normalization.py +92 -0
  279. data_dp_ssis2sp-0.12.0/tests/test_inventory.py +75 -0
  280. data_dp_ssis2sp-0.12.0/tests/test_lexer.py +263 -0
  281. data_dp_ssis2sp-0.12.0/tests/test_linked_services.py +1054 -0
  282. data_dp_ssis2sp-0.12.0/tests/test_log3_removal.py +451 -0
  283. data_dp_ssis2sp-0.12.0/tests/test_log4_1_blob_ls.py +121 -0
  284. data_dp_ssis2sp-0.12.0/tests/test_log4_2_dynamic_log_settings.py +245 -0
  285. data_dp_ssis2sp-0.12.0/tests/test_lookup_isnull.py +143 -0
  286. data_dp_ssis2sp-0.12.0/tests/test_naming.py +138 -0
  287. data_dp_ssis2sp-0.12.0/tests/test_observability.py +307 -0
  288. data_dp_ssis2sp-0.12.0/tests/test_orchestrator_only_main.py +207 -0
  289. data_dp_ssis2sp-0.12.0/tests/test_packages_extractor.py +517 -0
  290. data_dp_ssis2sp-0.12.0/tests/test_parameter_declarations.py +106 -0
  291. data_dp_ssis2sp-0.12.0/tests/test_parser.py +390 -0
  292. data_dp_ssis2sp-0.12.0/tests/test_proc_rdl_style_output.py +273 -0
  293. data_dp_ssis2sp-0.12.0/tests/test_proc_render.py +84 -0
  294. data_dp_ssis2sp-0.12.0/tests/test_proc_use_database.py +195 -0
  295. data_dp_ssis2sp-0.12.0/tests/test_project.py +151 -0
  296. data_dp_ssis2sp-0.12.0/tests/test_readme.py +114 -0
  297. data_dp_ssis2sp-0.12.0/tests/test_register_linked_service_emitter.py +113 -0
  298. data_dp_ssis2sp-0.12.0/tests/test_register_params.py +362 -0
  299. data_dp_ssis2sp-0.12.0/tests/test_register_pipeline_emitter.py +387 -0
  300. data_dp_ssis2sp-0.12.0/tests/test_register_proc_emitter.py +424 -0
  301. data_dp_ssis2sp-0.12.0/tests/test_register_reader.py +199 -0
  302. data_dp_ssis2sp-0.12.0/tests/test_register_sources.py +282 -0
  303. data_dp_ssis2sp-0.12.0/tests/test_relation.py +83 -0
  304. data_dp_ssis2sp-0.12.0/tests/test_rename_migration.py +338 -0
  305. data_dp_ssis2sp-0.12.0/tests/test_report_server_builder.py +592 -0
  306. data_dp_ssis2sp-0.12.0/tests/test_report_server_loader.py +667 -0
  307. data_dp_ssis2sp-0.12.0/tests/test_sales_etl_conversion.py +121 -0
  308. data_dp_ssis2sp-0.12.0/tests/test_schema_qualified_procs.py +137 -0
  309. data_dp_ssis2sp-0.12.0/tests/test_schema_snapshot.py +195 -0
  310. data_dp_ssis2sp-0.12.0/tests/test_sp_migration_settings.py +179 -0
  311. data_dp_ssis2sp-0.12.0/tests/test_spe1_email_settings.py +303 -0
  312. data_dp_ssis2sp-0.12.0/tests/test_sql_assets.py +45 -0
  313. data_dp_ssis2sp-0.12.0/tests/test_sql_format.py +154 -0
  314. data_dp_ssis2sp-0.12.0/tests/test_sql_gate.py +56 -0
  315. data_dp_ssis2sp-0.12.0/tests/test_sqltypes.py +148 -0
  316. data_dp_ssis2sp-0.12.0/tests/test_ssis_proc.py +89 -0
  317. data_dp_ssis2sp-0.12.0/tests/test_t1_agent_metadata.py +789 -0
  318. data_dp_ssis2sp-0.12.0/tests/test_t2_pipeline_metadata.py +153 -0
  319. data_dp_ssis2sp-0.12.0/tests/test_t4_notify.py +58 -0
  320. data_dp_ssis2sp-0.12.0/tests/test_t5_converter_notify.py +375 -0
  321. data_dp_ssis2sp-0.12.0/tests/test_textual_serve_dep.py +94 -0
  322. data_dp_ssis2sp-0.12.0/tests/test_transforms_base.py +1180 -0
  323. data_dp_ssis2sp-0.12.0/tests/test_transforms_column_ops.py +244 -0
  324. data_dp_ssis2sp-0.12.0/tests/test_transforms_conditional_split.py +140 -0
  325. data_dp_ssis2sp-0.12.0/tests/test_transforms_context.py +361 -0
  326. data_dp_ssis2sp-0.12.0/tests/test_transforms_destination.py +156 -0
  327. data_dp_ssis2sp-0.12.0/tests/test_transforms_flow.py +177 -0
  328. data_dp_ssis2sp-0.12.0/tests/test_transforms_grouping.py +221 -0
  329. data_dp_ssis2sp-0.12.0/tests/test_transforms_lookup.py +358 -0
  330. data_dp_ssis2sp-0.12.0/tests/test_transforms_registry.py +136 -0
  331. data_dp_ssis2sp-0.12.0/tests/test_transforms_set_ops.py +565 -0
  332. data_dp_ssis2sp-0.12.0/tests/test_transforms_source.py +1007 -0
  333. data_dp_ssis2sp-0.12.0/tests/test_translator.py +346 -0
  334. data_dp_ssis2sp-0.12.0/tests/test_ui.py +1385 -0
  335. data_dp_ssis2sp-0.12.0/tests/test_ui_log_style.py +97 -0
  336. data_dp_ssis2sp-0.12.0/tests/test_ui_steps.py +258 -0
  337. data_dp_ssis2sp-0.12.0/tests/test_ui_themes.py +57 -0
  338. data_dp_ssis2sp-0.12.0/tests/test_ui_widgets.py +451 -0
  339. data_dp_ssis2sp-0.12.0/tests/test_url_encoded_names.py +98 -0
  340. data_dp_ssis2sp-0.12.0/tests/test_util.py +91 -0
  341. data_dp_ssis2sp-0.12.0/tests/test_uv_migration.py +173 -0
  342. data_dp_ssis2sp-0.12.0/tests/test_visual_replication.py +296 -0
  343. data_dp_ssis2sp-0.12.0/tests/test_web.py +195 -0
  344. data_dp_ssis2sp-0.12.0/uv.lock +3016 -0
  345. data_dp_ssis2sp-0.12.0/validation/__init__.py +15 -0
  346. data_dp_ssis2sp-0.12.0/validation/_sql_regex.py +17 -0
  347. data_dp_ssis2sp-0.12.0/validation/capture/RUNBOOK.md +194 -0
  348. data_dp_ssis2sp-0.12.0/validation/capture/__init__.py +1 -0
  349. data_dp_ssis2sp-0.12.0/validation/capture/capture.ps1 +136 -0
  350. data_dp_ssis2sp-0.12.0/validation/capture/capture.py +302 -0
  351. data_dp_ssis2sp-0.12.0/validation/comparison.py +563 -0
  352. data_dp_ssis2sp-0.12.0/validation/conftest.py +92 -0
  353. data_dp_ssis2sp-0.12.0/validation/connection.py +179 -0
  354. data_dp_ssis2sp-0.12.0/validation/corpus/aggregate_group/golden/.gitkeep +0 -0
  355. data_dp_ssis2sp-0.12.0/validation/corpus/aggregate_group/ledger.yaml +19 -0
  356. data_dp_ssis2sp-0.12.0/validation/corpus/aggregate_group/package.dtsx +189 -0
  357. data_dp_ssis2sp-0.12.0/validation/corpus/aggregate_group/schema.sql +26 -0
  358. data_dp_ssis2sp-0.12.0/validation/corpus/aggregate_group/seed/src_sales.csv +12 -0
  359. data_dp_ssis2sp-0.12.0/validation/corpus/conditional_split/golden/.gitkeep +0 -0
  360. data_dp_ssis2sp-0.12.0/validation/corpus/conditional_split/ledger.yaml +29 -0
  361. data_dp_ssis2sp-0.12.0/validation/corpus/conditional_split/package.dtsx +159 -0
  362. data_dp_ssis2sp-0.12.0/validation/corpus/conditional_split/schema.sql +41 -0
  363. data_dp_ssis2sp-0.12.0/validation/corpus/conditional_split/seed/src_scores.csv +12 -0
  364. data_dp_ssis2sp-0.12.0/validation/corpus/derived_and_convert/golden/.gitkeep +0 -0
  365. data_dp_ssis2sp-0.12.0/validation/corpus/derived_and_convert/ledger.yaml +15 -0
  366. data_dp_ssis2sp-0.12.0/validation/corpus/derived_and_convert/package.dtsx +212 -0
  367. data_dp_ssis2sp-0.12.0/validation/corpus/derived_and_convert/schema.sql +29 -0
  368. data_dp_ssis2sp-0.12.0/validation/corpus/derived_and_convert/seed/src_products.csv +8 -0
  369. data_dp_ssis2sp-0.12.0/validation/corpus/etl_full/golden/.gitkeep +0 -0
  370. data_dp_ssis2sp-0.12.0/validation/corpus/etl_full/ledger.yaml +29 -0
  371. data_dp_ssis2sp-0.12.0/validation/corpus/etl_full/package.dtsx +287 -0
  372. data_dp_ssis2sp-0.12.0/validation/corpus/etl_full/schema.sql +37 -0
  373. data_dp_ssis2sp-0.12.0/validation/corpus/etl_full/seed/ref_customer_tiers.csv +6 -0
  374. data_dp_ssis2sp-0.12.0/validation/corpus/etl_full/seed/src_transactions.csv +8 -0
  375. data_dp_ssis2sp-0.12.0/validation/corpus/lookup_match/golden/.gitkeep +0 -0
  376. data_dp_ssis2sp-0.12.0/validation/corpus/lookup_match/ledger.yaml +51 -0
  377. data_dp_ssis2sp-0.12.0/validation/corpus/lookup_match/package.dtsx +154 -0
  378. data_dp_ssis2sp-0.12.0/validation/corpus/lookup_match/schema.sql +43 -0
  379. data_dp_ssis2sp-0.12.0/validation/corpus/lookup_match/seed/ref_customers.csv +6 -0
  380. data_dp_ssis2sp-0.12.0/validation/corpus/lookup_match/seed/src_orders.csv +8 -0
  381. data_dp_ssis2sp-0.12.0/validation/corpus/merge_join/golden/.gitkeep +0 -0
  382. data_dp_ssis2sp-0.12.0/validation/corpus/merge_join/ledger.yaml +17 -0
  383. data_dp_ssis2sp-0.12.0/validation/corpus/merge_join/package.dtsx +147 -0
  384. data_dp_ssis2sp-0.12.0/validation/corpus/merge_join/schema.sql +31 -0
  385. data_dp_ssis2sp-0.12.0/validation/corpus/merge_join/seed/src_departments.csv +4 -0
  386. data_dp_ssis2sp-0.12.0/validation/corpus/merge_join/seed/src_employees.csv +7 -0
  387. data_dp_ssis2sp-0.12.0/validation/corpus/passthrough_basic/golden/.gitkeep +0 -0
  388. data_dp_ssis2sp-0.12.0/validation/corpus/passthrough_basic/ledger.yaml +11 -0
  389. data_dp_ssis2sp-0.12.0/validation/corpus/passthrough_basic/package.dtsx +83 -0
  390. data_dp_ssis2sp-0.12.0/validation/corpus/passthrough_basic/schema.sql +26 -0
  391. data_dp_ssis2sp-0.12.0/validation/corpus/passthrough_basic/seed/src_items.csv +6 -0
  392. data_dp_ssis2sp-0.12.0/validation/corpus/union_multicast/golden/.gitkeep +0 -0
  393. data_dp_ssis2sp-0.12.0/validation/corpus/union_multicast/ledger.yaml +29 -0
  394. data_dp_ssis2sp-0.12.0/validation/corpus/union_multicast/package.dtsx +229 -0
  395. data_dp_ssis2sp-0.12.0/validation/corpus/union_multicast/schema.sql +43 -0
  396. data_dp_ssis2sp-0.12.0/validation/corpus/union_multicast/seed/src_events_current.csv +5 -0
  397. data_dp_ssis2sp-0.12.0/validation/corpus/union_multicast/seed/src_events_prior.csv +5 -0
  398. data_dp_ssis2sp-0.12.0/validation/ledger.py +180 -0
  399. data_dp_ssis2sp-0.12.0/validation/provisioning.py +303 -0
  400. data_dp_ssis2sp-0.12.0/validation/reporting.py +90 -0
  401. data_dp_ssis2sp-0.12.0/validation/schema_parse.py +115 -0
  402. data_dp_ssis2sp-0.12.0/validation/sql_runner.py +217 -0
  403. data_dp_ssis2sp-0.12.0/validation/static_checks.py +519 -0
  404. data_dp_ssis2sp-0.12.0/validation/test_package_smoke.py +72 -0
  405. data_dp_ssis2sp-0.12.0/validation/test_static.py +140 -0
  406. data_dp_ssis2sp-0.12.0/validation/test_validation.py +316 -0
  407. data_dp_ssis2sp-0.12.0/validation/tests/__init__.py +9 -0
  408. data_dp_ssis2sp-0.12.0/validation/tests/fixtures/tiny_pkg/schema.sql +27 -0
  409. data_dp_ssis2sp-0.12.0/validation/tests/fixtures/tiny_pkg/seed/src_widgets.csv +5 -0
  410. data_dp_ssis2sp-0.12.0/validation/tests/test_capture.py +594 -0
  411. data_dp_ssis2sp-0.12.0/validation/tests/test_comparison.py +754 -0
  412. data_dp_ssis2sp-0.12.0/validation/tests/test_connection.py +273 -0
  413. data_dp_ssis2sp-0.12.0/validation/tests/test_corpus.py +260 -0
  414. data_dp_ssis2sp-0.12.0/validation/tests/test_ledger.py +283 -0
  415. data_dp_ssis2sp-0.12.0/validation/tests/test_provisioning.py +322 -0
  416. data_dp_ssis2sp-0.12.0/validation/tests/test_sql_regex.py +72 -0
  417. data_dp_ssis2sp-0.12.0/validation/tests/test_sql_runner.py +452 -0
  418. data_dp_ssis2sp-0.12.0/validation/tests/test_static_checks.py +658 -0
@@ -0,0 +1,29 @@
1
+ # Copy to .env and fill in. .env is gitignored; this file is the contract.
2
+ # data_dp_global_settings.settings loads these via python-dotenv at import.
3
+ SOURCE_SERVER=
4
+ TARGET_SERVER=
5
+ SOURCE_REPORTING_SERVER=
6
+ TARGET_REPORTING_SERVER=
7
+ DEV_AZURE_SUBSCRIPTION_ID=
8
+ PROD_AZURE_SUBSCRIPTION_ID=
9
+
10
+ # Fill with your environment's real values in .env (gitignored). Formats shown below.
11
+ PRIMARY_EMAIL=you@example.com
12
+ EMAIL_RECIPIENTS=you@example.com,team@example.com
13
+ LINKED_SERVICE_SECRET_NAME=svc-account-kv-secret
14
+ LINKED_SERVICE_USER_NAME=DOMAIN\svc-account
15
+ SHAREPOINT_USER_NAME=svc-account
16
+ TICKET_ID=TICKET-000
17
+ # Comma-separated database names (no spaces).
18
+ DEPLOYMENT_DATABASES=DB_ONE,DB_TWO,DB_THREE
19
+ REPORTING_DATABASES=RptDB_ONE,RptDB_TWO
20
+ UNDEFINED_DATABASES=other_source_one,other_source_two
21
+ # JSON object: {"<sharepoint subsite url>": ["List Name", ...], ...}
22
+ SHAREPOINT_LISTS='{"http://sharepoint.example/SubSite": ["List A", "List B"]}'
23
+ SOURCE_SHAREPOINT_URL=http://sharepoint.example/_api/
24
+ # {env} is substituted with the environment name (dev/prod) at runtime.
25
+ RESOURCE_GROUP_TEMPLATE=rg-data-{env}-region-team
26
+ DATA_FACTORY_NAME_TEMPLATE=df-data-{env}-region-team-datafactory
27
+ KEYVAULT_BASE_URL_TEMPLATE=https://kv-data-{env}-region-team.vault.azure.net/
28
+ BLOB_STORAGE_ACCOUNT_TEMPLATE=sadata{env}transient
29
+ ADF_STORAGE_PATH_TEMPLATE=https://sadata{env}datalake.dfs.core.windows.net/
@@ -0,0 +1,48 @@
1
+ .repomix-output.xml
2
+ .claude
3
+ .claude/*
4
+ # python / ssis2sql
5
+ .venv/
6
+ __pycache__/
7
+ *.py[cod]
8
+ *.egg-info/
9
+ .pytest_cache/
10
+ build/
11
+ dist/
12
+ coverage.json
13
+ coverage.xml
14
+ .coverage
15
+
16
+ # desloppify
17
+ .env
18
+
19
+ # team-sprint artifacts
20
+ .team-sprint/
21
+ docs/*
22
+ # scheduled-task harness lock
23
+
24
+ # offline wheel bundle — already-tracked wheels stay in repo;
25
+ # this only blocks future ad-hoc additions from local refreshes
26
+ config.yaml
27
+
28
+ # devcontainer (local dev tooling)
29
+ .devcontainer/
30
+ .github
31
+ .github/*
32
+ .lattice
33
+ # graphify generated output
34
+ graphify-out/
35
+ team-sprint.config.yaml
36
+ # macOS Finder metadata — matches at every depth (bare pattern = recursive)
37
+ .DS_Store
38
+ examples/mssql-ssis-community-samples/*
39
+ examples/mssql-ssis-community-samples
40
+ examples/
41
+ design_handoff
42
+ Python Textual UI Design.zip
43
+
44
+ .claude/repomix/
45
+ .lattice/clv.ndjson
46
+ working_docs/
47
+ .lattice/clv.ndjson
48
+ docs/*
@@ -0,0 +1,53 @@
1
+ # Pre-commit hooks for data_dp_ssis2sp.
2
+ #
3
+ # Tools run from the project's uv environment (`uv run ...`) so hook versions
4
+ # track pyproject.toml exactly — no separately-pinned, drifting hook installs.
5
+ #
6
+ # Activate once: uv run pre-commit install
7
+ # Run manually: uv run pre-commit run --all-files
8
+ #
9
+ # Autofix vs. detect:
10
+ # * ruff — auto-fixes lint + formatting, re-stages the result.
11
+ # * bandit — security scanner: DETECTS, does not fix. A finding blocks the
12
+ # commit; fix the code (or add a justified `# nosec` on the line).
13
+ # * vulture — dead-code scanner: DETECTS, does not fix. A finding blocks the
14
+ # commit; remove the dead code (or add it to a vulture whitelist).
15
+ repos:
16
+ - repo: local
17
+ hooks:
18
+ # Ruff lint with autofix — fixes what it can, blocks on what it can't.
19
+ - id: ruff-check
20
+ name: ruff check (lint + autofix)
21
+ entry: uv run ruff check --fix --force-exclude
22
+ language: system
23
+ types_or: [python, pyi]
24
+
25
+ # Ruff formatter.
26
+ - id: ruff-format
27
+ name: ruff format
28
+ entry: uv run ruff format --force-exclude
29
+ language: system
30
+ types_or: [python, pyi]
31
+
32
+ # Bandit security scan on every staged Python file — nothing path-excluded,
33
+ # since anything published must be scanned. Most strict: report every
34
+ # severity + confidence, so ANY finding blocks the commit. `-c pyproject.toml`
35
+ # loads [tool.bandit.assert_used], which exempts B101 (assert) in test files
36
+ # ONLY — every other rule still applies to tests. Accepted risk elsewhere is
37
+ # annotated inline as `# nosec <CODE> # <reason>` (double-hash).
38
+ - id: bandit
39
+ name: bandit (security scan)
40
+ entry: uv run bandit -c pyproject.toml
41
+ language: system
42
+ types: [python]
43
+ args: ["-q", "--severity-level", "all", "--confidence-level", "all"]
44
+
45
+ # Vulture dead-code scan. Runs across the whole package on every commit —
46
+ # vulture needs the full tree to tell a genuinely-unused symbol from one
47
+ # that's referenced in a file you didn't touch.
48
+ - id: vulture
49
+ name: vulture (dead code)
50
+ entry: uv run vulture data_dp_ssis2sp --min-confidence 80
51
+ language: system
52
+ pass_filenames: false
53
+ always_run: true
@@ -0,0 +1 @@
1
+ 3.14