keboola-cli 0.63.4__py3-none-any.whl
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.
- keboola_agent_cli/__init__.py +34 -0
- keboola_agent_cli/__main__.py +5 -0
- keboola_agent_cli/_ui_dist/assets/arc-DhFYIddx.js +2 -0
- keboola_agent_cli/_ui_dist/assets/arc-DhFYIddx.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/architecture-7EHR7CIX-hNCijx_H.js +1 -0
- keboola_agent_cli/_ui_dist/assets/architectureDiagram-3BPJPVTR-C6hUlprM.js +37 -0
- keboola_agent_cli/_ui_dist/assets/architectureDiagram-3BPJPVTR-C6hUlprM.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/array-BifhSqXX.js +2 -0
- keboola_agent_cli/_ui_dist/assets/array-BifhSqXX.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/blockDiagram-GPEHLZMM-DC7qY9i4.js +133 -0
- keboola_agent_cli/_ui_dist/assets/blockDiagram-GPEHLZMM-DC7qY9i4.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/c4Diagram-AAUBKEIU-5Lh44evt.js +11 -0
- keboola_agent_cli/_ui_dist/assets/c4Diagram-AAUBKEIU-5Lh44evt.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/channel-DBMrXlxx.js +2 -0
- keboola_agent_cli/_ui_dist/assets/channel-DBMrXlxx.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/chunk-2J33WTMH-Coy82EBh.js +2 -0
- keboola_agent_cli/_ui_dist/assets/chunk-2J33WTMH-Coy82EBh.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/chunk-3OPIFGDE-BQC5CRHI.js +63 -0
- keboola_agent_cli/_ui_dist/assets/chunk-3OPIFGDE-BQC5CRHI.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/chunk-4BX2VUAB-DUuEt70o.js +2 -0
- keboola_agent_cli/_ui_dist/assets/chunk-4BX2VUAB-DUuEt70o.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/chunk-55IACEB6-BvR-6chF.js +2 -0
- keboola_agent_cli/_ui_dist/assets/chunk-55IACEB6-BvR-6chF.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/chunk-5ZQYHXKU-BjcTN7ul.js +3 -0
- keboola_agent_cli/_ui_dist/assets/chunk-5ZQYHXKU-BjcTN7ul.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/chunk-727SXJPM-C0zxqqRN.js +207 -0
- keboola_agent_cli/_ui_dist/assets/chunk-727SXJPM-C0zxqqRN.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/chunk-AQP2D5EJ-CXf7rIlZ.js +232 -0
- keboola_agent_cli/_ui_dist/assets/chunk-AQP2D5EJ-CXf7rIlZ.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/chunk-BSJP7CBP-Oj_FO9Q7.js +2 -0
- keboola_agent_cli/_ui_dist/assets/chunk-BSJP7CBP-Oj_FO9Q7.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/chunk-CSCIHK7Q-CcTsLrFc.js +124 -0
- keboola_agent_cli/_ui_dist/assets/chunk-CSCIHK7Q-CcTsLrFc.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/chunk-FMBD7UC4-FH-zLkkW.js +16 -0
- keboola_agent_cli/_ui_dist/assets/chunk-FMBD7UC4-FH-zLkkW.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/chunk-L5ZTLDWV-B1Ky_e7O.js +2 -0
- keboola_agent_cli/_ui_dist/assets/chunk-L5ZTLDWV-B1Ky_e7O.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/chunk-ND2GUHAM-BHz1rpbm.js +2 -0
- keboola_agent_cli/_ui_dist/assets/chunk-ND2GUHAM-BHz1rpbm.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/chunk-NNHCCRGN-DlpIbxXb.js +160 -0
- keboola_agent_cli/_ui_dist/assets/chunk-NNHCCRGN-DlpIbxXb.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/chunk-NZK2D7GU-tnrSoegS.js +2 -0
- keboola_agent_cli/_ui_dist/assets/chunk-NZK2D7GU-tnrSoegS.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/chunk-O5CBEL6O-DxxqDH0l.js +71 -0
- keboola_agent_cli/_ui_dist/assets/chunk-O5CBEL6O-DxxqDH0l.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/chunk-QZHKN3VN-CSjc2gjj.js +2 -0
- keboola_agent_cli/_ui_dist/assets/chunk-QZHKN3VN-CSjc2gjj.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/classDiagram-4FO5ZUOK-BuZcZu85.js +2 -0
- keboola_agent_cli/_ui_dist/assets/classDiagram-4FO5ZUOK-BuZcZu85.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/classDiagram-v2-Q7XG4LA2-BuZcZu85.js +2 -0
- keboola_agent_cli/_ui_dist/assets/classDiagram-v2-Q7XG4LA2-BuZcZu85.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/cose-bilkent-S5V4N54A-Y0L8LDMa.js +2 -0
- keboola_agent_cli/_ui_dist/assets/cose-bilkent-S5V4N54A-Y0L8LDMa.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/cytoscape.esm-C8YCVR3_.js +322 -0
- keboola_agent_cli/_ui_dist/assets/cytoscape.esm-C8YCVR3_.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/dagre-BM42HDAG-UZ-9BTqF.js +5 -0
- keboola_agent_cli/_ui_dist/assets/dagre-BM42HDAG-UZ-9BTqF.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/dagre-Bx709z4p.js +2 -0
- keboola_agent_cli/_ui_dist/assets/dagre-Bx709z4p.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/defaultLocale-C8Fc0cco.js +2 -0
- keboola_agent_cli/_ui_dist/assets/defaultLocale-C8Fc0cco.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/diagram-2AECGRRQ-DoDQ60wi.js +44 -0
- keboola_agent_cli/_ui_dist/assets/diagram-2AECGRRQ-DoDQ60wi.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/diagram-5GNKFQAL-CMGFxpUs.js +11 -0
- keboola_agent_cli/_ui_dist/assets/diagram-5GNKFQAL-CMGFxpUs.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/diagram-KO2AKTUF-1uGDa-Iu.js +4 -0
- keboola_agent_cli/_ui_dist/assets/diagram-KO2AKTUF-1uGDa-Iu.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/diagram-LMA3HP47-XtFH7B51.js +25 -0
- keboola_agent_cli/_ui_dist/assets/diagram-LMA3HP47-XtFH7B51.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/diagram-OG6HWLK6-B4_Te1T5.js +25 -0
- keboola_agent_cli/_ui_dist/assets/diagram-OG6HWLK6-B4_Te1T5.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/dist-Di6zmlv0.js +2 -0
- keboola_agent_cli/_ui_dist/assets/dist-Di6zmlv0.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/erDiagram-TEJ5UH35-NjQkrdFt.js +86 -0
- keboola_agent_cli/_ui_dist/assets/erDiagram-TEJ5UH35-NjQkrdFt.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/eventmodeling-FCH6USID-BrJMIks8.js +1 -0
- keboola_agent_cli/_ui_dist/assets/flowDiagram-I6XJVG4X-CIr8DWl7.js +163 -0
- keboola_agent_cli/_ui_dist/assets/flowDiagram-I6XJVG4X-CIr8DWl7.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/ganttDiagram-6RSMTGT7-C1VY_xbQ.js +293 -0
- keboola_agent_cli/_ui_dist/assets/ganttDiagram-6RSMTGT7-C1VY_xbQ.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/gitGraph-WXDBUCRP-COacYjo-.js +1 -0
- keboola_agent_cli/_ui_dist/assets/gitGraphDiagram-PVQCEYII-DQT8-kg2.js +107 -0
- keboola_agent_cli/_ui_dist/assets/gitGraphDiagram-PVQCEYII-DQT8-kg2.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/graphlib-B8gBHxth.js +2 -0
- keboola_agent_cli/_ui_dist/assets/graphlib-B8gBHxth.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/index-CMq50kkV.css +1 -0
- keboola_agent_cli/_ui_dist/assets/index-D8W97DAz.js +118 -0
- keboola_agent_cli/_ui_dist/assets/index-D8W97DAz.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/info-J43DQDTF-DdCTRIzU.js +1 -0
- keboola_agent_cli/_ui_dist/assets/infoDiagram-5YYISTIA-C77rsoTp.js +3 -0
- keboola_agent_cli/_ui_dist/assets/infoDiagram-5YYISTIA-C77rsoTp.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/init-D6jRqBbL.js +2 -0
- keboola_agent_cli/_ui_dist/assets/init-D6jRqBbL.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/ishikawaDiagram-YF4QCWOH-BcTbXaLy.js +71 -0
- keboola_agent_cli/_ui_dist/assets/ishikawaDiagram-YF4QCWOH-BcTbXaLy.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/journeyDiagram-JHISSGLW-BejeAJQ_.js +140 -0
- keboola_agent_cli/_ui_dist/assets/journeyDiagram-JHISSGLW-BejeAJQ_.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/kanban-definition-UN3LZRKU-BRNz_UrH.js +90 -0
- keboola_agent_cli/_ui_dist/assets/kanban-definition-UN3LZRKU-BRNz_UrH.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/katex-C4eR7coU.js +258 -0
- keboola_agent_cli/_ui_dist/assets/katex-C4eR7coU.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/line-CzAQKFbJ.js +2 -0
- keboola_agent_cli/_ui_dist/assets/line-CzAQKFbJ.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/linear-DUNFFdck.js +2 -0
- keboola_agent_cli/_ui_dist/assets/linear-DUNFFdck.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/mermaid-parser.core-CpuBOkFa.js +5 -0
- keboola_agent_cli/_ui_dist/assets/mermaid-parser.core-CpuBOkFa.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/mindmap-definition-RKZ34NQL-9EJQNjH0.js +97 -0
- keboola_agent_cli/_ui_dist/assets/mindmap-definition-RKZ34NQL-9EJQNjH0.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/ordinal-hYBb2elL.js +2 -0
- keboola_agent_cli/_ui_dist/assets/ordinal-hYBb2elL.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/packet-YPE3B663-DLiiw_B2.js +1 -0
- keboola_agent_cli/_ui_dist/assets/path-BWPyau1x.js +2 -0
- keboola_agent_cli/_ui_dist/assets/path-BWPyau1x.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/pie-LRSECV5Y-CRoO8G1g.js +1 -0
- keboola_agent_cli/_ui_dist/assets/pieDiagram-4H26LBE5-XH4cy6Cb.js +31 -0
- keboola_agent_cli/_ui_dist/assets/pieDiagram-4H26LBE5-XH4cy6Cb.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/quadrantDiagram-W4KKPZXB-fdhc93U8.js +8 -0
- keboola_agent_cli/_ui_dist/assets/quadrantDiagram-W4KKPZXB-fdhc93U8.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/radar-GUYGQ44K-DAlLVJHm.js +1 -0
- keboola_agent_cli/_ui_dist/assets/requirementDiagram-4Y6WPE33-a94eP3R9.js +85 -0
- keboola_agent_cli/_ui_dist/assets/requirementDiagram-4Y6WPE33-a94eP3R9.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/rough.esm-CSKSodPl.js +2 -0
- keboola_agent_cli/_ui_dist/assets/rough.esm-CSKSodPl.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/sankeyDiagram-5OEKKPKP-jcBa02sp.js +41 -0
- keboola_agent_cli/_ui_dist/assets/sankeyDiagram-5OEKKPKP-jcBa02sp.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/sequenceDiagram-3UESZ5HK-A5-GGM-e.js +163 -0
- keboola_agent_cli/_ui_dist/assets/sequenceDiagram-3UESZ5HK-A5-GGM-e.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/src-ZI-V_AF0.js +2 -0
- keboola_agent_cli/_ui_dist/assets/src-ZI-V_AF0.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/stateDiagram-AJRCARHV-BKAA5rqE.js +2 -0
- keboola_agent_cli/_ui_dist/assets/stateDiagram-AJRCARHV-BKAA5rqE.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/stateDiagram-v2-BHNVJYJU-DnJwJBsE.js +2 -0
- keboola_agent_cli/_ui_dist/assets/stateDiagram-v2-BHNVJYJU-DnJwJBsE.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/timeline-definition-PNZ67QCA-Cy39jp8b.js +121 -0
- keboola_agent_cli/_ui_dist/assets/timeline-definition-PNZ67QCA-Cy39jp8b.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/treeView-BLDUP644-DbLYl23-.js +1 -0
- keboola_agent_cli/_ui_dist/assets/treemap-LRROVOQU-Bp0eGlOt.js +1 -0
- keboola_agent_cli/_ui_dist/assets/vennDiagram-CIIHVFJN-BGECKubd.js +35 -0
- keboola_agent_cli/_ui_dist/assets/vennDiagram-CIIHVFJN-BGECKubd.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/wardley-L42UT6IY-D4yH4jqS.js +1 -0
- keboola_agent_cli/_ui_dist/assets/wardleyDiagram-YWT4CUSO-D6XRG3cZ.js +79 -0
- keboola_agent_cli/_ui_dist/assets/wardleyDiagram-YWT4CUSO-D6XRG3cZ.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/xychartDiagram-2RQKCTM6-DRre-pfZ.js +8 -0
- keboola_agent_cli/_ui_dist/assets/xychartDiagram-2RQKCTM6-DRre-pfZ.js.map +1 -0
- keboola_agent_cli/_ui_dist/index.html +50 -0
- keboola_agent_cli/ai_client.py +83 -0
- keboola_agent_cli/auto_update.py +550 -0
- keboola_agent_cli/changelog.py +1198 -0
- keboola_agent_cli/cli.py +448 -0
- keboola_agent_cli/client.py +3422 -0
- keboola_agent_cli/commands/__init__.py +0 -0
- keboola_agent_cli/commands/_data_app_git.py +343 -0
- keboola_agent_cli/commands/_helpers.py +377 -0
- keboola_agent_cli/commands/_metadata_input.py +49 -0
- keboola_agent_cli/commands/_semantic_layer_crud.py +632 -0
- keboola_agent_cli/commands/_semantic_layer_helpers.py +44 -0
- keboola_agent_cli/commands/_semantic_layer_reference_data.py +247 -0
- keboola_agent_cli/commands/agent.py +968 -0
- keboola_agent_cli/commands/branch.py +423 -0
- keboola_agent_cli/commands/changelog.py +168 -0
- keboola_agent_cli/commands/component.py +216 -0
- keboola_agent_cli/commands/config.py +2442 -0
- keboola_agent_cli/commands/context.py +1481 -0
- keboola_agent_cli/commands/data_app.py +1279 -0
- keboola_agent_cli/commands/dev_portal.py +584 -0
- keboola_agent_cli/commands/doctor.py +37 -0
- keboola_agent_cli/commands/encrypt.py +145 -0
- keboola_agent_cli/commands/feature.py +311 -0
- keboola_agent_cli/commands/flow.py +948 -0
- keboola_agent_cli/commands/http_client.py +157 -0
- keboola_agent_cli/commands/init.py +279 -0
- keboola_agent_cli/commands/job.py +661 -0
- keboola_agent_cli/commands/kai.py +301 -0
- keboola_agent_cli/commands/lineage.py +1464 -0
- keboola_agent_cli/commands/org.py +292 -0
- keboola_agent_cli/commands/permissions.py +360 -0
- keboola_agent_cli/commands/project.py +1192 -0
- keboola_agent_cli/commands/repl.py +243 -0
- keboola_agent_cli/commands/schedule.py +340 -0
- keboola_agent_cli/commands/search.py +178 -0
- keboola_agent_cli/commands/semantic_layer.py +939 -0
- keboola_agent_cli/commands/serve.py +272 -0
- keboola_agent_cli/commands/sharing.py +340 -0
- keboola_agent_cli/commands/storage.py +2630 -0
- keboola_agent_cli/commands/stream.py +266 -0
- keboola_agent_cli/commands/sync.py +1277 -0
- keboola_agent_cli/commands/tool.py +206 -0
- keboola_agent_cli/commands/version.py +186 -0
- keboola_agent_cli/commands/workspace.py +635 -0
- keboola_agent_cli/config_store.py +582 -0
- keboola_agent_cli/constants.py +528 -0
- keboola_agent_cli/data_science_client.py +342 -0
- keboola_agent_cli/dev_portal_client.py +323 -0
- keboola_agent_cli/errors.py +248 -0
- keboola_agent_cli/http_base.py +315 -0
- keboola_agent_cli/json_utils.py +126 -0
- keboola_agent_cli/lib.py +536 -0
- keboola_agent_cli/manage_client.py +324 -0
- keboola_agent_cli/metastore_client.py +214 -0
- keboola_agent_cli/models.py +427 -0
- keboola_agent_cli/output.py +1084 -0
- keboola_agent_cli/permissions.py +469 -0
- keboola_agent_cli/py.typed +3 -0
- keboola_agent_cli/result_models.py +271 -0
- keboola_agent_cli/server/__init__.py +34 -0
- keboola_agent_cli/server/agent_runner.py +1289 -0
- keboola_agent_cli/server/agents_store.py +325 -0
- keboola_agent_cli/server/app.py +764 -0
- keboola_agent_cli/server/auth.py +117 -0
- keboola_agent_cli/server/dependencies.py +149 -0
- keboola_agent_cli/server/pricing.py +303 -0
- keboola_agent_cli/server/routers/__init__.py +1 -0
- keboola_agent_cli/server/routers/agents.py +616 -0
- keboola_agent_cli/server/routers/ai_chat.py +129 -0
- keboola_agent_cli/server/routers/branches.py +133 -0
- keboola_agent_cli/server/routers/components.py +48 -0
- keboola_agent_cli/server/routers/configs.py +507 -0
- keboola_agent_cli/server/routers/data_apps.py +384 -0
- keboola_agent_cli/server/routers/dev_portal.py +67 -0
- keboola_agent_cli/server/routers/encrypt.py +35 -0
- keboola_agent_cli/server/routers/feature.py +179 -0
- keboola_agent_cli/server/routers/flows.py +204 -0
- keboola_agent_cli/server/routers/health.py +53 -0
- keboola_agent_cli/server/routers/jobs.py +175 -0
- keboola_agent_cli/server/routers/kai.py +80 -0
- keboola_agent_cli/server/routers/lineage.py +226 -0
- keboola_agent_cli/server/routers/mcp.py +70 -0
- keboola_agent_cli/server/routers/members.py +170 -0
- keboola_agent_cli/server/routers/org.py +96 -0
- keboola_agent_cli/server/routers/projects.py +106 -0
- keboola_agent_cli/server/routers/schedules.py +54 -0
- keboola_agent_cli/server/routers/search.py +30 -0
- keboola_agent_cli/server/routers/semantic_layer.py +650 -0
- keboola_agent_cli/server/routers/sharing.py +86 -0
- keboola_agent_cli/server/routers/storage.py +574 -0
- keboola_agent_cli/server/routers/stream.py +100 -0
- keboola_agent_cli/server/routers/workspaces.py +302 -0
- keboola_agent_cli/server/run_broadcaster.py +329 -0
- keboola_agent_cli/server/sse.py +25 -0
- keboola_agent_cli/services/__init__.py +0 -0
- keboola_agent_cli/services/_encryption.py +217 -0
- keboola_agent_cli/services/_semantic_layer_cascade.py +147 -0
- keboola_agent_cli/services/_semantic_layer_crud.py +382 -0
- keboola_agent_cli/services/_semantic_layer_internals.py +1078 -0
- keboola_agent_cli/services/_semantic_layer_lookup.py +181 -0
- keboola_agent_cli/services/_semantic_layer_reference_data.py +217 -0
- keboola_agent_cli/services/_sync_bindings.py +456 -0
- keboola_agent_cli/services/_sync_branch.py +191 -0
- keboola_agent_cli/services/_sync_bulk.py +228 -0
- keboola_agent_cli/services/_sync_clone.py +163 -0
- keboola_agent_cli/services/_sync_models.py +97 -0
- keboola_agent_cli/services/_sync_push_ops.py +369 -0
- keboola_agent_cli/services/_sync_storage.py +376 -0
- keboola_agent_cli/services/_sync_writeback.py +167 -0
- keboola_agent_cli/services/agent_service.py +458 -0
- keboola_agent_cli/services/base.py +175 -0
- keboola_agent_cli/services/branch_service.py +588 -0
- keboola_agent_cli/services/component_service.py +694 -0
- keboola_agent_cli/services/config_service.py +2099 -0
- keboola_agent_cli/services/data_app_git_service.py +224 -0
- keboola_agent_cli/services/data_app_service.py +2082 -0
- keboola_agent_cli/services/deep_lineage_service.py +1322 -0
- keboola_agent_cli/services/dev_portal_service.py +345 -0
- keboola_agent_cli/services/doctor_service.py +445 -0
- keboola_agent_cli/services/encrypt_service.py +87 -0
- keboola_agent_cli/services/feature_service.py +268 -0
- keboola_agent_cli/services/flow_service.py +769 -0
- keboola_agent_cli/services/flow_validation.py +188 -0
- keboola_agent_cli/services/http_forwarder_service.py +236 -0
- keboola_agent_cli/services/job_idempotency_store.py +285 -0
- keboola_agent_cli/services/job_service.py +797 -0
- keboola_agent_cli/services/kai_service.py +367 -0
- keboola_agent_cli/services/lineage_service.py +274 -0
- keboola_agent_cli/services/mcp_service.py +1498 -0
- keboola_agent_cli/services/mcp_transport.py +259 -0
- keboola_agent_cli/services/member_service.py +593 -0
- keboola_agent_cli/services/org_service.py +619 -0
- keboola_agent_cli/services/project_service.py +947 -0
- keboola_agent_cli/services/repo_validate_service.py +767 -0
- keboola_agent_cli/services/schedule_service.py +731 -0
- keboola_agent_cli/services/search_service.py +331 -0
- keboola_agent_cli/services/semantic_layer_service.py +1497 -0
- keboola_agent_cli/services/sharing_service.py +307 -0
- keboola_agent_cli/services/storage_service.py +2524 -0
- keboola_agent_cli/services/stream_service.py +395 -0
- keboola_agent_cli/services/sync_service.py +2244 -0
- keboola_agent_cli/services/variables_service.py +447 -0
- keboola_agent_cli/services/version_service.py +1038 -0
- keboola_agent_cli/services/workspace_service.py +1103 -0
- keboola_agent_cli/stream_client.py +217 -0
- keboola_agent_cli/sync/__init__.py +1 -0
- keboola_agent_cli/sync/branch_mapping.py +174 -0
- keboola_agent_cli/sync/clone.py +211 -0
- keboola_agent_cli/sync/code_extraction.py +655 -0
- keboola_agent_cli/sync/config_format.py +290 -0
- keboola_agent_cli/sync/diff_engine.py +566 -0
- keboola_agent_cli/sync/git_utils.py +93 -0
- keboola_agent_cli/sync/manifest.py +162 -0
- keboola_agent_cli/sync/naming.py +90 -0
- keboola_agent_cli/sync/secrets.py +62 -0
- keboola_agent_cli/sync/sql_split.py +134 -0
- keboola_cli-0.63.4.dist-info/METADATA +308 -0
- keboola_cli-0.63.4.dist-info/RECORD +306 -0
- keboola_cli-0.63.4.dist-info/WHEEL +4 -0
- keboola_cli-0.63.4.dist-info/entry_points.txt +2 -0
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
"""Multi-project (all-projects) pull/diff/push orchestration (from sync_service.py).
|
|
2
|
+
|
|
3
|
+
Free functions taking the ``SyncService`` so the public ``pull_all`` / ``diff_all``
|
|
4
|
+
/ ``push_all`` methods stay thin delegators. Each fans out across the registered
|
|
5
|
+
projects in parallel, materialising one ``base_dir/<alias>/`` per project, and
|
|
6
|
+
collects per-project results without letting one project's failure abort the rest.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
from concurrent.futures import ThreadPoolExecutor, as_completed
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
from typing import TYPE_CHECKING, Any
|
|
14
|
+
|
|
15
|
+
from ..constants import (
|
|
16
|
+
DEFAULT_JOBS_PER_CONFIG,
|
|
17
|
+
DEFAULT_MAX_SAMPLES,
|
|
18
|
+
DEFAULT_SAMPLE_LIMIT,
|
|
19
|
+
KEBOOLA_DIR_NAME,
|
|
20
|
+
)
|
|
21
|
+
from ..errors import SyncConflictError
|
|
22
|
+
|
|
23
|
+
if TYPE_CHECKING:
|
|
24
|
+
from .sync_service import SyncService
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def pull_all(
|
|
28
|
+
service: SyncService,
|
|
29
|
+
base_dir: Path,
|
|
30
|
+
force: bool = False,
|
|
31
|
+
dry_run: bool = False,
|
|
32
|
+
job_limit: int = DEFAULT_JOBS_PER_CONFIG,
|
|
33
|
+
no_storage: bool = False,
|
|
34
|
+
no_jobs: bool = False,
|
|
35
|
+
with_samples: bool = False,
|
|
36
|
+
sample_limit: int = DEFAULT_SAMPLE_LIMIT,
|
|
37
|
+
max_samples: int = DEFAULT_MAX_SAMPLES,
|
|
38
|
+
) -> dict[str, Any]:
|
|
39
|
+
"""Pull all registered projects in parallel.
|
|
40
|
+
|
|
41
|
+
For each project, creates ``base_dir/<alias>/`` and initializes if no
|
|
42
|
+
manifest exists yet, then pulls. Returns a dict with per-project results and
|
|
43
|
+
a summary.
|
|
44
|
+
"""
|
|
45
|
+
projects = service.resolve_projects(None)
|
|
46
|
+
results: dict[str, Any] = {}
|
|
47
|
+
success_count = 0
|
|
48
|
+
failed_count = 0
|
|
49
|
+
|
|
50
|
+
def _worker(alias: str) -> None:
|
|
51
|
+
nonlocal success_count, failed_count
|
|
52
|
+
project_root = base_dir / alias
|
|
53
|
+
manifest_path = project_root / KEBOOLA_DIR_NAME / "manifest.json"
|
|
54
|
+
try:
|
|
55
|
+
if not manifest_path.exists():
|
|
56
|
+
service.init_sync(alias, project_root)
|
|
57
|
+
result = service.pull(
|
|
58
|
+
alias,
|
|
59
|
+
project_root,
|
|
60
|
+
force=force,
|
|
61
|
+
dry_run=dry_run,
|
|
62
|
+
job_limit=job_limit,
|
|
63
|
+
no_storage=no_storage,
|
|
64
|
+
no_jobs=no_jobs,
|
|
65
|
+
with_samples=with_samples,
|
|
66
|
+
sample_limit=sample_limit,
|
|
67
|
+
max_samples=max_samples,
|
|
68
|
+
)
|
|
69
|
+
results[alias] = result
|
|
70
|
+
success_count += 1
|
|
71
|
+
except SyncConflictError as exc:
|
|
72
|
+
# Preserve the structured conflict so a programmatic / AI consumer of
|
|
73
|
+
# `--all-projects --json` can tell a merge conflict apart from any
|
|
74
|
+
# other error and read the conflicting configs -- the single-project
|
|
75
|
+
# path emits the same code + conflicts.
|
|
76
|
+
results[alias] = {
|
|
77
|
+
"error": exc.message,
|
|
78
|
+
"error_code": exc.error_code,
|
|
79
|
+
"conflicts": exc.conflicts,
|
|
80
|
+
}
|
|
81
|
+
failed_count += 1
|
|
82
|
+
except Exception as exc:
|
|
83
|
+
results[alias] = {"error": str(exc)}
|
|
84
|
+
failed_count += 1
|
|
85
|
+
|
|
86
|
+
max_workers = min(len(projects), service._resolve_max_workers()) if projects else 1
|
|
87
|
+
with ThreadPoolExecutor(max_workers=max_workers) as executor:
|
|
88
|
+
futures = {executor.submit(_worker, alias): alias for alias in projects}
|
|
89
|
+
for future in as_completed(futures):
|
|
90
|
+
# Exceptions are captured inside _worker; this catches truly
|
|
91
|
+
# unexpected failures (e.g. threading errors).
|
|
92
|
+
try:
|
|
93
|
+
future.result()
|
|
94
|
+
except Exception as exc:
|
|
95
|
+
alias = futures[future]
|
|
96
|
+
results[alias] = {"error": str(exc)}
|
|
97
|
+
failed_count += 1
|
|
98
|
+
|
|
99
|
+
total = len(projects)
|
|
100
|
+
return {
|
|
101
|
+
"projects": results,
|
|
102
|
+
"summary": {
|
|
103
|
+
"total": total,
|
|
104
|
+
"success": success_count,
|
|
105
|
+
"failed": failed_count,
|
|
106
|
+
},
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def diff_all(service: SyncService, base_dir: Path) -> dict[str, Any]:
|
|
111
|
+
"""Diff all registered projects that have a local manifest.
|
|
112
|
+
|
|
113
|
+
Projects without an existing manifest are skipped. Returns a dict with
|
|
114
|
+
per-project diff results, a summary, and a skipped list.
|
|
115
|
+
"""
|
|
116
|
+
projects = service.resolve_projects(None)
|
|
117
|
+
results: dict[str, Any] = {}
|
|
118
|
+
skipped: list[str] = []
|
|
119
|
+
success_count = 0
|
|
120
|
+
failed_count = 0
|
|
121
|
+
|
|
122
|
+
actionable: list[str] = []
|
|
123
|
+
for alias in projects:
|
|
124
|
+
manifest_path = base_dir / alias / KEBOOLA_DIR_NAME / "manifest.json"
|
|
125
|
+
if manifest_path.exists():
|
|
126
|
+
actionable.append(alias)
|
|
127
|
+
else:
|
|
128
|
+
skipped.append(alias)
|
|
129
|
+
|
|
130
|
+
def _worker(alias: str) -> None:
|
|
131
|
+
nonlocal success_count, failed_count
|
|
132
|
+
project_root = base_dir / alias
|
|
133
|
+
try:
|
|
134
|
+
results[alias] = service.diff(alias, project_root)
|
|
135
|
+
success_count += 1
|
|
136
|
+
except Exception as exc:
|
|
137
|
+
results[alias] = {"error": str(exc)}
|
|
138
|
+
failed_count += 1
|
|
139
|
+
|
|
140
|
+
max_workers = min(len(actionable), service._resolve_max_workers()) if actionable else 1
|
|
141
|
+
with ThreadPoolExecutor(max_workers=max_workers) as executor:
|
|
142
|
+
futures = {executor.submit(_worker, alias): alias for alias in actionable}
|
|
143
|
+
for future in as_completed(futures):
|
|
144
|
+
try:
|
|
145
|
+
future.result()
|
|
146
|
+
except Exception as exc:
|
|
147
|
+
alias = futures[future]
|
|
148
|
+
results[alias] = {"error": str(exc)}
|
|
149
|
+
failed_count += 1
|
|
150
|
+
|
|
151
|
+
total = len(projects)
|
|
152
|
+
return {
|
|
153
|
+
"projects": results,
|
|
154
|
+
"summary": {
|
|
155
|
+
"total": total,
|
|
156
|
+
"success": success_count,
|
|
157
|
+
"failed": failed_count,
|
|
158
|
+
"skipped": len(skipped),
|
|
159
|
+
},
|
|
160
|
+
"skipped": skipped,
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
def push_all(
|
|
165
|
+
service: SyncService,
|
|
166
|
+
base_dir: Path,
|
|
167
|
+
dry_run: bool = False,
|
|
168
|
+
force: bool = False,
|
|
169
|
+
allow_plaintext_fallback: bool = False,
|
|
170
|
+
) -> dict[str, Any]:
|
|
171
|
+
"""Push all registered projects that have a local manifest.
|
|
172
|
+
|
|
173
|
+
Projects without an existing manifest are skipped. Returns a dict with
|
|
174
|
+
per-project push results, a summary, and a skipped list.
|
|
175
|
+
"""
|
|
176
|
+
projects = service.resolve_projects(None)
|
|
177
|
+
results: dict[str, Any] = {}
|
|
178
|
+
skipped: list[str] = []
|
|
179
|
+
success_count = 0
|
|
180
|
+
failed_count = 0
|
|
181
|
+
|
|
182
|
+
actionable: list[str] = []
|
|
183
|
+
for alias in projects:
|
|
184
|
+
manifest_path = base_dir / alias / KEBOOLA_DIR_NAME / "manifest.json"
|
|
185
|
+
if manifest_path.exists():
|
|
186
|
+
actionable.append(alias)
|
|
187
|
+
else:
|
|
188
|
+
skipped.append(alias)
|
|
189
|
+
|
|
190
|
+
def _worker(alias: str) -> None:
|
|
191
|
+
nonlocal success_count, failed_count
|
|
192
|
+
project_root = base_dir / alias
|
|
193
|
+
try:
|
|
194
|
+
result = service.push(
|
|
195
|
+
alias,
|
|
196
|
+
project_root,
|
|
197
|
+
dry_run=dry_run,
|
|
198
|
+
force=force,
|
|
199
|
+
allow_plaintext_fallback=allow_plaintext_fallback,
|
|
200
|
+
)
|
|
201
|
+
results[alias] = result
|
|
202
|
+
success_count += 1
|
|
203
|
+
except Exception as exc:
|
|
204
|
+
results[alias] = {"error": str(exc)}
|
|
205
|
+
failed_count += 1
|
|
206
|
+
|
|
207
|
+
max_workers = min(len(actionable), service._resolve_max_workers()) if actionable else 1
|
|
208
|
+
with ThreadPoolExecutor(max_workers=max_workers) as executor:
|
|
209
|
+
futures = {executor.submit(_worker, alias): alias for alias in actionable}
|
|
210
|
+
for future in as_completed(futures):
|
|
211
|
+
try:
|
|
212
|
+
future.result()
|
|
213
|
+
except Exception as exc:
|
|
214
|
+
alias = futures[future]
|
|
215
|
+
results[alias] = {"error": str(exc)}
|
|
216
|
+
failed_count += 1
|
|
217
|
+
|
|
218
|
+
total = len(projects)
|
|
219
|
+
return {
|
|
220
|
+
"projects": results,
|
|
221
|
+
"summary": {
|
|
222
|
+
"total": total,
|
|
223
|
+
"success": success_count,
|
|
224
|
+
"failed": failed_count,
|
|
225
|
+
"skipped": len(skipped),
|
|
226
|
+
},
|
|
227
|
+
"skipped": skipped,
|
|
228
|
+
}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
"""The ``sync clone`` composite orchestration (#426).
|
|
2
|
+
|
|
3
|
+
Extracted from ``sync_service.py``. ``SyncService.clone_project`` is a thin
|
|
4
|
+
delegator to :func:`clone_project` here; the pure, client-free override helpers
|
|
5
|
+
live in ``..sync.clone``. This function only orchestrates: validate the
|
|
6
|
+
reference, copy + re-point + parameterize the tree, run the fresh-target guard,
|
|
7
|
+
and push (so push Phase C/D remaps the flow/variable links).
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
from typing import TYPE_CHECKING, Any
|
|
14
|
+
from urllib.parse import urlparse
|
|
15
|
+
|
|
16
|
+
from ..errors import ConfigError
|
|
17
|
+
from ..sync.clone import (
|
|
18
|
+
apply_bucket_map,
|
|
19
|
+
apply_instance_rename,
|
|
20
|
+
apply_variable_values,
|
|
21
|
+
copy_reference_tree,
|
|
22
|
+
repoint_manifest_project,
|
|
23
|
+
)
|
|
24
|
+
from ..sync.manifest import load_manifest, save_manifest
|
|
25
|
+
|
|
26
|
+
if TYPE_CHECKING:
|
|
27
|
+
from .sync_service import SyncService
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def clone_project(
|
|
31
|
+
service: SyncService,
|
|
32
|
+
source: str | Path,
|
|
33
|
+
target_alias: str,
|
|
34
|
+
target_dir: str | Path,
|
|
35
|
+
*,
|
|
36
|
+
overrides: dict[str, Any] | None = None,
|
|
37
|
+
dry_run: bool = False,
|
|
38
|
+
branch_override: int | None = None,
|
|
39
|
+
) -> dict[str, Any]:
|
|
40
|
+
"""Clone a reference synced project into a fresh target project (#426).
|
|
41
|
+
|
|
42
|
+
Copies the reference tree at ``source`` into ``target_dir``, applies the
|
|
43
|
+
declarative ``overrides`` (``bucket_map``, ``variable_values``,
|
|
44
|
+
``instance_rename``), re-points the manifest at ``target_alias``'s project,
|
|
45
|
+
and pushes -- so every config is CREATEd fresh and its flow task / variable
|
|
46
|
+
links are remapped reference->ULID by push Phase C/D.
|
|
47
|
+
|
|
48
|
+
Cloning into a fresh target needs no id surgery: the reference's config ids
|
|
49
|
+
do not exist in the target remote, so the diff classifies every config as
|
|
50
|
+
``added`` and ``created_id_map`` (keyed by the reference id) drives the link
|
|
51
|
+
remaps.
|
|
52
|
+
|
|
53
|
+
Idempotent: re-running with an existing ``target_dir`` skips the copy +
|
|
54
|
+
overrides and just pushes, so a clean clone then reports ``no_changes`` /
|
|
55
|
+
``created: 0``.
|
|
56
|
+
|
|
57
|
+
Args:
|
|
58
|
+
service: The owning :class:`SyncService` (for ``resolve_projects`` /
|
|
59
|
+
``diff`` / ``push``).
|
|
60
|
+
source: A reference synced project dir (must contain
|
|
61
|
+
``.keboola/manifest.json``).
|
|
62
|
+
target_alias: The project alias to clone INTO (must be a fresh project on
|
|
63
|
+
the first clone).
|
|
64
|
+
target_dir: Where to materialise the clone.
|
|
65
|
+
overrides: Optional dict with ``bucket_map`` (old->new bucket id),
|
|
66
|
+
``variable_values`` (var name->value), and ``instance_rename`` (old
|
|
67
|
+
path prefix->new path prefix) keys.
|
|
68
|
+
dry_run: Apply overrides + report the diff without pushing.
|
|
69
|
+
branch_override: Optional target branch id.
|
|
70
|
+
|
|
71
|
+
Returns:
|
|
72
|
+
A dict matching ``CloneResult``: ``status``
|
|
73
|
+
(``cloned`` | ``no_changes`` | ``dry_run``), ``target_alias``,
|
|
74
|
+
``target_dir``, ``created``, ``bucket_rewrites``, ``variable_overrides``,
|
|
75
|
+
``renamed_instances``, ``flow_task_remaps``, ``push`` (the underlying
|
|
76
|
+
push result), ``errors``.
|
|
77
|
+
|
|
78
|
+
Raises:
|
|
79
|
+
ConfigError: ``source`` is not a synced project, ``target_alias`` is
|
|
80
|
+
unknown, or (first clone) the target project already contains the
|
|
81
|
+
reference's configs (not a fresh target).
|
|
82
|
+
"""
|
|
83
|
+
overrides = overrides or {}
|
|
84
|
+
bucket_map = overrides.get("bucket_map") or {}
|
|
85
|
+
variable_values = overrides.get("variable_values") or {}
|
|
86
|
+
instance_rename = overrides.get("instance_rename") or {}
|
|
87
|
+
source_dir = Path(source)
|
|
88
|
+
target_path = Path(target_dir)
|
|
89
|
+
|
|
90
|
+
# Validate the reference is a synced project.
|
|
91
|
+
try:
|
|
92
|
+
load_manifest(source_dir)
|
|
93
|
+
except FileNotFoundError as exc:
|
|
94
|
+
raise ConfigError(
|
|
95
|
+
f"Source {source_dir} is not a synced project (no "
|
|
96
|
+
".keboola/manifest.json). Run `kbagent sync pull` there first."
|
|
97
|
+
) from exc
|
|
98
|
+
|
|
99
|
+
target_project = service.resolve_projects([target_alias])[target_alias]
|
|
100
|
+
|
|
101
|
+
bucket_rewrites = 0
|
|
102
|
+
variable_overrides = 0
|
|
103
|
+
renamed_instances = 0
|
|
104
|
+
already_cloned = target_path.exists()
|
|
105
|
+
|
|
106
|
+
if not already_cloned:
|
|
107
|
+
copy_reference_tree(source_dir, target_path)
|
|
108
|
+
manifest = load_manifest(target_path)
|
|
109
|
+
repoint_manifest_project(
|
|
110
|
+
manifest,
|
|
111
|
+
project_id=target_project.project_id or 0,
|
|
112
|
+
api_host=urlparse(target_project.stack_url).netloc,
|
|
113
|
+
)
|
|
114
|
+
bucket_rewrites = apply_bucket_map(target_path, manifest, bucket_map)
|
|
115
|
+
variable_overrides = apply_variable_values(target_path, manifest, variable_values)
|
|
116
|
+
renamed_instances = apply_instance_rename(target_path, manifest, instance_rename)
|
|
117
|
+
save_manifest(target_path, manifest)
|
|
118
|
+
|
|
119
|
+
override_counts = {
|
|
120
|
+
"bucket_rewrites": bucket_rewrites,
|
|
121
|
+
"variable_overrides": variable_overrides,
|
|
122
|
+
"renamed_instances": renamed_instances,
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
if dry_run:
|
|
126
|
+
diff_result = service.diff(target_alias, target_path, branch_override=branch_override)
|
|
127
|
+
return {
|
|
128
|
+
"status": "dry_run",
|
|
129
|
+
"target_alias": target_alias,
|
|
130
|
+
"target_dir": str(target_path),
|
|
131
|
+
"summary": diff_result["summary"],
|
|
132
|
+
**override_counts,
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
# Fresh-target guard: on a first clone every one of OUR configs must be a
|
|
136
|
+
# CREATE. A non-'added' change means a reference id already exists in the
|
|
137
|
+
# target -> not a fresh target; refuse rather than UPDATE a stranger's config.
|
|
138
|
+
if not already_cloned:
|
|
139
|
+
diff_result = service.diff(target_alias, target_path, branch_override=branch_override)
|
|
140
|
+
collisions = [
|
|
141
|
+
f"{c.get('component_id')}/{c.get('config_id')}"
|
|
142
|
+
for c in diff_result["changes"]
|
|
143
|
+
if c["change_type"] != "added"
|
|
144
|
+
]
|
|
145
|
+
if collisions:
|
|
146
|
+
raise ConfigError(
|
|
147
|
+
"Clone requires a fresh target project, but these configs already "
|
|
148
|
+
f"exist there: {', '.join(collisions[:10])}. Use a new/empty target "
|
|
149
|
+
"project, or remove the existing configs first."
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
push_result = service.push(target_alias, target_path, branch_override=branch_override)
|
|
153
|
+
status = "no_changes" if push_result.get("status") == "no_changes" else "cloned"
|
|
154
|
+
return {
|
|
155
|
+
"status": status,
|
|
156
|
+
"target_alias": target_alias,
|
|
157
|
+
"target_dir": str(target_path),
|
|
158
|
+
"created": push_result.get("created", 0),
|
|
159
|
+
"flow_task_remaps": push_result.get("flow_task_remaps", 0),
|
|
160
|
+
"push": push_result,
|
|
161
|
+
"errors": push_result.get("errors", []),
|
|
162
|
+
**override_counts,
|
|
163
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"""Shared dataclasses + component-id constants for the sync service.
|
|
2
|
+
|
|
3
|
+
Extracted from ``sync_service.py`` (which had grown to ~4000 lines, far past the
|
|
4
|
+
1500-LOC ceiling) so the binding helpers in ``_sync_bindings.py`` can import them
|
|
5
|
+
without a circular import. ``sync_service`` re-exports the names that external
|
|
6
|
+
callers/tests rely on (e.g. ``CreatedConfig``), so the public surface is
|
|
7
|
+
unchanged.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
from dataclasses import dataclass, field
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
|
|
15
|
+
from ..sync.manifest import ManifestConfiguration
|
|
16
|
+
|
|
17
|
+
# Sibling component that backs a transformation's variable links. A
|
|
18
|
+
# transformation references it via ``configuration.variables_id`` (the config)
|
|
19
|
+
# and ``configuration.variables_values_id`` (a row id).
|
|
20
|
+
VARIABLES_COMPONENT_ID = "keboola.variables"
|
|
21
|
+
|
|
22
|
+
# Conditional-flow component. A flow runs other configs via
|
|
23
|
+
# ``configuration.tasks[].task.configId`` (job-type tasks); the Phase-D backfill
|
|
24
|
+
# remaps those ids placeholder/source -> ULID after a fresh create (e.g. clone).
|
|
25
|
+
FLOW_COMPONENT_ID = "keboola.flow"
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@dataclass
|
|
29
|
+
class WritebackResult:
|
|
30
|
+
"""Outcome of recording a freshly-created config in the manifest.
|
|
31
|
+
|
|
32
|
+
``previous_id`` is the manifest entry's id **before** the placeholder ->
|
|
33
|
+
ULID overwrite (empty string when a brand-new entry was appended). The
|
|
34
|
+
create pass uses it to key ``created_id_map`` so row parents and
|
|
35
|
+
transformation variable links can be remapped placeholder -> ULID.
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
entry: ManifestConfiguration
|
|
39
|
+
previous_id: str
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
@dataclass
|
|
43
|
+
class CreatedConfig:
|
|
44
|
+
"""A config created during a single ``push`` create pass.
|
|
45
|
+
|
|
46
|
+
Carries just enough to drive the Phase-C variable-link backfill: the
|
|
47
|
+
component id, the API-assigned ULID, and the on-disk directory holding
|
|
48
|
+
the (post-writeback) ``_config.yml``.
|
|
49
|
+
"""
|
|
50
|
+
|
|
51
|
+
component_id: str
|
|
52
|
+
config_id: str
|
|
53
|
+
config_dir: Path
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
@dataclass
|
|
57
|
+
class VariableBindingResult:
|
|
58
|
+
"""Outcome of the Phase-C variable-link backfill.
|
|
59
|
+
|
|
60
|
+
``configs_rewritten`` counts transformations whose remote configuration +
|
|
61
|
+
local ``_configuration_extra`` were rebound to ULIDs (drives the
|
|
62
|
+
manifest-dirty flag). ``errors`` accumulates unresolved links so the push
|
|
63
|
+
envelope surfaces them instead of leaving a broken link silently.
|
|
64
|
+
"""
|
|
65
|
+
|
|
66
|
+
errors: list[dict[str, str]] = field(default_factory=list)
|
|
67
|
+
configs_rewritten: int = 0
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
@dataclass
|
|
71
|
+
class FlowBindingResult:
|
|
72
|
+
"""Outcome of the Phase-D flow-task-link backfill (#426).
|
|
73
|
+
|
|
74
|
+
``configs_rewritten`` counts flows whose task ``configId``s were remapped to
|
|
75
|
+
ULIDs (drives the manifest-dirty flag); ``tasks_remapped`` is the total task
|
|
76
|
+
references rewritten; ``errors`` accumulates PUT failures so the push
|
|
77
|
+
envelope surfaces them.
|
|
78
|
+
"""
|
|
79
|
+
|
|
80
|
+
errors: list[dict[str, str]] = field(default_factory=list)
|
|
81
|
+
configs_rewritten: int = 0
|
|
82
|
+
tasks_remapped: int = 0
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
@dataclass
|
|
86
|
+
class LocalConfigHashes:
|
|
87
|
+
"""Hashes describing a config dir's on-disk state after a push.
|
|
88
|
+
|
|
89
|
+
``file_hash`` is the ``_config.yml`` content hash, ``cfg_hash`` the
|
|
90
|
+
normalized config hash (see :func:`config_hash`), and ``extra_hashes``
|
|
91
|
+
maps each extracted code/companion file to its hash. Stored on the
|
|
92
|
+
manifest entry so the next ``sync diff`` recognises local == remote.
|
|
93
|
+
"""
|
|
94
|
+
|
|
95
|
+
file_hash: str
|
|
96
|
+
cfg_hash: str
|
|
97
|
+
extra_hashes: dict[str, str] = field(default_factory=dict)
|