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
flowfile_frame/adding_expr.py
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
|
-
|
|
1
|
+
from collections.abc import Callable
|
|
2
2
|
from functools import wraps
|
|
3
|
-
from typing import
|
|
4
|
-
|
|
3
|
+
from typing import TypeVar
|
|
4
|
+
|
|
5
|
+
import polars as pl
|
|
6
|
+
|
|
5
7
|
from flowfile_frame.config import logger
|
|
8
|
+
from flowfile_frame.utils import _get_function_source
|
|
6
9
|
|
|
7
|
-
T = TypeVar(
|
|
8
|
-
ExprT = TypeVar(
|
|
10
|
+
T = TypeVar("T")
|
|
11
|
+
ExprT = TypeVar("ExprT", bound="Expr")
|
|
9
12
|
PASSTHROUGH_METHODS = {"map_elements", "map_batches"}
|
|
10
13
|
|
|
11
14
|
|
|
@@ -29,12 +32,9 @@ def create_expr_method_wrapper(method_name: str, original_method: Callable) -> C
|
|
|
29
32
|
|
|
30
33
|
@wraps(original_method)
|
|
31
34
|
def wrapper(self: Expr, *args, **kwargs):
|
|
32
|
-
from flowfile_frame.expr import Expr
|
|
33
35
|
# Check if we have a valid underlying expression
|
|
34
36
|
if self.expr is None:
|
|
35
|
-
raise ValueError(
|
|
36
|
-
f"Cannot call '{method_name}' on Expr with no underlying polars expression."
|
|
37
|
-
)
|
|
37
|
+
raise ValueError(f"Cannot call '{method_name}' on Expr with no underlying polars expression.")
|
|
38
38
|
|
|
39
39
|
# Collect function sources and build representations
|
|
40
40
|
function_sources = []
|
|
@@ -47,7 +47,7 @@ def create_expr_method_wrapper(method_name: str, original_method: Callable) -> C
|
|
|
47
47
|
# Try to get function source
|
|
48
48
|
try:
|
|
49
49
|
source, is_module_level = _get_function_source(arg)
|
|
50
|
-
if source and hasattr(arg,
|
|
50
|
+
if source and hasattr(arg, "__name__") and arg.__name__ != "<lambda>":
|
|
51
51
|
function_sources.append(source)
|
|
52
52
|
# Use the function name in the representation
|
|
53
53
|
args_representations.append(arg.__name__)
|
|
@@ -65,7 +65,7 @@ def create_expr_method_wrapper(method_name: str, original_method: Callable) -> C
|
|
|
65
65
|
# Try to get function source
|
|
66
66
|
try:
|
|
67
67
|
source, is_module_level = _get_function_source(value)
|
|
68
|
-
if source and hasattr(value,
|
|
68
|
+
if source and hasattr(value, "__name__") and value.__name__ != "<lambda>":
|
|
69
69
|
function_sources.append(source)
|
|
70
70
|
# Use the function name in the representation
|
|
71
71
|
kwargs_representations.append(f"{key}={value.__name__}")
|
|
@@ -102,16 +102,56 @@ def create_expr_method_wrapper(method_name: str, original_method: Callable) -> C
|
|
|
102
102
|
|
|
103
103
|
# Methods that typically change the aggregation status or complexity
|
|
104
104
|
agg_methods = {
|
|
105
|
-
"sum",
|
|
106
|
-
"
|
|
105
|
+
"sum",
|
|
106
|
+
"mean",
|
|
107
|
+
"min",
|
|
108
|
+
"max",
|
|
109
|
+
"median",
|
|
110
|
+
"first",
|
|
111
|
+
"last",
|
|
112
|
+
"std",
|
|
113
|
+
"var",
|
|
114
|
+
"count",
|
|
115
|
+
"n_unique",
|
|
116
|
+
"quantile",
|
|
117
|
+
"implode",
|
|
118
|
+
"explode",
|
|
107
119
|
}
|
|
108
120
|
# Methods that typically make expressions complex
|
|
109
121
|
complex_methods = {
|
|
110
|
-
"filter",
|
|
111
|
-
"
|
|
112
|
-
"
|
|
113
|
-
"
|
|
114
|
-
"
|
|
122
|
+
"filter",
|
|
123
|
+
"map",
|
|
124
|
+
"shift",
|
|
125
|
+
"fill_null",
|
|
126
|
+
"fill_nan",
|
|
127
|
+
"round",
|
|
128
|
+
"abs",
|
|
129
|
+
"alias",
|
|
130
|
+
"cast",
|
|
131
|
+
"is_between",
|
|
132
|
+
"over",
|
|
133
|
+
"sort",
|
|
134
|
+
"arg_sort",
|
|
135
|
+
"arg_unique",
|
|
136
|
+
"arg_min",
|
|
137
|
+
"arg_max",
|
|
138
|
+
"rolling",
|
|
139
|
+
"interpolate",
|
|
140
|
+
"ewm_mean",
|
|
141
|
+
"ewm_std",
|
|
142
|
+
"ewm_var",
|
|
143
|
+
"backward_fill",
|
|
144
|
+
"forward_fill",
|
|
145
|
+
"rank",
|
|
146
|
+
"diff",
|
|
147
|
+
"clip",
|
|
148
|
+
"dot",
|
|
149
|
+
"mode",
|
|
150
|
+
"drop_nulls",
|
|
151
|
+
"drop_nans",
|
|
152
|
+
"take",
|
|
153
|
+
"gather",
|
|
154
|
+
"shift_and_fill",
|
|
115
155
|
}
|
|
116
156
|
|
|
117
157
|
# Determine new agg_func status
|
|
@@ -127,7 +167,7 @@ def create_expr_method_wrapper(method_name: str, original_method: Callable) -> C
|
|
|
127
167
|
result_expr=result_expr,
|
|
128
168
|
is_complex=is_complex,
|
|
129
169
|
method_name=method_name,
|
|
130
|
-
_function_sources=function_sources # Pass function sources
|
|
170
|
+
_function_sources=function_sources, # Pass function sources
|
|
131
171
|
)
|
|
132
172
|
|
|
133
173
|
# Set the agg_func if needed
|
|
@@ -139,7 +179,7 @@ def create_expr_method_wrapper(method_name: str, original_method: Callable) -> C
|
|
|
139
179
|
return wrapper
|
|
140
180
|
|
|
141
181
|
|
|
142
|
-
def add_expr_methods(cls:
|
|
182
|
+
def add_expr_methods(cls: type[ExprT]) -> type[ExprT]:
|
|
143
183
|
"""
|
|
144
184
|
Class decorator that adds all polars Expr methods to a custom Expr class.
|
|
145
185
|
|
|
@@ -160,8 +200,7 @@ def add_expr_methods(cls: Type[ExprT]) -> Type[ExprT]:
|
|
|
160
200
|
existing_methods = set(dir(cls))
|
|
161
201
|
|
|
162
202
|
skip_methods = {
|
|
163
|
-
name for name in dir(pl.Expr)
|
|
164
|
-
if name.startswith('_') or isinstance(getattr(pl.Expr, name, None), property)
|
|
203
|
+
name for name in dir(pl.Expr) if name.startswith("_") or isinstance(getattr(pl.Expr, name, None), property)
|
|
165
204
|
}
|
|
166
205
|
|
|
167
206
|
# Add all public Expr methods that don't already exist
|
|
@@ -193,20 +232,21 @@ def add_expr_methods(cls: Type[ExprT]) -> Type[ExprT]:
|
|
|
193
232
|
# Try to get function source
|
|
194
233
|
try:
|
|
195
234
|
source, is_module_level = _get_function_source(arg)
|
|
196
|
-
if source and hasattr(arg,
|
|
197
|
-
|
|
235
|
+
if source and hasattr(arg, "__name__") and arg.__name__ != "<lambda>":
|
|
198
236
|
function_sources.append(source)
|
|
199
237
|
# Use the function name in the representation
|
|
200
238
|
args_representations.append(arg.__name__)
|
|
201
239
|
arg.__repr__ = lambda: arg.__name__
|
|
202
240
|
|
|
203
241
|
else:
|
|
204
|
-
|
|
205
242
|
# Lambda or unnamed function - not convertible
|
|
206
243
|
logger.warning(
|
|
207
|
-
f"Warning: Using anonymous functions in {method_name} is not convertable to UI code"
|
|
208
|
-
|
|
209
|
-
|
|
244
|
+
f"Warning: Using anonymous functions in {method_name} is not convertable to UI code"
|
|
245
|
+
)
|
|
246
|
+
logger.warning(
|
|
247
|
+
"Consider using defined functions (def abc(a, b, c): return ...), "
|
|
248
|
+
"In a separate script"
|
|
249
|
+
)
|
|
210
250
|
convertable_to_code = False
|
|
211
251
|
args_representations.append(repr(arg))
|
|
212
252
|
except:
|
|
@@ -220,7 +260,7 @@ def add_expr_methods(cls: Type[ExprT]) -> Type[ExprT]:
|
|
|
220
260
|
# Try to get function source
|
|
221
261
|
try:
|
|
222
262
|
source, is_module_level = _get_function_source(value)
|
|
223
|
-
if source and hasattr(value,
|
|
263
|
+
if source and hasattr(value, "__name__") and value.__name__ != "<lambda>":
|
|
224
264
|
function_sources.append(source)
|
|
225
265
|
# Use the function name in the representation
|
|
226
266
|
kwargs_representations.append(f"{key}={value.__name__}")
|
|
@@ -258,7 +298,7 @@ def add_expr_methods(cls: Type[ExprT]) -> Type[ExprT]:
|
|
|
258
298
|
is_complex=True,
|
|
259
299
|
convertable_to_code=convertable_to_code,
|
|
260
300
|
_function_sources=function_sources, # Pass function sources
|
|
261
|
-
**kwargs
|
|
301
|
+
**kwargs,
|
|
262
302
|
)
|
|
263
303
|
return result
|
|
264
304
|
|
|
@@ -271,8 +311,9 @@ def add_expr_methods(cls: Type[ExprT]) -> Type[ExprT]:
|
|
|
271
311
|
setattr(cls, name, wrapped_method)
|
|
272
312
|
|
|
273
313
|
overlap = {
|
|
274
|
-
name
|
|
275
|
-
|
|
314
|
+
name
|
|
315
|
+
for name in existing_methods
|
|
316
|
+
if name in dir(pl.Expr) and not name.startswith("_") and callable(getattr(pl.Expr, name))
|
|
276
317
|
}
|
|
277
318
|
if overlap:
|
|
278
319
|
logger.debug(f"Preserved existing methods in {cls.__name__}: {', '.join(sorted(overlap))}")
|
|
@@ -1,39 +1,43 @@
|
|
|
1
|
-
from typing import
|
|
1
|
+
from typing import Literal
|
|
2
2
|
|
|
3
|
-
from polars._typing import
|
|
3
|
+
from polars._typing import CsvEncoding
|
|
4
4
|
|
|
5
5
|
from flowfile_core.flowfile.flow_graph import FlowGraph
|
|
6
|
-
from flowfile_core.schemas import
|
|
6
|
+
from flowfile_core.schemas import cloud_storage_schemas, input_schema
|
|
7
7
|
from flowfile_frame.cloud_storage.secret_manager import get_current_user_id
|
|
8
8
|
from flowfile_frame.utils import generate_node_id
|
|
9
9
|
|
|
10
10
|
|
|
11
|
-
def add_write_ff_to_cloud_storage(
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
11
|
+
def add_write_ff_to_cloud_storage(
|
|
12
|
+
path: str,
|
|
13
|
+
flow_graph: FlowGraph | None,
|
|
14
|
+
depends_on_node_id: int,
|
|
15
|
+
*,
|
|
16
|
+
connection_name: str | None = None,
|
|
17
|
+
write_mode: Literal["overwrite", "append"] = "overwrite",
|
|
18
|
+
file_format: Literal["csv", "parquet", "json", "delta"] = "parquet",
|
|
19
|
+
csv_delimiter: str = ";",
|
|
20
|
+
csv_encoding: CsvEncoding = "utf8",
|
|
21
|
+
parquet_compression: Literal["snappy", "gzip", "brotli", "lz4", "zstd"] = "snappy",
|
|
22
|
+
description: str | None = None,
|
|
23
|
+
) -> int:
|
|
23
24
|
node_id = generate_node_id()
|
|
24
25
|
flow_id = flow_graph.flow_id
|
|
25
26
|
settings = input_schema.NodeCloudStorageWriter(
|
|
26
27
|
flow_id=flow_id,
|
|
27
28
|
node_id=node_id,
|
|
28
|
-
cloud_storage_settings=cloud_storage_schemas.CloudStorageWriteSettings(
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
29
|
+
cloud_storage_settings=cloud_storage_schemas.CloudStorageWriteSettings(
|
|
30
|
+
resource_path=path,
|
|
31
|
+
connection_name=connection_name,
|
|
32
|
+
file_format=file_format,
|
|
33
|
+
write_mode=write_mode,
|
|
34
|
+
csv_delimiter=csv_delimiter,
|
|
35
|
+
csv_encoding=csv_encoding,
|
|
36
|
+
parquet_compression=parquet_compression,
|
|
37
|
+
),
|
|
35
38
|
user_id=get_current_user_id(),
|
|
36
39
|
depending_on_id=depends_on_node_id,
|
|
37
|
-
description=description
|
|
40
|
+
description=description,
|
|
41
|
+
)
|
|
38
42
|
flow_graph.add_cloud_storage_writer(settings)
|
|
39
43
|
return node_id
|
|
@@ -1,21 +1,17 @@
|
|
|
1
|
-
from
|
|
2
|
-
|
|
3
|
-
from flowfile_core.schemas.cloud_storage_schemas import FullCloudStorageConnection, FullCloudStorageConnectionInterface
|
|
4
|
-
from flowfile_core.flowfile.database_connection_manager.db_connections import (store_cloud_connection,
|
|
5
|
-
get_all_cloud_connections_interface,
|
|
6
|
-
delete_cloud_connection)
|
|
1
|
+
from flowfile_core.auth.jwt import create_access_token, get_current_user_sync
|
|
7
2
|
from flowfile_core.database.connection import get_db_context
|
|
8
|
-
from flowfile_core.
|
|
9
|
-
|
|
3
|
+
from flowfile_core.flowfile.database_connection_manager.db_connections import (
|
|
4
|
+
delete_cloud_connection,
|
|
5
|
+
get_all_cloud_connections_interface,
|
|
6
|
+
store_cloud_connection,
|
|
7
|
+
)
|
|
8
|
+
from flowfile_core.schemas.cloud_storage_schemas import FullCloudStorageConnection, FullCloudStorageConnectionInterface
|
|
10
9
|
|
|
11
10
|
|
|
12
11
|
def get_current_user_id() -> int | None:
|
|
13
12
|
access_token = create_access_token(data={"sub": "local_user"})
|
|
14
13
|
with get_db_context() as db:
|
|
15
|
-
current_user_id = get_current_user_sync(
|
|
16
|
-
access_token,
|
|
17
|
-
db
|
|
18
|
-
).id
|
|
14
|
+
current_user_id = get_current_user_sync(access_token, db).id
|
|
19
15
|
return current_user_id
|
|
20
16
|
|
|
21
17
|
|
|
@@ -32,15 +28,8 @@ def create_cloud_storage_connection(connection: FullCloudStorageConnection) -> N
|
|
|
32
28
|
access_token = create_access_token(data={"sub": "local_user"})
|
|
33
29
|
|
|
34
30
|
with get_db_context() as db:
|
|
35
|
-
current_user_id = get_current_user_sync(
|
|
36
|
-
|
|
37
|
-
db
|
|
38
|
-
).id
|
|
39
|
-
store_cloud_connection(
|
|
40
|
-
db,
|
|
41
|
-
connection,
|
|
42
|
-
current_user_id
|
|
43
|
-
)
|
|
31
|
+
current_user_id = get_current_user_sync(access_token, db).id
|
|
32
|
+
store_cloud_connection(db, connection, current_user_id)
|
|
44
33
|
|
|
45
34
|
|
|
46
35
|
def create_cloud_storage_connection_if_not_exists(connection: FullCloudStorageConnection) -> None:
|
|
@@ -58,12 +47,9 @@ def create_cloud_storage_connection_if_not_exists(connection: FullCloudStorageCo
|
|
|
58
47
|
create_cloud_storage_connection(connection)
|
|
59
48
|
|
|
60
49
|
|
|
61
|
-
def get_all_available_cloud_storage_connections() ->
|
|
50
|
+
def get_all_available_cloud_storage_connections() -> list[FullCloudStorageConnectionInterface]:
|
|
62
51
|
with get_db_context() as db:
|
|
63
|
-
all_connections = get_all_cloud_connections_interface(
|
|
64
|
-
db,
|
|
65
|
-
get_current_user_id()
|
|
66
|
-
)
|
|
52
|
+
all_connections = get_all_cloud_connections_interface(db, get_current_user_id())
|
|
67
53
|
return all_connections
|
|
68
54
|
|
|
69
55
|
|
flowfile_frame/config.py
CHANGED
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
|
|
3
|
-
logging.basicConfig(
|
|
4
|
-
level=logging.INFO,
|
|
5
|
-
format='[%(levelname)s] %(message)s'
|
|
6
|
-
)
|
|
3
|
+
logging.basicConfig(level=logging.INFO, format="[%(levelname)s] %(message)s")
|
|
7
4
|
|
|
8
5
|
# Create and export the logger
|
|
9
|
-
logger = logging.getLogger(
|
|
6
|
+
logger = logging.getLogger("flow_frame")
|