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
build_backends/main.py
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import os
|
|
2
|
-
import subprocess
|
|
3
2
|
import platform
|
|
4
3
|
import shutil
|
|
4
|
+
import subprocess
|
|
5
5
|
from pathlib import Path
|
|
6
|
-
from typing import List
|
|
7
6
|
|
|
8
7
|
|
|
9
|
-
def merge_directories(directories:
|
|
8
|
+
def merge_directories(directories: list[str], target_dir: str, cleanup_after_merge: bool = True):
|
|
10
9
|
"""
|
|
11
10
|
Merge all files from two folders into a new target directory.
|
|
12
11
|
After successful merge, removes the original folders.
|
|
@@ -16,9 +15,9 @@ def merge_directories(directories: List[str], target_dir: str, cleanup_after_mer
|
|
|
16
15
|
for directory in directories:
|
|
17
16
|
if os.path.exists(directory):
|
|
18
17
|
shutil.copytree(directory, target_dir, dirs_exist_ok=True)
|
|
19
|
-
print(
|
|
18
|
+
print("Merged directories:", directories, "into", target_dir)
|
|
20
19
|
if cleanup_after_merge:
|
|
21
|
-
print(
|
|
20
|
+
print("Cleaning up directories:", directories)
|
|
22
21
|
for directory in directories:
|
|
23
22
|
if os.path.exists(directory):
|
|
24
23
|
shutil.rmtree(directory)
|
|
@@ -197,25 +196,28 @@ coll = COLLECT(
|
|
|
197
196
|
name='{output_name}'
|
|
198
197
|
)
|
|
199
198
|
'''
|
|
200
|
-
spec_path = f
|
|
201
|
-
with open(spec_path,
|
|
199
|
+
spec_path = f"{output_name}.spec"
|
|
200
|
+
with open(spec_path, "w") as f:
|
|
202
201
|
f.write(spec_content)
|
|
203
202
|
return spec_path
|
|
204
203
|
|
|
204
|
+
|
|
205
205
|
def build_backend(directory, script_name, output_name, hidden_imports=None):
|
|
206
206
|
try:
|
|
207
207
|
spec_path = create_spec_file(directory, script_name, output_name, hidden_imports)
|
|
208
208
|
|
|
209
209
|
env = os.environ.copy()
|
|
210
|
-
env[
|
|
210
|
+
env["PYTHONOPTIMIZE"] = "1"
|
|
211
211
|
|
|
212
212
|
command = [
|
|
213
213
|
"pyinstaller",
|
|
214
214
|
"--clean",
|
|
215
215
|
"-y",
|
|
216
|
-
"--dist",
|
|
217
|
-
"
|
|
218
|
-
|
|
216
|
+
"--dist",
|
|
217
|
+
"./services_dist",
|
|
218
|
+
"--workpath",
|
|
219
|
+
"/tmp" if platform.system() != "Windows" else os.path.join(os.getenv("TEMP"), "pyinstaller"),
|
|
220
|
+
spec_path,
|
|
219
221
|
]
|
|
220
222
|
|
|
221
223
|
print(f"Building {output_name}...")
|
|
@@ -247,7 +249,7 @@ def combine_packages():
|
|
|
247
249
|
exe_name = project + ".exe" if platform.system() == "Windows" else project
|
|
248
250
|
src_exe = os.path.join(src_dir, exe_name)
|
|
249
251
|
temp_target_exe = os.path.join(dist_dir, "_" + exe_name)
|
|
250
|
-
target_exe = os.path.join(dist_dir,
|
|
252
|
+
target_exe = os.path.join(dist_dir, exe_name)
|
|
251
253
|
if os.path.exists(src_exe) and os.path.isfile(src_exe):
|
|
252
254
|
# Instead of removing, overwrite the target
|
|
253
255
|
shutil.move(src_exe, temp_target_exe)
|
|
@@ -257,9 +259,10 @@ def combine_packages():
|
|
|
257
259
|
if platform.system() == "Windows" and os.path.exists(os.path.join(dist_dir, project)):
|
|
258
260
|
shutil.rmtree(os.path.join(dist_dir, project))
|
|
259
261
|
|
|
262
|
+
|
|
260
263
|
def main():
|
|
261
264
|
# Clean previous builds
|
|
262
|
-
for dir_name in [
|
|
265
|
+
for dir_name in ["services_dist"]:
|
|
263
266
|
if os.path.exists(dir_name):
|
|
264
267
|
shutil.rmtree(dir_name)
|
|
265
268
|
|
|
@@ -286,20 +289,20 @@ def main():
|
|
|
286
289
|
# Build flowfile_worker
|
|
287
290
|
|
|
288
291
|
if not build_backend(
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
292
|
+
directory=os.path.join("flowfile_worker", "flowfile_worker"),
|
|
293
|
+
script_name="main.py",
|
|
294
|
+
output_name="flowfile_worker",
|
|
295
|
+
hidden_imports=common_imports,
|
|
293
296
|
):
|
|
294
297
|
builds_successful = False
|
|
295
298
|
|
|
296
299
|
# Build flowfile_core
|
|
297
300
|
|
|
298
301
|
if not build_backend(
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
302
|
+
directory=os.path.join("flowfile_core", "flowfile_core"),
|
|
303
|
+
script_name="main.py",
|
|
304
|
+
output_name="flowfile_core",
|
|
305
|
+
hidden_imports=common_imports,
|
|
303
306
|
):
|
|
304
307
|
builds_successful = False
|
|
305
308
|
|
|
@@ -310,4 +313,4 @@ def main():
|
|
|
310
313
|
|
|
311
314
|
|
|
312
315
|
# if __name__ == "__main__":
|
|
313
|
-
# main()
|
|
316
|
+
# main()
|
build_backends/main_prd.py
CHANGED
|
@@ -1,14 +1,9 @@
|
|
|
1
|
-
import os
|
|
2
|
-
import subprocess
|
|
3
|
-
import platform
|
|
4
|
-
from concurrent.futures import ProcessPoolExecutor, wait
|
|
5
|
-
|
|
6
1
|
import subprocess
|
|
7
2
|
import time
|
|
8
|
-
import requests
|
|
9
|
-
from statistics import mean, stdev
|
|
10
|
-
import sys
|
|
11
3
|
from datetime import datetime
|
|
4
|
+
from statistics import mean, stdev
|
|
5
|
+
|
|
6
|
+
import requests
|
|
12
7
|
|
|
13
8
|
|
|
14
9
|
def wait_for_endpoint(url, timeout=60):
|
|
@@ -27,11 +22,7 @@ def wait_for_endpoint(url, timeout=60):
|
|
|
27
22
|
def shutdown_service():
|
|
28
23
|
"""Shutdown the service gracefully using the shutdown endpoint."""
|
|
29
24
|
try:
|
|
30
|
-
response = requests.post(
|
|
31
|
-
'http://0.0.0.0:63578/shutdown',
|
|
32
|
-
headers={'accept': 'application/json'},
|
|
33
|
-
data=''
|
|
34
|
-
)
|
|
25
|
+
response = requests.post("http://0.0.0.0:63578/shutdown", headers={"accept": "application/json"}, data="")
|
|
35
26
|
print("Shutdown request sent, waiting for service to stop...")
|
|
36
27
|
time.sleep(1) # Wait 10 seconds to ensure the service is fully stopped
|
|
37
28
|
return True
|
|
@@ -97,14 +88,14 @@ def run_comparison_test(old_exe, new_exe, num_runs=3):
|
|
|
97
88
|
print("\nResults:")
|
|
98
89
|
print("-" * 50)
|
|
99
90
|
if old_times:
|
|
100
|
-
print(
|
|
91
|
+
print("Old executable:")
|
|
101
92
|
print(f" Average: {mean(old_times):.3f} seconds")
|
|
102
93
|
print(f" Std Dev: {stdev(old_times):.3f} seconds" if len(old_times) > 1 else " Std Dev: N/A")
|
|
103
94
|
print(f" Min: {min(old_times):.3f} seconds")
|
|
104
95
|
print(f" Max: {max(old_times):.3f} seconds")
|
|
105
96
|
|
|
106
97
|
if new_times:
|
|
107
|
-
print(
|
|
98
|
+
print("\nNew executable:")
|
|
108
99
|
print(f" Average: {mean(new_times):.3f} seconds")
|
|
109
100
|
print(f" Std Dev: {stdev(new_times):.3f} seconds" if len(new_times) > 1 else " Std Dev: N/A")
|
|
110
101
|
print(f" Min: {min(new_times):.3f} seconds")
|
|
@@ -112,13 +103,13 @@ def run_comparison_test(old_exe, new_exe, num_runs=3):
|
|
|
112
103
|
|
|
113
104
|
if old_times and new_times:
|
|
114
105
|
improvement = (mean(old_times) - mean(new_times)) / mean(old_times) * 100
|
|
115
|
-
print(
|
|
106
|
+
print("\nPerformance difference:")
|
|
116
107
|
print(f" {improvement:.1f}% {'faster' if improvement > 0 else 'slower'} than old version")
|
|
117
108
|
|
|
118
109
|
|
|
119
110
|
if __name__ == "__main__":
|
|
120
|
-
old_exe =
|
|
121
|
-
new_exe =
|
|
111
|
+
old_exe = "/Users/edwardvanechoud/personal_dev/Flowfile/dist/flowfile_core/flowfile_core"
|
|
112
|
+
new_exe = "/Users/edwardvanechoud/personal_dev/Flowfile/dist_flowfile_core/flowfile_core"
|
|
122
113
|
|
|
123
114
|
run_comparison_test(old_exe, old_exe)
|
|
124
115
|
|
|
@@ -199,4 +190,4 @@ if __name__ == "__main__":
|
|
|
199
190
|
#
|
|
200
191
|
#
|
|
201
192
|
# if __name__ == "__main__":
|
|
202
|
-
# main()
|
|
193
|
+
# main()
|
flowfile/__init__.py
CHANGED
|
@@ -7,102 +7,206 @@ This package ties together the FlowFile ecosystem components:
|
|
|
7
7
|
- flowfile_worker: Computation engine
|
|
8
8
|
"""
|
|
9
9
|
|
|
10
|
-
from importlib.metadata import version
|
|
10
|
+
from importlib.metadata import PackageNotFoundError, version
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
try:
|
|
13
|
+
__version__ = version("Flowfile")
|
|
14
|
+
except PackageNotFoundError:
|
|
15
|
+
__version__ = "0.5.0"
|
|
13
16
|
|
|
14
|
-
import os
|
|
15
17
|
import logging
|
|
18
|
+
import os
|
|
16
19
|
|
|
17
|
-
os.environ[
|
|
18
|
-
os.environ[
|
|
20
|
+
os.environ["FLOWFILE_WORKER_PORT"] = "63578"
|
|
21
|
+
os.environ["FLOWFILE_SINGLE_FILE_MODE"] = "1"
|
|
19
22
|
|
|
20
|
-
from
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
23
|
+
from polars.datatypes import (
|
|
24
|
+
Array,
|
|
25
|
+
Binary,
|
|
26
|
+
Boolean,
|
|
27
|
+
Categorical,
|
|
28
|
+
DataType,
|
|
29
|
+
DataTypeClass,
|
|
30
|
+
Date,
|
|
31
|
+
Datetime,
|
|
32
|
+
Decimal,
|
|
33
|
+
Duration,
|
|
34
|
+
Enum,
|
|
35
|
+
Field,
|
|
36
|
+
Float32,
|
|
37
|
+
Float64,
|
|
38
|
+
Int8,
|
|
39
|
+
Int16,
|
|
40
|
+
Int32,
|
|
41
|
+
Int64,
|
|
42
|
+
Int128,
|
|
43
|
+
List,
|
|
44
|
+
Null,
|
|
45
|
+
Object,
|
|
46
|
+
String,
|
|
47
|
+
Struct,
|
|
48
|
+
Time,
|
|
49
|
+
UInt8,
|
|
50
|
+
UInt16,
|
|
51
|
+
UInt32,
|
|
52
|
+
UInt64,
|
|
53
|
+
Unknown,
|
|
54
|
+
Utf8,
|
|
24
55
|
)
|
|
25
|
-
|
|
26
|
-
from
|
|
56
|
+
|
|
57
|
+
from flowfile.api import open_graph_in_editor
|
|
58
|
+
from flowfile.web import start_server as start_web_ui
|
|
59
|
+
from flowfile_core.flowfile import node_designer
|
|
27
60
|
from flowfile_core.flowfile.flow_data_engine.flow_data_engine import FlowDataEngine
|
|
28
|
-
from flowfile_core.flowfile.flow_node.flow_node import FlowNode
|
|
29
61
|
from flowfile_core.flowfile.flow_data_engine.flow_file_column.main import FlowfileColumn
|
|
62
|
+
from flowfile_core.flowfile.flow_graph import FlowGraph
|
|
63
|
+
from flowfile_core.flowfile.flow_node.flow_node import FlowNode
|
|
30
64
|
from flowfile_core.schemas import input_schema as node_interface
|
|
31
|
-
from flowfile_core.schemas.schemas import FlowSettings, FlowInformation
|
|
32
65
|
from flowfile_core.schemas import transform_schema
|
|
33
|
-
from
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
66
|
+
from flowfile_core.schemas.cloud_storage_schemas import FullCloudStorageConnection
|
|
67
|
+
from flowfile_core.schemas.schemas import FlowInformation, FlowSettings
|
|
68
|
+
from flowfile_frame import (
|
|
69
|
+
FuzzyMapping,
|
|
70
|
+
concat,
|
|
71
|
+
create_cloud_storage_connection,
|
|
72
|
+
create_cloud_storage_connection_if_not_exists,
|
|
73
|
+
del_cloud_storage_connection,
|
|
74
|
+
from_dict,
|
|
75
|
+
get_all_available_cloud_storage_connections,
|
|
76
|
+
read_csv,
|
|
77
|
+
read_parquet,
|
|
78
|
+
scan_csv,
|
|
79
|
+
scan_csv_from_cloud_storage,
|
|
80
|
+
scan_delta,
|
|
81
|
+
scan_json_from_cloud_storage,
|
|
82
|
+
scan_parquet,
|
|
83
|
+
scan_parquet_from_cloud_storage,
|
|
46
84
|
)
|
|
85
|
+
from flowfile_frame.expr import col, column, count, cum_count, len, lit, max, mean, min, sum, when
|
|
86
|
+
from flowfile_frame.flow_frame import FlowFrame
|
|
47
87
|
from flowfile_frame.group_frame import GroupByFrame
|
|
48
|
-
from flowfile_frame.utils import create_flow_graph
|
|
49
88
|
from flowfile_frame.selectors import (
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
89
|
+
all_,
|
|
90
|
+
boolean,
|
|
91
|
+
by_dtype,
|
|
92
|
+
categorical,
|
|
93
|
+
contains,
|
|
94
|
+
date,
|
|
95
|
+
datetime,
|
|
96
|
+
duration,
|
|
97
|
+
ends_with,
|
|
98
|
+
float_,
|
|
99
|
+
integer,
|
|
100
|
+
list_,
|
|
101
|
+
matches,
|
|
102
|
+
numeric,
|
|
103
|
+
object_,
|
|
104
|
+
starts_with,
|
|
105
|
+
string,
|
|
106
|
+
struct,
|
|
107
|
+
temporal,
|
|
108
|
+
time,
|
|
54
109
|
)
|
|
55
|
-
|
|
56
|
-
from polars.datatypes import (
|
|
57
|
-
Int8, Int16, Int32, Int64, Int128,
|
|
58
|
-
UInt8, UInt16, UInt32, UInt64,
|
|
59
|
-
Float32, Float64,
|
|
60
|
-
Boolean, String, Utf8, Binary, Null,
|
|
61
|
-
List, Array, Struct, Object,
|
|
62
|
-
Date, Time, Datetime, Duration,
|
|
63
|
-
Categorical, Decimal, Enum, Unknown,
|
|
64
|
-
DataType, DataTypeClass, Field
|
|
65
|
-
)
|
|
66
|
-
|
|
67
|
-
from flowfile_core.flowfile import node_designer
|
|
68
|
-
|
|
110
|
+
from flowfile_frame.utils import create_flow_graph
|
|
69
111
|
|
|
70
112
|
__all__ = [
|
|
71
113
|
# Core FlowFrame classes
|
|
72
|
-
|
|
73
|
-
|
|
114
|
+
"FlowFrame",
|
|
115
|
+
"GroupByFrame",
|
|
116
|
+
"FullCloudStorageConnection",
|
|
74
117
|
# Main creation functions
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
118
|
+
"read_csv",
|
|
119
|
+
"read_parquet",
|
|
120
|
+
"from_dict",
|
|
121
|
+
"concat",
|
|
122
|
+
"scan_csv",
|
|
123
|
+
"scan_parquet",
|
|
124
|
+
"scan_delta",
|
|
125
|
+
"scan_parquet_from_cloud_storage",
|
|
126
|
+
"scan_json_from_cloud_storage",
|
|
127
|
+
"scan_csv_from_cloud_storage",
|
|
128
|
+
"get_all_available_cloud_storage_connections",
|
|
129
|
+
"create_cloud_storage_connection",
|
|
130
|
+
"del_cloud_storage_connection",
|
|
131
|
+
"create_cloud_storage_connection_if_not_exists",
|
|
132
|
+
"FlowGraph",
|
|
133
|
+
"FlowDataEngine",
|
|
134
|
+
"node_interface",
|
|
135
|
+
"FlowSettings",
|
|
136
|
+
"transform_schema",
|
|
137
|
+
"FlowNode",
|
|
138
|
+
"FlowfileColumn",
|
|
139
|
+
"FlowInformation",
|
|
140
|
+
"FuzzyMapping",
|
|
82
141
|
# Expression API
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
142
|
+
"col",
|
|
143
|
+
"lit",
|
|
144
|
+
"column",
|
|
145
|
+
"cum_count",
|
|
146
|
+
"len",
|
|
147
|
+
"sum",
|
|
148
|
+
"min",
|
|
149
|
+
"max",
|
|
150
|
+
"mean",
|
|
151
|
+
"count",
|
|
152
|
+
"when",
|
|
86
153
|
# Selector utilities
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
154
|
+
"numeric",
|
|
155
|
+
"float_",
|
|
156
|
+
"integer",
|
|
157
|
+
"string",
|
|
158
|
+
"temporal",
|
|
159
|
+
"datetime",
|
|
160
|
+
"date",
|
|
161
|
+
"time",
|
|
162
|
+
"duration",
|
|
163
|
+
"boolean",
|
|
164
|
+
"categorical",
|
|
165
|
+
"object_",
|
|
166
|
+
"list_",
|
|
167
|
+
"struct",
|
|
168
|
+
"all_",
|
|
169
|
+
"by_dtype",
|
|
170
|
+
"contains",
|
|
171
|
+
"starts_with",
|
|
172
|
+
"ends_with",
|
|
173
|
+
"matches",
|
|
92
174
|
"node_designer",
|
|
93
|
-
|
|
94
175
|
# Utilities
|
|
95
|
-
|
|
96
|
-
|
|
176
|
+
"create_flow_graph",
|
|
177
|
+
"open_graph_in_editor",
|
|
97
178
|
# Data types from Polars
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
179
|
+
"Int8",
|
|
180
|
+
"Int16",
|
|
181
|
+
"Int32",
|
|
182
|
+
"Int64",
|
|
183
|
+
"Int128",
|
|
184
|
+
"UInt8",
|
|
185
|
+
"UInt16",
|
|
186
|
+
"UInt32",
|
|
187
|
+
"UInt64",
|
|
188
|
+
"Float32",
|
|
189
|
+
"Float64",
|
|
190
|
+
"Boolean",
|
|
191
|
+
"String",
|
|
192
|
+
"Utf8",
|
|
193
|
+
"Binary",
|
|
194
|
+
"Null",
|
|
195
|
+
"List",
|
|
196
|
+
"Array",
|
|
197
|
+
"Struct",
|
|
198
|
+
"Object",
|
|
199
|
+
"Date",
|
|
200
|
+
"Time",
|
|
201
|
+
"Datetime",
|
|
202
|
+
"Duration",
|
|
203
|
+
"Categorical",
|
|
204
|
+
"Decimal",
|
|
205
|
+
"Enum",
|
|
206
|
+
"Unknown",
|
|
207
|
+
"DataType",
|
|
208
|
+
"DataTypeClass",
|
|
209
|
+
"Field",
|
|
210
|
+
"start_web_ui",
|
|
107
211
|
]
|
|
108
212
|
logging.getLogger("PipelineHandler").setLevel(logging.WARNING)
|
flowfile/__main__.py
CHANGED
|
@@ -1,16 +1,19 @@
|
|
|
1
1
|
# flowfile/__main__.py
|
|
2
2
|
|
|
3
|
+
|
|
3
4
|
def main():
|
|
4
5
|
"""
|
|
5
6
|
Display information about FlowFile when run directly as a module.
|
|
6
7
|
"""
|
|
7
|
-
import flowfile
|
|
8
8
|
import argparse
|
|
9
9
|
|
|
10
|
+
import flowfile
|
|
11
|
+
|
|
10
12
|
parser = argparse.ArgumentParser(description="FlowFile: A visual ETL tool with a Polars-like API")
|
|
11
13
|
parser.add_argument("command", nargs="?", choices=["run"], help="Command to execute")
|
|
12
|
-
parser.add_argument(
|
|
13
|
-
|
|
14
|
+
parser.add_argument(
|
|
15
|
+
"component", nargs="?", choices=["ui", "core", "worker"], help="Component to run (ui, core, or worker)"
|
|
16
|
+
)
|
|
14
17
|
parser.add_argument("--host", default="127.0.0.1", help="Host to bind the server to")
|
|
15
18
|
parser.add_argument("--port", type=int, default=63578, help="Port to bind the server to")
|
|
16
19
|
parser.add_argument("--no-browser", action="store_true", help="Don't open a browser window")
|
|
@@ -21,18 +24,18 @@ def main():
|
|
|
21
24
|
if args.command == "run" and args.component:
|
|
22
25
|
if args.component == "ui":
|
|
23
26
|
try:
|
|
24
|
-
flowfile.start_web_ui(
|
|
25
|
-
open_browser=not args.no_browser
|
|
26
|
-
)
|
|
27
|
+
flowfile.start_web_ui(open_browser=not args.no_browser)
|
|
27
28
|
except KeyboardInterrupt:
|
|
28
29
|
print("\nFlowFile service stopped.")
|
|
29
30
|
elif args.component == "core":
|
|
30
31
|
# Only for direct core service usage
|
|
31
32
|
from flowfile_core.main import run as run_core
|
|
33
|
+
|
|
32
34
|
run_core(host=args.host, port=args.port)
|
|
33
35
|
elif args.component == "worker":
|
|
34
36
|
# Only for direct worker service usage
|
|
35
37
|
from flowfile_worker.main import run as run_worker
|
|
38
|
+
|
|
36
39
|
run_worker(host=args.host, port=args.port)
|
|
37
40
|
else:
|
|
38
41
|
# Default action - show info
|
|
@@ -54,4 +57,4 @@ def main():
|
|
|
54
57
|
print(" import flowfile as ff")
|
|
55
58
|
print(" df = ff.read_csv('data.csv')")
|
|
56
59
|
print(" result = df.filter(ff.col('value') > 10)")
|
|
57
|
-
print(" ff.open_graph_in_editor(result)")
|
|
60
|
+
print(" ff.open_graph_in_editor(result)")
|