Flowfile 0.5.1__py3-none-any.whl → 0.5.3__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.
- build_backends/main.py +25 -22
- build_backends/main_prd.py +10 -19
- flowfile/__init__.py +178 -74
- flowfile/__main__.py +10 -7
- flowfile/api.py +51 -57
- flowfile/web/__init__.py +14 -9
- flowfile/web/static/assets/AdminView-49392a9a.js +713 -0
- flowfile/web/static/assets/AdminView-f53bad23.css +129 -0
- flowfile/web/static/assets/CloudConnectionView-36bcd6df.css +72 -0
- flowfile/web/static/assets/{CloudConnectionManager-0dfba9f2.js → CloudConnectionView-f13f202b.js} +11 -11
- flowfile/web/static/assets/{CloudStorageReader-d5b1b6c9.js → CloudStorageReader-0023d4a5.js} +10 -8
- flowfile/web/static/assets/{CloudStorageReader-29d14fcc.css → CloudStorageReader-24c54524.css} +27 -27
- flowfile/web/static/assets/{CloudStorageWriter-b0ee067f.css → CloudStorageWriter-60547855.css} +26 -26
- flowfile/web/static/assets/{CloudStorageWriter-00d87aad.js → CloudStorageWriter-8e781e11.js} +10 -8
- flowfile/web/static/assets/{ColumnSelector-47996a16.css → ColumnSelector-371637fb.css} +2 -2
- flowfile/web/static/assets/{ColumnSelector-4685e75d.js → ColumnSelector-8ad68ea9.js} +3 -5
- flowfile/web/static/assets/{ContextMenu-c13f91d0.css → ContextMenu-26d4dd27.css} +6 -6
- flowfile/web/static/assets/{ContextMenu-23e909da.js → ContextMenu-31ee57f0.js} +3 -3
- flowfile/web/static/assets/{ContextMenu-70ae0c79.js → ContextMenu-69a74055.js} +3 -3
- flowfile/web/static/assets/{ContextMenu-f149cf7c.js → ContextMenu-8e2051c6.js} +3 -3
- flowfile/web/static/assets/{ContextMenu-4c74eef1.css → ContextMenu-8ec1729e.css} +6 -6
- flowfile/web/static/assets/{ContextMenu-63cfa99b.css → ContextMenu-9b310c60.css} +6 -6
- flowfile/web/static/assets/{CrossJoin-702a3edd.js → CrossJoin-03df6938.js} +12 -10
- flowfile/web/static/assets/{CrossJoin-1119d18e.css → CrossJoin-71b4cc10.css} +20 -20
- flowfile/web/static/assets/CustomNode-59e99a86.css +32 -0
- flowfile/web/static/assets/{CustomNode-b1519993.js → CustomNode-8479239b.js} +36 -24
- flowfile/web/static/assets/{DatabaseConnectionSettings-6f3e4ea5.js → DatabaseConnectionSettings-869e3efd.js} +5 -4
- flowfile/web/static/assets/{DatabaseConnectionSettings-0c04b2e5.css → DatabaseConnectionSettings-e91df89a.css} +13 -13
- flowfile/web/static/assets/{DatabaseReader-ae61773c.css → DatabaseReader-36898a00.css} +24 -24
- flowfile/web/static/assets/{DatabaseReader-d38c7295.js → DatabaseReader-c58b9552.js} +25 -15
- flowfile/web/static/assets/DatabaseView-6655afd6.css +57 -0
- flowfile/web/static/assets/{DatabaseManager-cf5ef661.js → DatabaseView-d26a9140.js} +11 -11
- flowfile/web/static/assets/{DatabaseWriter-2f570e53.css → DatabaseWriter-217a99f1.css} +19 -19
- flowfile/web/static/assets/{DatabaseWriter-b04ef46a.js → DatabaseWriter-4d05ddc7.js} +17 -10
- flowfile/web/static/assets/{designer-8da3ba3a.css → DesignerView-a6d0ee84.css} +614 -546
- flowfile/web/static/assets/{designer-9633482a.js → DesignerView-e6f5c0e8.js} +1107 -3170
- flowfile/web/static/assets/{documentation-ca400224.js → DocumentationView-2e78ef1b.js} +5 -5
- flowfile/web/static/assets/{documentation-12216a74.css → DocumentationView-fd46c656.css} +7 -7
- flowfile/web/static/assets/{ExploreData-2d0cf4db.css → ExploreData-10c5acc8.css} +13 -12
- flowfile/web/static/assets/{ExploreData-5fa10ed8.js → ExploreData-7b54caca.js} +18 -9
- flowfile/web/static/assets/{ExternalSource-d39af878.js → ExternalSource-3fa399b2.js} +9 -7
- flowfile/web/static/assets/{ExternalSource-e37b6275.css → ExternalSource-47ab05a3.css} +17 -17
- flowfile/web/static/assets/Filter-7494ea97.css +48 -0
- flowfile/web/static/assets/Filter-8cbbdbf3.js +287 -0
- flowfile/web/static/assets/{Formula-bb96803d.css → Formula-53d58c43.css} +7 -7
- flowfile/web/static/assets/{Formula-6b04fb1d.js → Formula-aac42b1e.js} +13 -11
- flowfile/web/static/assets/{FuzzyMatch-1010f966.css → FuzzyMatch-ad6361d6.css} +68 -69
- flowfile/web/static/assets/{FuzzyMatch-999521f4.js → FuzzyMatch-cd9bbfca.js} +12 -10
- flowfile/web/static/assets/{Pivot-cf333e3d.css → GraphSolver-c24dec17.css} +5 -5
- flowfile/web/static/assets/{GraphSolver-17dd2198.js → GraphSolver-c7e6780e.js} +13 -11
- flowfile/web/static/assets/{GroupBy-6b039e18.js → GroupBy-93c5d22b.js} +9 -7
- flowfile/web/static/assets/{GroupBy-b9505323.css → GroupBy-be7ac0bf.css} +10 -10
- flowfile/web/static/assets/{Join-fd79b451.css → Join-28b5e18f.css} +22 -22
- flowfile/web/static/assets/{Join-24d0f113.js → Join-a19b2de2.js} +13 -11
- flowfile/web/static/assets/LoginView-0df4ed0a.js +134 -0
- flowfile/web/static/assets/LoginView-d325d632.css +172 -0
- flowfile/web/static/assets/ManualInput-3702e677.css +293 -0
- flowfile/web/static/assets/{ManualInput-34639209.js → ManualInput-8d3374b2.js} +170 -116
- flowfile/web/static/assets/{MultiSelect-0e8724a3.js → MultiSelect-ad1b6243.js} +2 -2
- flowfile/web/static/assets/{MultiSelect.vue_vue_type_script_setup_true_lang-b0e538c2.js → MultiSelect.vue_vue_type_script_setup_true_lang-e278950d.js} +1 -1
- flowfile/web/static/assets/NodeDesigner-40b647c9.js +2610 -0
- flowfile/web/static/assets/NodeDesigner-5f53be3f.css +1429 -0
- flowfile/web/static/assets/{NumericInput-3d63a470.js → NumericInput-7100234c.js} +2 -2
- flowfile/web/static/assets/{NumericInput.vue_vue_type_script_setup_true_lang-e0edeccc.js → NumericInput.vue_vue_type_script_setup_true_lang-5130219f.js} +5 -2
- flowfile/web/static/assets/{Output-283fe388.css → Output-35e97000.css} +6 -6
- flowfile/web/static/assets/{Output-edea9802.js → Output-f5efd2aa.js} +12 -9
- flowfile/web/static/assets/{GraphSolver-f0cb7bfb.css → Pivot-0eda81b4.css} +5 -5
- flowfile/web/static/assets/{Pivot-61d19301.js → Pivot-d981d23c.js} +11 -9
- flowfile/web/static/assets/PivotValidation-0e905b1a.css +13 -0
- flowfile/web/static/assets/{PivotValidation-f97fec5b.js → PivotValidation-39386e95.js} +3 -3
- flowfile/web/static/assets/PivotValidation-41b57ad6.css +13 -0
- flowfile/web/static/assets/{PivotValidation-de9f43fe.js → PivotValidation-63de1f73.js} +3 -3
- flowfile/web/static/assets/{PolarsCode-650322d1.css → PolarsCode-2b1f1f23.css} +4 -4
- flowfile/web/static/assets/{PolarsCode-bc3c9984.js → PolarsCode-f9d69217.js} +18 -9
- flowfile/web/static/assets/PopOver-b22f049e.js +939 -0
- flowfile/web/static/assets/PopOver-d96599db.css +33 -0
- flowfile/web/static/assets/{Read-e808b239.css → Read-36e7bd51.css} +12 -12
- flowfile/web/static/assets/{Read-64a3f259.js → Read-aec2e377.js} +14 -11
- flowfile/web/static/assets/{RecordCount-3d5039be.js → RecordCount-78ed6845.js} +6 -4
- flowfile/web/static/assets/{RecordId-597510e0.js → RecordId-2156e890.js} +8 -6
- flowfile/web/static/assets/{SQLQueryComponent-36cef432.css → SQLQueryComponent-1c2f26b4.css} +5 -5
- flowfile/web/static/assets/{SQLQueryComponent-df51adbe.js → SQLQueryComponent-48c72f5b.js} +3 -3
- flowfile/web/static/assets/{Sample-4be0a507.js → Sample-1352ca74.js} +6 -4
- flowfile/web/static/assets/SecretSelector-22b5ff89.js +113 -0
- flowfile/web/static/assets/SecretSelector-6329f743.css +43 -0
- flowfile/web/static/assets/{SecretManager-4839be57.js → SecretsView-17df66ee.js} +35 -36
- flowfile/web/static/assets/SecretsView-aa291340.css +38 -0
- flowfile/web/static/assets/{Select-9b72f201.js → Select-0aee4c54.js} +9 -7
- flowfile/web/static/assets/{SettingsSection-f0f75a42.js → SettingsSection-0784e157.js} +3 -3
- flowfile/web/static/assets/{SettingsSection-71e6b7e3.css → SettingsSection-07fbbc39.css} +4 -4
- flowfile/web/static/assets/{SettingsSection-5c696bee.css → SettingsSection-26fe48d4.css} +4 -4
- flowfile/web/static/assets/{SettingsSection-2e4d03c4.css → SettingsSection-8f980839.css} +4 -4
- flowfile/web/static/assets/{SettingsSection-e1e9c953.js → SettingsSection-cd341bb6.js} +3 -3
- flowfile/web/static/assets/{SettingsSection-7ded385d.js → SettingsSection-f2002a6d.js} +3 -3
- flowfile/web/static/assets/{SingleSelect-6c777aac.js → SingleSelect-460cc0ea.js} +2 -2
- flowfile/web/static/assets/{SingleSelect.vue_vue_type_script_setup_true_lang-33e3ff9b.js → SingleSelect.vue_vue_type_script_setup_true_lang-30741bb2.js} +1 -1
- flowfile/web/static/assets/{SliderInput-7cb93e62.js → SliderInput-5d926864.js} +7 -4
- flowfile/web/static/assets/SliderInput-f2e4f23c.css +4 -0
- flowfile/web/static/assets/{Sort-6cbde21a.js → Sort-3cdc971b.js} +9 -7
- flowfile/web/static/assets/{Unique-f9fb0809.css → Sort-8a871341.css} +10 -10
- flowfile/web/static/assets/{TextInput-d9a40c11.js → TextInput-a2d0bfbd.js} +2 -2
- flowfile/web/static/assets/{TextInput.vue_vue_type_script_setup_true_lang-5896c375.js → TextInput.vue_vue_type_script_setup_true_lang-abad1ca2.js} +5 -2
- flowfile/web/static/assets/{TextToRows-5d2c1190.css → TextToRows-12afb4f4.css} +10 -10
- flowfile/web/static/assets/{TextToRows-c4fcbf4d.js → TextToRows-918945f7.js} +11 -10
- flowfile/web/static/assets/{ToggleSwitch-4ef91d19.js → ToggleSwitch-f0ef5196.js} +2 -2
- flowfile/web/static/assets/{ToggleSwitch.vue_vue_type_script_setup_true_lang-38478c20.js → ToggleSwitch.vue_vue_type_script_setup_true_lang-5605c793.js} +1 -1
- flowfile/web/static/assets/{UnavailableFields-5edd5322.css → UnavailableFields-54d2f518.css} +6 -6
- flowfile/web/static/assets/{UnavailableFields-a03f512c.js → UnavailableFields-bdad6144.js} +4 -4
- flowfile/web/static/assets/{Union-af6c3d9b.css → Union-d6a8d7d5.css} +7 -7
- flowfile/web/static/assets/{Union-bfe9b996.js → Union-e8ab8c86.js} +8 -6
- flowfile/web/static/assets/{Unique-5d023a27.js → Unique-8cd4f976.js} +13 -10
- flowfile/web/static/assets/{Sort-3643d625.css → Unique-9fb2f567.css} +10 -10
- flowfile/web/static/assets/{Unpivot-1e422df3.css → Unpivot-710a2948.css} +7 -7
- flowfile/web/static/assets/{Unpivot-91cc5354.js → Unpivot-8da14095.js} +10 -8
- flowfile/web/static/assets/{UnpivotValidation-7ee2de44.js → UnpivotValidation-6f7d89ff.js} +3 -3
- flowfile/web/static/assets/UnpivotValidation-d5ca3b7b.css +13 -0
- flowfile/web/static/assets/{VueGraphicWalker-e51b9924.js → VueGraphicWalker-3fb312e1.js} +4 -4
- flowfile/web/static/assets/{VueGraphicWalker-ed5ab88b.css → VueGraphicWalker-430f0b86.css} +1 -1
- flowfile/web/static/assets/{api-cf1221f0.js → api-24483f0d.js} +1 -1
- flowfile/web/static/assets/{api-c1bad5ca.js → api-8b81fa73.js} +1 -1
- flowfile/web/static/assets/{dropDown-35135ba8.css → dropDown-3d8dc5fa.css} +40 -40
- flowfile/web/static/assets/{dropDown-614b998d.js → dropDown-ac0fda9d.js} +3 -3
- flowfile/web/static/assets/{fullEditor-f7971590.js → fullEditor-5497a84a.js} +11 -10
- flowfile/web/static/assets/{fullEditor-178376bb.css → fullEditor-a0be62b3.css} +74 -62
- flowfile/web/static/assets/{genericNodeSettings-924759c7.css → genericNodeSettings-3b2507ea.css} +10 -10
- flowfile/web/static/assets/{genericNodeSettings-4fe5f36b.js → genericNodeSettings-99014e1d.js} +5 -5
- flowfile/web/static/assets/index-07dda503.js +38 -0
- flowfile/web/static/assets/index-3ba44389.js +2696 -0
- flowfile/web/static/assets/{index-50508d4d.css → index-e6289dd0.css} +1945 -569
- flowfile/web/static/assets/{index-5429bbf8.js → index-fb6493ae.js} +41626 -40867
- flowfile/web/static/assets/node.types-2c15bb7e.js +82 -0
- flowfile/web/static/assets/nodeInput-0eb13f1a.js +2 -0
- flowfile/web/static/assets/{outputCsv-076b85ab.js → outputCsv-8f8ba42d.js} +3 -3
- flowfile/web/static/assets/outputCsv-b9a072af.css +2499 -0
- flowfile/web/static/assets/{outputExcel-0fd17dbe.js → outputExcel-393f4fef.js} +3 -3
- flowfile/web/static/assets/{outputExcel-b41305c0.css → outputExcel-f5d272b2.css} +26 -26
- flowfile/web/static/assets/{outputParquet-b61e0847.js → outputParquet-07c81f65.js} +4 -4
- flowfile/web/static/assets/outputParquet-54597c3c.css +4 -0
- flowfile/web/static/assets/{readCsv-a8bb8b61.js → readCsv-07f6d9ad.js} +3 -3
- flowfile/web/static/assets/{readCsv-c767cb37.css → readCsv-3bfac4c3.css} +15 -15
- flowfile/web/static/assets/{readExcel-806d2826.css → readExcel-3db6b763.css} +13 -13
- flowfile/web/static/assets/{readExcel-67b4aee0.js → readExcel-ed69bc8f.js} +5 -5
- flowfile/web/static/assets/{readParquet-48c81530.css → readParquet-c5244ad5.css} +4 -4
- flowfile/web/static/assets/{readParquet-92ce1dbc.js → readParquet-e3ed4528.js} +3 -3
- flowfile/web/static/assets/secrets.api-002e7d7e.js +65 -0
- flowfile/web/static/assets/{selectDynamic-92e25ee3.js → selectDynamic-80b92899.js} +5 -5
- flowfile/web/static/assets/{selectDynamic-aa913ff4.css → selectDynamic-f2fb394f.css} +21 -20
- flowfile/web/static/assets/{vue-codemirror.esm-41b0e0d7.js → vue-codemirror.esm-0965f39f.js} +31 -640
- flowfile/web/static/assets/{vue-content-loader.es-2c8e608f.js → vue-content-loader.es-c506ad97.js} +1 -1
- flowfile/web/static/index.html +2 -2
- {flowfile-0.5.1.dist-info → flowfile-0.5.3.dist-info}/METADATA +2 -3
- flowfile-0.5.3.dist-info/RECORD +402 -0
- flowfile_core/__init__.py +13 -6
- flowfile_core/auth/jwt.py +51 -16
- flowfile_core/auth/models.py +32 -7
- flowfile_core/auth/password.py +89 -0
- flowfile_core/auth/secrets.py +8 -6
- flowfile_core/configs/__init__.py +9 -7
- flowfile_core/configs/flow_logger.py +15 -14
- flowfile_core/configs/node_store/__init__.py +72 -4
- flowfile_core/configs/node_store/nodes.py +155 -172
- flowfile_core/configs/node_store/user_defined_node_registry.py +108 -27
- flowfile_core/configs/settings.py +28 -15
- flowfile_core/database/connection.py +7 -6
- flowfile_core/database/init_db.py +96 -2
- flowfile_core/database/models.py +3 -1
- flowfile_core/fileExplorer/__init__.py +17 -0
- flowfile_core/fileExplorer/funcs.py +123 -57
- flowfile_core/fileExplorer/utils.py +10 -11
- flowfile_core/flowfile/_extensions/real_time_interface.py +10 -8
- flowfile_core/flowfile/analytics/analytics_processor.py +26 -24
- flowfile_core/flowfile/analytics/graphic_walker.py +11 -12
- flowfile_core/flowfile/analytics/utils.py +1 -1
- flowfile_core/flowfile/code_generator/code_generator.py +358 -244
- flowfile_core/flowfile/connection_manager/_connection_manager.py +6 -5
- flowfile_core/flowfile/connection_manager/models.py +1 -1
- flowfile_core/flowfile/database_connection_manager/db_connections.py +60 -44
- flowfile_core/flowfile/database_connection_manager/models.py +1 -1
- flowfile_core/flowfile/extensions.py +17 -12
- flowfile_core/flowfile/flow_data_engine/cloud_storage_reader.py +34 -32
- flowfile_core/flowfile/flow_data_engine/create/funcs.py +115 -83
- flowfile_core/flowfile/flow_data_engine/flow_data_engine.py +481 -423
- flowfile_core/flowfile/flow_data_engine/flow_file_column/interface.py +2 -2
- flowfile_core/flowfile/flow_data_engine/flow_file_column/main.py +92 -52
- flowfile_core/flowfile/flow_data_engine/flow_file_column/polars_type.py +12 -11
- flowfile_core/flowfile/flow_data_engine/flow_file_column/type_registry.py +6 -6
- flowfile_core/flowfile/flow_data_engine/flow_file_column/utils.py +26 -30
- flowfile_core/flowfile/flow_data_engine/fuzzy_matching/prepare_for_fuzzy_match.py +31 -20
- flowfile_core/flowfile/flow_data_engine/join/__init__.py +1 -1
- flowfile_core/flowfile/flow_data_engine/join/utils.py +11 -9
- flowfile_core/flowfile/flow_data_engine/join/verify_integrity.py +14 -15
- flowfile_core/flowfile/flow_data_engine/pivot_table.py +5 -7
- flowfile_core/flowfile/flow_data_engine/polars_code_parser.py +95 -82
- flowfile_core/flowfile/flow_data_engine/read_excel_tables.py +66 -65
- flowfile_core/flowfile/flow_data_engine/sample_data.py +27 -21
- flowfile_core/flowfile/flow_data_engine/subprocess_operations/__init__.py +1 -1
- flowfile_core/flowfile/flow_data_engine/subprocess_operations/models.py +13 -11
- flowfile_core/flowfile/flow_data_engine/subprocess_operations/subprocess_operations.py +190 -127
- flowfile_core/flowfile/flow_data_engine/threaded_processes.py +8 -8
- flowfile_core/flowfile/flow_data_engine/utils.py +99 -67
- flowfile_core/flowfile/flow_graph.py +918 -571
- flowfile_core/flowfile/flow_graph_utils.py +31 -49
- flowfile_core/flowfile/flow_node/flow_node.py +330 -233
- flowfile_core/flowfile/flow_node/models.py +53 -41
- flowfile_core/flowfile/flow_node/schema_callback.py +14 -19
- flowfile_core/flowfile/graph_tree/graph_tree.py +41 -41
- flowfile_core/flowfile/handler.py +80 -30
- flowfile_core/flowfile/manage/compatibility_enhancements.py +209 -126
- flowfile_core/flowfile/manage/io_flowfile.py +54 -57
- flowfile_core/flowfile/node_designer/__init__.py +15 -13
- flowfile_core/flowfile/node_designer/_type_registry.py +34 -37
- flowfile_core/flowfile/node_designer/custom_node.py +162 -36
- flowfile_core/flowfile/node_designer/ui_components.py +135 -34
- flowfile_core/flowfile/schema_callbacks.py +71 -51
- flowfile_core/flowfile/setting_generator/__init__.py +0 -1
- flowfile_core/flowfile/setting_generator/setting_generator.py +6 -5
- flowfile_core/flowfile/setting_generator/settings.py +64 -53
- flowfile_core/flowfile/sources/external_sources/base_class.py +12 -10
- flowfile_core/flowfile/sources/external_sources/custom_external_sources/external_source.py +27 -17
- flowfile_core/flowfile/sources/external_sources/custom_external_sources/sample_users.py +9 -9
- flowfile_core/flowfile/sources/external_sources/factory.py +0 -1
- flowfile_core/flowfile/sources/external_sources/sql_source/models.py +45 -31
- flowfile_core/flowfile/sources/external_sources/sql_source/sql_source.py +198 -73
- flowfile_core/flowfile/sources/external_sources/sql_source/utils.py +250 -196
- flowfile_core/flowfile/util/calculate_layout.py +9 -13
- flowfile_core/flowfile/util/execution_orderer.py +25 -17
- flowfile_core/flowfile/util/node_skipper.py +4 -4
- flowfile_core/flowfile/utils.py +19 -21
- flowfile_core/main.py +26 -19
- flowfile_core/routes/auth.py +284 -11
- flowfile_core/routes/cloud_connections.py +25 -25
- flowfile_core/routes/logs.py +21 -29
- flowfile_core/routes/public.py +3 -3
- flowfile_core/routes/routes.py +70 -34
- flowfile_core/routes/secrets.py +25 -27
- flowfile_core/routes/user_defined_components.py +483 -4
- flowfile_core/run_lock.py +0 -1
- flowfile_core/schemas/__init__.py +4 -6
- flowfile_core/schemas/analysis_schemas/graphic_walker_schemas.py +55 -55
- flowfile_core/schemas/cloud_storage_schemas.py +59 -53
- flowfile_core/schemas/input_schema.py +231 -144
- flowfile_core/schemas/output_model.py +49 -34
- flowfile_core/schemas/schemas.py +116 -89
- flowfile_core/schemas/transform_schema.py +518 -263
- flowfile_core/schemas/yaml_types.py +21 -7
- flowfile_core/secret_manager/secret_manager.py +17 -13
- flowfile_core/types.py +29 -9
- flowfile_core/utils/arrow_reader.py +7 -6
- flowfile_core/utils/excel_file_manager.py +3 -3
- flowfile_core/utils/fileManager.py +7 -7
- flowfile_core/utils/fl_executor.py +8 -10
- flowfile_core/utils/utils.py +4 -4
- flowfile_core/utils/validate_setup.py +5 -4
- flowfile_frame/__init__.py +106 -51
- flowfile_frame/adapters.py +2 -9
- flowfile_frame/adding_expr.py +73 -32
- flowfile_frame/cloud_storage/frame_helpers.py +27 -23
- flowfile_frame/cloud_storage/secret_manager.py +12 -26
- flowfile_frame/config.py +2 -5
- flowfile_frame/expr.py +311 -218
- flowfile_frame/expr.pyi +160 -159
- flowfile_frame/expr_name.py +23 -23
- flowfile_frame/flow_frame.py +571 -476
- flowfile_frame/flow_frame.pyi +123 -104
- flowfile_frame/flow_frame_methods.py +227 -246
- flowfile_frame/group_frame.py +50 -20
- flowfile_frame/join.py +2 -2
- flowfile_frame/lazy.py +129 -87
- flowfile_frame/lazy_methods.py +83 -30
- flowfile_frame/list_name_space.py +55 -50
- flowfile_frame/selectors.py +148 -68
- flowfile_frame/series.py +9 -7
- flowfile_frame/utils.py +19 -21
- flowfile_worker/__init__.py +12 -7
- flowfile_worker/configs.py +11 -19
- flowfile_worker/create/__init__.py +14 -9
- flowfile_worker/create/funcs.py +114 -77
- flowfile_worker/create/models.py +46 -43
- flowfile_worker/create/pl_types.py +14 -15
- flowfile_worker/create/read_excel_tables.py +34 -41
- flowfile_worker/create/utils.py +22 -19
- flowfile_worker/external_sources/s3_source/main.py +18 -51
- flowfile_worker/external_sources/s3_source/models.py +34 -27
- flowfile_worker/external_sources/sql_source/main.py +8 -5
- flowfile_worker/external_sources/sql_source/models.py +13 -9
- flowfile_worker/flow_logger.py +10 -8
- flowfile_worker/funcs.py +214 -155
- flowfile_worker/main.py +11 -17
- flowfile_worker/models.py +35 -28
- flowfile_worker/process_manager.py +2 -3
- flowfile_worker/routes.py +121 -90
- flowfile_worker/secrets.py +9 -6
- flowfile_worker/spawner.py +80 -49
- flowfile_worker/utils.py +3 -2
- shared/__init__.py +2 -7
- shared/storage_config.py +25 -13
- test_utils/postgres/commands.py +3 -2
- test_utils/postgres/fixtures.py +9 -9
- test_utils/s3/commands.py +1 -1
- test_utils/s3/data_generator.py +3 -4
- test_utils/s3/demo_data_generator.py +4 -7
- test_utils/s3/fixtures.py +7 -5
- tools/migrate/__init__.py +1 -1
- tools/migrate/__main__.py +16 -29
- tools/migrate/legacy_schemas.py +251 -190
- tools/migrate/migrate.py +193 -181
- tools/migrate/tests/conftest.py +1 -3
- tools/migrate/tests/test_migrate.py +36 -41
- tools/migrate/tests/test_migration_e2e.py +28 -29
- tools/migrate/tests/test_node_migrations.py +50 -20
- flowfile/web/static/assets/CloudConnectionManager-2dfdce2f.css +0 -86
- flowfile/web/static/assets/CustomNode-74a37f74.css +0 -32
- flowfile/web/static/assets/DatabaseManager-30fa27e5.css +0 -64
- flowfile/web/static/assets/Filter-9b6d08db.js +0 -164
- flowfile/web/static/assets/Filter-f62091b3.css +0 -20
- flowfile/web/static/assets/ManualInput-3246a08d.css +0 -96
- flowfile/web/static/assets/PivotValidation-891ddfb0.css +0 -13
- flowfile/web/static/assets/PivotValidation-c46cd420.css +0 -13
- flowfile/web/static/assets/SliderInput-b8fb6a8c.css +0 -4
- flowfile/web/static/assets/UnpivotValidation-0d240eeb.css +0 -13
- flowfile/web/static/assets/nodeInput-5d0d6b79.js +0 -41
- flowfile/web/static/assets/outputCsv-9cc59e0b.css +0 -2499
- flowfile/web/static/assets/outputParquet-cf8cf3f2.css +0 -4
- flowfile/web/static/assets/secretApi-68435402.js +0 -46
- flowfile/web/static/assets/vue-codemirror-bccfde04.css +0 -32
- flowfile-0.5.1.dist-info/RECORD +0 -388
- {flowfile-0.5.1.dist-info → flowfile-0.5.3.dist-info}/WHEEL +0 -0
- {flowfile-0.5.1.dist-info → flowfile-0.5.3.dist-info}/entry_points.txt +0 -0
- {flowfile-0.5.1.dist-info → flowfile-0.5.3.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,47 +1,52 @@
|
|
|
1
|
-
from typing import List, Dict, Optional, Any, Literal
|
|
2
|
-
from pydantic import BaseModel, Field
|
|
3
|
-
from datetime import datetime
|
|
4
1
|
import time
|
|
2
|
+
from datetime import datetime
|
|
3
|
+
from typing import Any, Literal
|
|
4
|
+
|
|
5
|
+
from pydantic import BaseModel, Field
|
|
5
6
|
|
|
6
7
|
|
|
7
8
|
class NodeResult(BaseModel):
|
|
8
9
|
"""Represents the execution result of a single node in a FlowGraph run."""
|
|
10
|
+
|
|
9
11
|
node_id: int
|
|
10
|
-
node_name:
|
|
12
|
+
node_name: str | None = None
|
|
11
13
|
start_timestamp: float = Field(default_factory=time.time)
|
|
12
14
|
end_timestamp: float = 0
|
|
13
|
-
success:
|
|
14
|
-
error: str =
|
|
15
|
+
success: bool | None = None
|
|
16
|
+
error: str = ""
|
|
15
17
|
run_time: int = -1
|
|
16
18
|
is_running: bool = True
|
|
17
19
|
|
|
18
20
|
|
|
19
21
|
class RunInformation(BaseModel):
|
|
20
22
|
"""Contains summary information about a complete FlowGraph execution."""
|
|
23
|
+
|
|
21
24
|
flow_id: int
|
|
22
|
-
start_time:
|
|
23
|
-
end_time:
|
|
24
|
-
success:
|
|
25
|
+
start_time: datetime | None = Field(default_factory=datetime.now)
|
|
26
|
+
end_time: datetime | None = None
|
|
27
|
+
success: bool | None = None
|
|
25
28
|
nodes_completed: int = 0
|
|
26
29
|
number_of_nodes: int = 0
|
|
27
|
-
node_step_result:
|
|
30
|
+
node_step_result: list[NodeResult]
|
|
28
31
|
run_type: Literal["fetch_one", "full_run", "init"]
|
|
29
32
|
|
|
30
33
|
|
|
31
34
|
class BaseItem(BaseModel):
|
|
32
35
|
"""A base model for any item in a file system, like a file or directory."""
|
|
36
|
+
|
|
33
37
|
name: str
|
|
34
38
|
path: str
|
|
35
|
-
size:
|
|
36
|
-
creation_date:
|
|
37
|
-
access_date:
|
|
38
|
-
modification_date:
|
|
39
|
-
source_path:
|
|
39
|
+
size: int | None = None
|
|
40
|
+
creation_date: datetime | None = None
|
|
41
|
+
access_date: datetime | None = None
|
|
42
|
+
modification_date: datetime | None = None
|
|
43
|
+
source_path: str | None = None
|
|
40
44
|
number_of_items: int = -1
|
|
41
45
|
|
|
42
46
|
|
|
43
47
|
class FileColumn(BaseModel):
|
|
44
48
|
"""Represents detailed schema and statistics for a single column (field)."""
|
|
49
|
+
|
|
45
50
|
name: str
|
|
46
51
|
data_type: str
|
|
47
52
|
is_unique: bool
|
|
@@ -55,13 +60,14 @@ class FileColumn(BaseModel):
|
|
|
55
60
|
|
|
56
61
|
class TableExample(BaseModel):
|
|
57
62
|
"""Represents a preview of a table, including schema and sample data."""
|
|
63
|
+
|
|
58
64
|
node_id: int
|
|
59
65
|
number_of_records: int
|
|
60
66
|
number_of_columns: int
|
|
61
67
|
name: str
|
|
62
|
-
table_schema:
|
|
63
|
-
columns:
|
|
64
|
-
data:
|
|
68
|
+
table_schema: list[FileColumn]
|
|
69
|
+
columns: list[str]
|
|
70
|
+
data: list[dict] | None = {}
|
|
65
71
|
has_example_data: bool = False
|
|
66
72
|
has_run_with_current_setup: bool = False
|
|
67
73
|
|
|
@@ -71,15 +77,16 @@ class NodeData(BaseModel):
|
|
|
71
77
|
|
|
72
78
|
This includes its input/output data previews, settings, and run status.
|
|
73
79
|
"""
|
|
80
|
+
|
|
74
81
|
flow_id: int
|
|
75
82
|
node_id: int
|
|
76
83
|
flow_type: str
|
|
77
|
-
left_input:
|
|
78
|
-
right_input:
|
|
79
|
-
main_input:
|
|
80
|
-
main_output:
|
|
81
|
-
left_output:
|
|
82
|
-
right_output:
|
|
84
|
+
left_input: TableExample | None = None
|
|
85
|
+
right_input: TableExample | None = None
|
|
86
|
+
main_input: TableExample | None = None
|
|
87
|
+
main_output: TableExample | None = None
|
|
88
|
+
left_output: TableExample | None = None
|
|
89
|
+
right_output: TableExample | None = None
|
|
83
90
|
has_run: bool = False
|
|
84
91
|
is_cached: bool = False
|
|
85
92
|
setting_input: Any = None
|
|
@@ -87,22 +94,26 @@ class NodeData(BaseModel):
|
|
|
87
94
|
|
|
88
95
|
class OutputFile(BaseItem):
|
|
89
96
|
"""Represents a single file in an output directory, extending BaseItem."""
|
|
90
|
-
|
|
91
|
-
|
|
97
|
+
|
|
98
|
+
ext: str | None = None
|
|
99
|
+
mimetype: str | None = None
|
|
92
100
|
|
|
93
101
|
|
|
94
102
|
class OutputFiles(BaseItem):
|
|
95
103
|
"""Represents a collection of files, typically within a directory."""
|
|
96
|
-
|
|
104
|
+
|
|
105
|
+
files: list[OutputFile] = Field(default_factory=list)
|
|
97
106
|
|
|
98
107
|
|
|
99
108
|
class OutputTree(OutputFiles):
|
|
100
109
|
"""Represents a directory tree, including subdirectories."""
|
|
101
|
-
|
|
110
|
+
|
|
111
|
+
directories: list[OutputFiles] = Field(default_factory=list)
|
|
102
112
|
|
|
103
113
|
|
|
104
114
|
class ItemInfo(OutputFile):
|
|
105
115
|
"""Provides detailed information about a single item in an output directory."""
|
|
116
|
+
|
|
106
117
|
id: int = -1
|
|
107
118
|
type: str
|
|
108
119
|
analysis_file_available: bool = False
|
|
@@ -112,23 +123,27 @@ class ItemInfo(OutputFile):
|
|
|
112
123
|
|
|
113
124
|
class OutputDir(BaseItem):
|
|
114
125
|
"""Represents the contents of a single output directory."""
|
|
115
|
-
|
|
116
|
-
|
|
126
|
+
|
|
127
|
+
all_items: list[str]
|
|
128
|
+
items: list[ItemInfo]
|
|
117
129
|
|
|
118
130
|
|
|
119
131
|
class ExpressionRef(BaseModel):
|
|
120
132
|
"""A reference to a single Polars expression, including its name and docstring."""
|
|
133
|
+
|
|
121
134
|
name: str
|
|
122
|
-
doc:
|
|
135
|
+
doc: str | None
|
|
123
136
|
|
|
124
137
|
|
|
125
138
|
class ExpressionsOverview(BaseModel):
|
|
126
139
|
"""Represents a categorized list of available Polars expressions."""
|
|
140
|
+
|
|
127
141
|
expression_type: str
|
|
128
|
-
expressions:
|
|
142
|
+
expressions: list[ExpressionRef]
|
|
129
143
|
|
|
130
144
|
|
|
131
145
|
class InstantFuncResult(BaseModel):
|
|
132
146
|
"""Represents the result of a function that is expected to execute instantly."""
|
|
133
|
-
|
|
134
|
-
|
|
147
|
+
|
|
148
|
+
success: bool | None = None
|
|
149
|
+
result: str
|
flowfile_core/schemas/schemas.py
CHANGED
|
@@ -1,46 +1,49 @@
|
|
|
1
|
-
from typing import
|
|
2
|
-
|
|
3
|
-
from
|
|
1
|
+
from typing import Any, ClassVar, Literal
|
|
2
|
+
|
|
3
|
+
from pydantic import BaseModel, ConfigDict, Field, ValidationInfo, field_serializer, field_validator
|
|
4
|
+
|
|
4
5
|
from flowfile_core.configs.settings import OFFLOAD_TO_WORKER
|
|
6
|
+
from flowfile_core.flowfile.utils import create_unique_id
|
|
5
7
|
from flowfile_core.schemas import input_schema
|
|
6
|
-
|
|
7
|
-
|
|
8
|
+
|
|
9
|
+
ExecutionModeLiteral = Literal["Development", "Performance"]
|
|
10
|
+
ExecutionLocationsLiteral = Literal["local", "remote"]
|
|
8
11
|
|
|
9
12
|
# Type literals for classifying nodes.
|
|
10
|
-
NodeTypeLiteral = Literal[
|
|
11
|
-
TransformTypeLiteral = Literal[
|
|
13
|
+
NodeTypeLiteral = Literal["input", "output", "process"]
|
|
14
|
+
TransformTypeLiteral = Literal["narrow", "wide", "other"]
|
|
12
15
|
_custom_node_store_cache = None
|
|
13
16
|
|
|
14
17
|
NODE_TYPE_TO_SETTINGS_CLASS = {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
18
|
+
"manual_input": input_schema.NodeManualInput,
|
|
19
|
+
"filter": input_schema.NodeFilter,
|
|
20
|
+
"formula": input_schema.NodeFormula,
|
|
21
|
+
"select": input_schema.NodeSelect,
|
|
22
|
+
"sort": input_schema.NodeSort,
|
|
23
|
+
"record_id": input_schema.NodeRecordId,
|
|
24
|
+
"sample": input_schema.NodeSample,
|
|
25
|
+
"unique": input_schema.NodeUnique,
|
|
26
|
+
"group_by": input_schema.NodeGroupBy,
|
|
27
|
+
"pivot": input_schema.NodePivot,
|
|
28
|
+
"unpivot": input_schema.NodeUnpivot,
|
|
29
|
+
"text_to_rows": input_schema.NodeTextToRows,
|
|
30
|
+
"graph_solver": input_schema.NodeGraphSolver,
|
|
31
|
+
"polars_code": input_schema.NodePolarsCode,
|
|
32
|
+
"join": input_schema.NodeJoin,
|
|
33
|
+
"cross_join": input_schema.NodeCrossJoin,
|
|
34
|
+
"fuzzy_match": input_schema.NodeFuzzyMatch,
|
|
35
|
+
"record_count": input_schema.NodeRecordCount,
|
|
36
|
+
"explore_data": input_schema.NodeExploreData,
|
|
37
|
+
"union": input_schema.NodeUnion,
|
|
38
|
+
"output": input_schema.NodeOutput,
|
|
39
|
+
"read": input_schema.NodeRead,
|
|
40
|
+
"database_reader": input_schema.NodeDatabaseReader,
|
|
41
|
+
"database_writer": input_schema.NodeDatabaseWriter,
|
|
42
|
+
"cloud_storage_reader": input_schema.NodeCloudStorageReader,
|
|
43
|
+
"cloud_storage_writer": input_schema.NodeCloudStorageWriter,
|
|
44
|
+
"external_source": input_schema.NodeExternalSource,
|
|
45
|
+
"promise": input_schema.NodePromise,
|
|
46
|
+
"user_defined": input_schema.UserDefinedNode,
|
|
44
47
|
}
|
|
45
48
|
|
|
46
49
|
|
|
@@ -61,6 +64,7 @@ def _get_custom_node_store():
|
|
|
61
64
|
global _custom_node_store_cache
|
|
62
65
|
if _custom_node_store_cache is None:
|
|
63
66
|
from flowfile_core.configs.node_store import CUSTOM_NODE_STORE
|
|
67
|
+
|
|
64
68
|
_custom_node_store_cache = CUSTOM_NODE_STORE
|
|
65
69
|
return _custom_node_store_cache
|
|
66
70
|
|
|
@@ -79,8 +83,9 @@ def is_valid_execution_location_in_current_global_settings(execution_location: E
|
|
|
79
83
|
return not (get_global_execution_location() == "local" and execution_location == "remote")
|
|
80
84
|
|
|
81
85
|
|
|
82
|
-
def get_prio_execution_location(
|
|
83
|
-
|
|
86
|
+
def get_prio_execution_location(
|
|
87
|
+
local_execution_location: ExecutionLocationsLiteral, global_execution_location: ExecutionLocationsLiteral
|
|
88
|
+
) -> ExecutionLocationsLiteral:
|
|
84
89
|
if local_execution_location == global_execution_location:
|
|
85
90
|
return local_execution_location
|
|
86
91
|
elif global_execution_location == "local" and local_execution_location == "remote":
|
|
@@ -102,16 +107,17 @@ class FlowGraphConfig(BaseModel):
|
|
|
102
107
|
execution_mode (ExecutionModeLiteral): The mode of execution ('Development' or 'Performance').
|
|
103
108
|
execution_location (ExecutionLocationsLiteral): The location for execution ('local', 'remote').
|
|
104
109
|
"""
|
|
110
|
+
|
|
105
111
|
flow_id: int = Field(default_factory=create_unique_id, description="Unique identifier for the flow.")
|
|
106
|
-
description:
|
|
107
|
-
save_location:
|
|
108
|
-
name: str =
|
|
109
|
-
path: str =
|
|
110
|
-
execution_mode: ExecutionModeLiteral =
|
|
112
|
+
description: str | None = None
|
|
113
|
+
save_location: str | None = None
|
|
114
|
+
name: str = ""
|
|
115
|
+
path: str = ""
|
|
116
|
+
execution_mode: ExecutionModeLiteral = "Performance"
|
|
111
117
|
execution_location: ExecutionLocationsLiteral = Field(default_factory=get_global_execution_location)
|
|
112
118
|
|
|
113
|
-
@field_validator(
|
|
114
|
-
def validate_and_set_execution_location(cls, v:
|
|
119
|
+
@field_validator("execution_location", mode="before")
|
|
120
|
+
def validate_and_set_execution_location(cls, v: ExecutionLocationsLiteral | None) -> ExecutionLocationsLiteral:
|
|
115
121
|
"""
|
|
116
122
|
Validates and sets the execution location.
|
|
117
123
|
1. **If `None` is provided**: It defaults to the location determined by global settings.
|
|
@@ -138,8 +144,9 @@ class FlowSettings(FlowGraphConfig):
|
|
|
138
144
|
is_running (bool): Indicates if the flow is currently running.
|
|
139
145
|
is_canceled (bool): Indicates if the flow execution has been canceled.
|
|
140
146
|
"""
|
|
147
|
+
|
|
141
148
|
auto_save: bool = False
|
|
142
|
-
modified_on:
|
|
149
|
+
modified_on: float | None = None
|
|
143
150
|
show_detailed_progress: bool = True
|
|
144
151
|
is_running: bool = False
|
|
145
152
|
is_canceled: bool = False
|
|
@@ -165,10 +172,11 @@ class RawLogInput(BaseModel):
|
|
|
165
172
|
log_type (Literal["INFO", "ERROR"]): The type of log.
|
|
166
173
|
extra (Optional[dict]): Extra context data for the log.
|
|
167
174
|
"""
|
|
175
|
+
|
|
168
176
|
flowfile_flow_id: int
|
|
169
177
|
log_message: str
|
|
170
178
|
log_type: Literal["INFO", "ERROR"]
|
|
171
|
-
extra:
|
|
179
|
+
extra: dict | None = None
|
|
172
180
|
|
|
173
181
|
|
|
174
182
|
class FlowfileSettings(BaseModel):
|
|
@@ -176,53 +184,64 @@ class FlowfileSettings(BaseModel):
|
|
|
176
184
|
|
|
177
185
|
Excludes runtime state fields like is_running, is_canceled, modified_on.
|
|
178
186
|
"""
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
187
|
+
|
|
188
|
+
description: str | None = None
|
|
189
|
+
execution_mode: ExecutionModeLiteral = "Performance"
|
|
190
|
+
execution_location: ExecutionLocationsLiteral = "local"
|
|
182
191
|
auto_save: bool = False
|
|
183
192
|
show_detailed_progress: bool = True
|
|
184
193
|
|
|
185
194
|
|
|
186
195
|
class FlowfileNode(BaseModel):
|
|
187
196
|
"""Node representation for flowfile serialization (YAML/JSON)."""
|
|
197
|
+
|
|
188
198
|
id: int
|
|
189
199
|
type: str
|
|
190
200
|
is_start_node: bool = False
|
|
191
|
-
description:
|
|
192
|
-
x_position:
|
|
193
|
-
y_position:
|
|
194
|
-
left_input_id:
|
|
195
|
-
right_input_id:
|
|
196
|
-
input_ids:
|
|
197
|
-
outputs:
|
|
198
|
-
setting_input:
|
|
201
|
+
description: str | None = ""
|
|
202
|
+
x_position: int | None = 0
|
|
203
|
+
y_position: int | None = 0
|
|
204
|
+
left_input_id: int | None = None
|
|
205
|
+
right_input_id: int | None = None
|
|
206
|
+
input_ids: list[int] | None = Field(default_factory=list)
|
|
207
|
+
outputs: list[int] | None = Field(default_factory=list)
|
|
208
|
+
setting_input: Any | None = None
|
|
199
209
|
|
|
200
210
|
_setting_input_exclude: ClassVar[set] = {
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
211
|
+
"flow_id",
|
|
212
|
+
"node_id",
|
|
213
|
+
"pos_x",
|
|
214
|
+
"pos_y",
|
|
215
|
+
"is_setup",
|
|
216
|
+
"description",
|
|
217
|
+
"user_id",
|
|
218
|
+
"is_flow_output",
|
|
219
|
+
"is_user_defined",
|
|
220
|
+
"depending_on_id",
|
|
221
|
+
"depending_on_ids",
|
|
204
222
|
}
|
|
205
223
|
|
|
206
|
-
@field_serializer(
|
|
224
|
+
@field_serializer("setting_input")
|
|
207
225
|
def serialize_setting_input(self, value, _info):
|
|
208
226
|
if value is None:
|
|
209
227
|
return None
|
|
210
228
|
if isinstance(value, input_schema.NodePromise):
|
|
211
229
|
return None
|
|
212
|
-
if hasattr(value,
|
|
230
|
+
if hasattr(value, "to_yaml_dict"):
|
|
213
231
|
return value.to_yaml_dict()
|
|
214
|
-
if hasattr(value,
|
|
232
|
+
if hasattr(value, "to_yaml_dict"):
|
|
215
233
|
return value.to_yaml_dict()
|
|
216
234
|
return value.model_dump(exclude=self._setting_input_exclude)
|
|
217
235
|
|
|
218
236
|
|
|
219
237
|
class FlowfileData(BaseModel):
|
|
220
238
|
"""Root model for flowfile serialization (YAML/JSON)."""
|
|
239
|
+
|
|
221
240
|
flowfile_version: str
|
|
222
241
|
flowfile_id: int
|
|
223
242
|
flowfile_name: str
|
|
224
243
|
flowfile_settings: FlowfileSettings
|
|
225
|
-
nodes:
|
|
244
|
+
nodes: list[FlowfileNode]
|
|
226
245
|
|
|
227
246
|
|
|
228
247
|
class NodeTemplate(BaseModel):
|
|
@@ -240,6 +259,7 @@ class NodeTemplate(BaseModel):
|
|
|
240
259
|
prod_ready (bool): Whether the node is considered production-ready.
|
|
241
260
|
can_be_start (bool): Whether the node can be a starting point in a flow.
|
|
242
261
|
"""
|
|
262
|
+
|
|
243
263
|
name: str
|
|
244
264
|
item: str
|
|
245
265
|
input: int
|
|
@@ -253,35 +273,36 @@ class NodeTemplate(BaseModel):
|
|
|
253
273
|
can_be_start: bool = False
|
|
254
274
|
drawer_title: str = "Node title"
|
|
255
275
|
drawer_intro: str = "Drawer into"
|
|
256
|
-
custom_node:
|
|
276
|
+
custom_node: bool | None = False
|
|
257
277
|
|
|
258
278
|
|
|
259
279
|
class NodeInformation(BaseModel):
|
|
260
280
|
"""
|
|
261
281
|
Stores the state and configuration of a specific node instance within a flow.
|
|
262
282
|
"""
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
283
|
+
|
|
284
|
+
id: int | None = None
|
|
285
|
+
type: str | None = None
|
|
286
|
+
is_setup: bool | None = None
|
|
266
287
|
is_start_node: bool = False
|
|
267
|
-
description:
|
|
268
|
-
x_position:
|
|
269
|
-
y_position:
|
|
270
|
-
left_input_id:
|
|
271
|
-
right_input_id:
|
|
272
|
-
input_ids:
|
|
273
|
-
outputs:
|
|
274
|
-
setting_input:
|
|
288
|
+
description: str | None = ""
|
|
289
|
+
x_position: int | None = 0
|
|
290
|
+
y_position: int | None = 0
|
|
291
|
+
left_input_id: int | None = None
|
|
292
|
+
right_input_id: int | None = None
|
|
293
|
+
input_ids: list[int] | None = Field(default_factory=list)
|
|
294
|
+
outputs: list[int] | None = Field(default_factory=list)
|
|
295
|
+
setting_input: Any | None = None
|
|
275
296
|
|
|
276
297
|
@property
|
|
277
298
|
def data(self) -> Any:
|
|
278
299
|
return self.setting_input
|
|
279
300
|
|
|
280
301
|
@property
|
|
281
|
-
def main_input_ids(self) ->
|
|
302
|
+
def main_input_ids(self) -> list[int] | None:
|
|
282
303
|
return self.input_ids
|
|
283
304
|
|
|
284
|
-
@field_validator(
|
|
305
|
+
@field_validator("setting_input", mode="before")
|
|
285
306
|
@classmethod
|
|
286
307
|
def validate_setting_input(cls, v, info: ValidationInfo):
|
|
287
308
|
if v is None:
|
|
@@ -289,7 +310,7 @@ class NodeInformation(BaseModel):
|
|
|
289
310
|
if isinstance(v, BaseModel):
|
|
290
311
|
return v
|
|
291
312
|
|
|
292
|
-
node_type = info.data.get(
|
|
313
|
+
node_type = info.data.get("type")
|
|
293
314
|
model_class = get_settings_class_for_node_type(node_type)
|
|
294
315
|
|
|
295
316
|
if model_class is None:
|
|
@@ -313,21 +334,22 @@ class FlowInformation(BaseModel):
|
|
|
313
334
|
node_starts (List[int]): A list of starting node IDs.
|
|
314
335
|
node_connections (List[Tuple[int, int]]): A list of tuples representing connections between nodes.
|
|
315
336
|
"""
|
|
337
|
+
|
|
316
338
|
flow_id: int
|
|
317
|
-
flow_name:
|
|
339
|
+
flow_name: str | None = ""
|
|
318
340
|
flow_settings: FlowSettings
|
|
319
|
-
data:
|
|
320
|
-
node_starts:
|
|
321
|
-
node_connections:
|
|
341
|
+
data: dict[int, NodeInformation] = {}
|
|
342
|
+
node_starts: list[int]
|
|
343
|
+
node_connections: list[tuple[int, int]] = []
|
|
322
344
|
|
|
323
|
-
@field_validator(
|
|
345
|
+
@field_validator("flow_name", mode="before")
|
|
324
346
|
def ensure_string(cls, v):
|
|
325
347
|
"""
|
|
326
348
|
Validator to ensure the flow_name is always a string.
|
|
327
349
|
:param v: The value to validate.
|
|
328
350
|
:return: The value as a string, or an empty string if it's None.
|
|
329
351
|
"""
|
|
330
|
-
return str(v) if v is not None else
|
|
352
|
+
return str(v) if v is not None else ""
|
|
331
353
|
|
|
332
354
|
|
|
333
355
|
class NodeConnection(BaseModel):
|
|
@@ -338,6 +360,7 @@ class NodeConnection(BaseModel):
|
|
|
338
360
|
from_node_id (int): The ID of the source node.
|
|
339
361
|
to_node_id (int): The ID of the target node.
|
|
340
362
|
"""
|
|
363
|
+
|
|
341
364
|
model_config = ConfigDict(frozen=True)
|
|
342
365
|
from_node_id: int
|
|
343
366
|
to_node_id: int
|
|
@@ -352,6 +375,7 @@ class NodeInput(NodeTemplate):
|
|
|
352
375
|
pos_x (float): The x-coordinate on the canvas.
|
|
353
376
|
pos_y (float): The y-coordinate on the canvas.
|
|
354
377
|
"""
|
|
378
|
+
|
|
355
379
|
id: int
|
|
356
380
|
pos_x: float
|
|
357
381
|
pos_y: float
|
|
@@ -368,6 +392,7 @@ class NodeEdge(BaseModel):
|
|
|
368
392
|
targetHandle (str): The specific input handle on the target node.
|
|
369
393
|
sourceHandle (str): The specific output handle on the source node.
|
|
370
394
|
"""
|
|
395
|
+
|
|
371
396
|
model_config = ConfigDict(coerce_numbers_to_str=True)
|
|
372
397
|
id: str
|
|
373
398
|
source: str
|
|
@@ -385,8 +410,9 @@ class VueFlowInput(BaseModel):
|
|
|
385
410
|
node_edges (List[NodeEdge]): A list of all edges in the graph.
|
|
386
411
|
node_inputs (List[NodeInput]): A list of all nodes in the graph.
|
|
387
412
|
"""
|
|
388
|
-
|
|
389
|
-
|
|
413
|
+
|
|
414
|
+
node_edges: list[NodeEdge]
|
|
415
|
+
node_inputs: list[NodeInput]
|
|
390
416
|
|
|
391
417
|
|
|
392
418
|
class NodeDefault(BaseModel):
|
|
@@ -399,7 +425,8 @@ class NodeDefault(BaseModel):
|
|
|
399
425
|
transform_type (TransformTypeLiteral): The data transformation behavior ('narrow', 'wide', 'other').
|
|
400
426
|
has_default_settings (Optional[Any]): Indicates if the node has predefined default settings.
|
|
401
427
|
"""
|
|
428
|
+
|
|
402
429
|
node_name: str
|
|
403
430
|
node_type: NodeTypeLiteral
|
|
404
431
|
transform_type: TransformTypeLiteral
|
|
405
|
-
has_default_settings:
|
|
432
|
+
has_default_settings: Any | None = None
|