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,8 +1,21 @@
|
|
|
1
|
-
from typing import TypedDict
|
|
2
|
-
|
|
1
|
+
from typing import TypedDict
|
|
3
2
|
|
|
4
3
|
# === Transform Schema YAML Types ===
|
|
5
4
|
|
|
5
|
+
|
|
6
|
+
class BasicFilterYaml(TypedDict, total=False):
|
|
7
|
+
field: str
|
|
8
|
+
operator: str
|
|
9
|
+
value: str
|
|
10
|
+
value2: str # For BETWEEN operator
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class FilterInputYaml(TypedDict, total=False):
|
|
14
|
+
mode: str # "basic" or "advanced"
|
|
15
|
+
basic_filter: BasicFilterYaml
|
|
16
|
+
advanced_filter: str
|
|
17
|
+
|
|
18
|
+
|
|
6
19
|
class SelectInputYaml(TypedDict, total=False):
|
|
7
20
|
old_name: str
|
|
8
21
|
new_name: str
|
|
@@ -11,7 +24,7 @@ class SelectInputYaml(TypedDict, total=False):
|
|
|
11
24
|
|
|
12
25
|
|
|
13
26
|
class JoinInputsYaml(TypedDict):
|
|
14
|
-
select:
|
|
27
|
+
select: list[SelectInputYaml]
|
|
15
28
|
|
|
16
29
|
|
|
17
30
|
class JoinMapYaml(TypedDict):
|
|
@@ -20,7 +33,7 @@ class JoinMapYaml(TypedDict):
|
|
|
20
33
|
|
|
21
34
|
|
|
22
35
|
class JoinInputYaml(TypedDict):
|
|
23
|
-
join_mapping:
|
|
36
|
+
join_mapping: list[JoinMapYaml]
|
|
24
37
|
left_select: JoinInputsYaml
|
|
25
38
|
right_select: JoinInputsYaml
|
|
26
39
|
how: str
|
|
@@ -42,7 +55,7 @@ class FuzzyMappingYaml(TypedDict, total=False):
|
|
|
42
55
|
|
|
43
56
|
|
|
44
57
|
class FuzzyMatchInputYaml(TypedDict):
|
|
45
|
-
join_mapping:
|
|
58
|
+
join_mapping: list[FuzzyMappingYaml]
|
|
46
59
|
left_select: JoinInputsYaml
|
|
47
60
|
right_select: JoinInputsYaml
|
|
48
61
|
how: str
|
|
@@ -51,20 +64,21 @@ class FuzzyMatchInputYaml(TypedDict):
|
|
|
51
64
|
|
|
52
65
|
# === Input Schema YAML Types ===
|
|
53
66
|
|
|
67
|
+
|
|
54
68
|
class OutputSettingsYaml(TypedDict, total=False):
|
|
55
69
|
name: str
|
|
56
70
|
directory: str
|
|
57
71
|
file_type: str
|
|
58
72
|
write_mode: str
|
|
59
73
|
abs_file_path: str
|
|
60
|
-
fields:
|
|
74
|
+
fields: list[str]
|
|
61
75
|
table_settings: dict
|
|
62
76
|
|
|
63
77
|
|
|
64
78
|
class NodeSelectYaml(TypedDict):
|
|
65
79
|
cache_results: bool
|
|
66
80
|
keep_missing: bool
|
|
67
|
-
select_input:
|
|
81
|
+
select_input: list[SelectInputYaml]
|
|
68
82
|
sorted_by: str
|
|
69
83
|
|
|
70
84
|
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
|
|
2
1
|
from cryptography.fernet import Fernet
|
|
2
|
+
from fastapi.exceptions import HTTPException
|
|
3
|
+
from pydantic import SecretStr
|
|
3
4
|
from sqlalchemy import and_
|
|
4
5
|
from sqlalchemy.orm import Session
|
|
6
|
+
|
|
7
|
+
from flowfile_core.auth.models import SecretInput
|
|
8
|
+
from flowfile_core.auth.secrets import get_master_key
|
|
5
9
|
from flowfile_core.database import models as db_models
|
|
6
10
|
from flowfile_core.database.connection import get_db_context
|
|
7
|
-
from flowfile_core.auth.secrets import get_master_key
|
|
8
|
-
from pydantic import SecretStr
|
|
9
|
-
from flowfile_core.auth.models import SecretInput
|
|
10
|
-
from fastapi.exceptions import HTTPException
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
def encrypt_secret(secret_value):
|
|
@@ -24,11 +24,14 @@ def decrypt_secret(encrypted_value) -> SecretStr:
|
|
|
24
24
|
return SecretStr(f.decrypt(encrypted_value.encode()).decode())
|
|
25
25
|
|
|
26
26
|
|
|
27
|
-
def get_encrypted_secret(current_user_id: int, secret_name: str) -> str|None:
|
|
27
|
+
def get_encrypted_secret(current_user_id: int, secret_name: str) -> str | None:
|
|
28
28
|
with get_db_context() as db:
|
|
29
29
|
user_id = current_user_id
|
|
30
|
-
db_secret =
|
|
31
|
-
|
|
30
|
+
db_secret = (
|
|
31
|
+
db.query(db_models.Secret)
|
|
32
|
+
.filter(and_(db_models.Secret.user_id == user_id, db_models.Secret.name == secret_name))
|
|
33
|
+
.first()
|
|
34
|
+
)
|
|
32
35
|
if db_secret:
|
|
33
36
|
return db_secret.encrypted_value
|
|
34
37
|
else:
|
|
@@ -43,7 +46,7 @@ def store_secret(db: Session, secret: SecretInput, user_id: int) -> db_models.Se
|
|
|
43
46
|
name=secret.name,
|
|
44
47
|
encrypted_value=encrypted_value,
|
|
45
48
|
iv="", # Not used with Fernet
|
|
46
|
-
user_id=user_id
|
|
49
|
+
user_id=user_id,
|
|
47
50
|
)
|
|
48
51
|
db.add(db_secret)
|
|
49
52
|
db.commit()
|
|
@@ -52,10 +55,11 @@ def store_secret(db: Session, secret: SecretInput, user_id: int) -> db_models.Se
|
|
|
52
55
|
|
|
53
56
|
|
|
54
57
|
def delete_secret(db: Session, secret_name: str, user_id: int) -> None:
|
|
55
|
-
db_secret =
|
|
56
|
-
db_models.Secret
|
|
57
|
-
db_models.Secret.name == secret_name
|
|
58
|
-
|
|
58
|
+
db_secret = (
|
|
59
|
+
db.query(db_models.Secret)
|
|
60
|
+
.filter(db_models.Secret.user_id == user_id, db_models.Secret.name == secret_name)
|
|
61
|
+
.first()
|
|
62
|
+
)
|
|
59
63
|
|
|
60
64
|
if not db_secret:
|
|
61
65
|
raise HTTPException(status_code=404, detail="Secret not found")
|
flowfile_core/types.py
CHANGED
|
@@ -18,22 +18,41 @@ Usage:
|
|
|
18
18
|
"""
|
|
19
19
|
|
|
20
20
|
from enum import Enum
|
|
21
|
-
from typing import
|
|
22
|
-
import polars as pl
|
|
21
|
+
from typing import Literal, Union
|
|
23
22
|
|
|
23
|
+
import polars as pl
|
|
24
24
|
|
|
25
25
|
DataTypeStr = Literal[
|
|
26
|
-
"Int8",
|
|
27
|
-
"
|
|
28
|
-
"
|
|
26
|
+
"Int8",
|
|
27
|
+
"Int16",
|
|
28
|
+
"Int32",
|
|
29
|
+
"Int64",
|
|
30
|
+
"UInt8",
|
|
31
|
+
"UInt16",
|
|
32
|
+
"UInt32",
|
|
33
|
+
"UInt64",
|
|
34
|
+
"Float32",
|
|
35
|
+
"Float64",
|
|
36
|
+
"Decimal",
|
|
29
37
|
"String",
|
|
30
|
-
"Date",
|
|
31
|
-
"
|
|
38
|
+
"Date",
|
|
39
|
+
"Datetime",
|
|
40
|
+
"Time",
|
|
41
|
+
"Duration",
|
|
42
|
+
"Boolean",
|
|
43
|
+
"Binary",
|
|
44
|
+
"List",
|
|
45
|
+
"Struct",
|
|
46
|
+
"Array",
|
|
47
|
+
"Integer",
|
|
48
|
+
"Double",
|
|
49
|
+
"Utf8",
|
|
32
50
|
]
|
|
33
51
|
|
|
34
52
|
|
|
35
53
|
class TypeGroup(str, Enum):
|
|
36
54
|
"""High-level type groups for column selection."""
|
|
55
|
+
|
|
37
56
|
Numeric = "Numeric"
|
|
38
57
|
String = "String"
|
|
39
58
|
Date = "Date"
|
|
@@ -51,6 +70,7 @@ class TypeGroup(str, Enum):
|
|
|
51
70
|
|
|
52
71
|
class DataType(str, Enum):
|
|
53
72
|
"""Specific data types for fine-grained control."""
|
|
73
|
+
|
|
54
74
|
# Numeric types
|
|
55
75
|
Int8 = "Int8"
|
|
56
76
|
Int16 = "Int16"
|
|
@@ -150,7 +170,7 @@ TypeSpec = Union[
|
|
|
150
170
|
TypeGroup,
|
|
151
171
|
DataType,
|
|
152
172
|
str,
|
|
153
|
-
|
|
173
|
+
list[TypeGroup | DataType | str | type[pl.DataType] | pl.DataType],
|
|
154
174
|
type[pl.DataType],
|
|
155
|
-
pl.DataType
|
|
175
|
+
pl.DataType,
|
|
156
176
|
]
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
from collections.abc import Callable, Iterator
|
|
2
|
+
|
|
1
3
|
import pyarrow as pa
|
|
2
|
-
|
|
4
|
+
|
|
3
5
|
from flowfile_core.configs import logger
|
|
4
6
|
|
|
5
7
|
|
|
@@ -36,7 +38,7 @@ def open_validated_file(file_path: str, n: int) -> pa.OSFile:
|
|
|
36
38
|
logger.error(f"Invalid file_path type: {type(file_path)}")
|
|
37
39
|
raise TypeError("file_path must be a string")
|
|
38
40
|
try:
|
|
39
|
-
file = pa.OSFile(file_path,
|
|
41
|
+
file = pa.OSFile(file_path, "rb")
|
|
40
42
|
logger.info(f"Successfully opened file: {file_path}")
|
|
41
43
|
return file
|
|
42
44
|
except FileNotFoundError:
|
|
@@ -112,7 +114,7 @@ def iter_batches(reader: pa.ipc.RecordBatchFileReader, n: int, rows_collected: i
|
|
|
112
114
|
break
|
|
113
115
|
|
|
114
116
|
|
|
115
|
-
def collect_batches(reader: pa.ipc.RecordBatchFileReader, n: int) ->
|
|
117
|
+
def collect_batches(reader: pa.ipc.RecordBatchFileReader, n: int) -> tuple[list[pa.RecordBatch], int]:
|
|
116
118
|
"""
|
|
117
119
|
Collect record batches from a reader up to a specified number of rows.
|
|
118
120
|
|
|
@@ -134,11 +136,10 @@ def collect_batches(reader: pa.ipc.RecordBatchFileReader, n: int) -> Tuple[List[
|
|
|
134
136
|
>>> print(f"Collected {row_count} rows in {len(batches)} batches")
|
|
135
137
|
"""
|
|
136
138
|
logger.debug(f"Collecting batches up to {n} rows")
|
|
137
|
-
batches:
|
|
139
|
+
batches: list[pa.RecordBatch] = []
|
|
138
140
|
rows_collected = 0
|
|
139
141
|
|
|
140
142
|
for batch in iter_batches(reader, n, rows_collected):
|
|
141
|
-
|
|
142
143
|
rows_collected += batch.num_rows
|
|
143
144
|
logger.debug(f"Collected batch: total rows now {rows_collected}")
|
|
144
145
|
if rows_collected >= n:
|
|
@@ -178,7 +179,7 @@ def read(file_path: str) -> pa.Table:
|
|
|
178
179
|
logger.info(f"Reading entire file: {file_path}")
|
|
179
180
|
with open_validated_file(file_path, 0) as source:
|
|
180
181
|
reader = create_reader(source)
|
|
181
|
-
batches, total_rows = collect_batches(reader, float(
|
|
182
|
+
batches, total_rows = collect_batches(reader, float("inf"))
|
|
182
183
|
table = pa.Table.from_batches(batches) # type: ignore
|
|
183
184
|
logger.info(f"Successfully read {total_rows} rows from {file_path}")
|
|
184
185
|
return table
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import os
|
|
2
|
-
import fastexcel
|
|
3
|
-
from typing import List
|
|
4
2
|
from functools import lru_cache
|
|
5
3
|
|
|
4
|
+
import fastexcel
|
|
5
|
+
|
|
6
6
|
from flowfile_core.configs import logger
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
@lru_cache(maxsize=32)
|
|
10
|
-
def get_sheet_names(file_path: str) ->
|
|
10
|
+
def get_sheet_names(file_path: str) -> list[str] | None:
|
|
11
11
|
if not os.path.exists(file_path):
|
|
12
12
|
logger.error(f"File does not exist: {file_path}")
|
|
13
13
|
return
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import os
|
|
2
|
-
|
|
3
|
-
from typing import Tuple, Optional
|
|
2
|
+
|
|
4
3
|
from flowfile_core.configs import logger
|
|
4
|
+
from flowfile_core.schemas.input_schema import NewDirectory, RemoveItem, RemoveItemsInput
|
|
5
5
|
|
|
6
6
|
local_database_connection = None
|
|
7
7
|
|
|
8
8
|
|
|
9
|
-
def create_dir(new_directory: NewDirectory) ->
|
|
10
|
-
full_path: str = os.path.join(new_directory.source_path,new_directory.dir_name)
|
|
9
|
+
def create_dir(new_directory: NewDirectory) -> tuple[bool, Exception | None]:
|
|
10
|
+
full_path: str = os.path.join(new_directory.source_path, new_directory.dir_name)
|
|
11
11
|
try:
|
|
12
12
|
os.mkdir(full_path)
|
|
13
13
|
logger.info("Successfully created a new folder")
|
|
@@ -16,7 +16,7 @@ def create_dir(new_directory: NewDirectory) -> Tuple[bool, Optional[Exception]]:
|
|
|
16
16
|
return False, e
|
|
17
17
|
|
|
18
18
|
|
|
19
|
-
def remove_path(path: str) ->
|
|
19
|
+
def remove_path(path: str) -> tuple[bool, Exception | None]:
|
|
20
20
|
try:
|
|
21
21
|
os.remove(path)
|
|
22
22
|
logger.info(f"Succesfully removed {path}")
|
|
@@ -35,11 +35,11 @@ def remove_item(item_to_remove: RemoveItem):
|
|
|
35
35
|
os.rmdir(item_to_remove.path)
|
|
36
36
|
|
|
37
37
|
|
|
38
|
-
def remove_paths(remove_items: RemoveItemsInput) ->
|
|
38
|
+
def remove_paths(remove_items: RemoveItemsInput) -> tuple[bool, Exception | None]:
|
|
39
39
|
try:
|
|
40
40
|
for path in remove_items.paths:
|
|
41
41
|
remove_item(path)
|
|
42
|
-
logger.info(f
|
|
42
|
+
logger.info(f"Successfully removed {remove_items.paths}")
|
|
43
43
|
return True, None
|
|
44
44
|
except Exception as e:
|
|
45
45
|
return False, e
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
from
|
|
1
|
+
from functools import wraps
|
|
2
2
|
from inspect import isfunction
|
|
3
|
+
|
|
3
4
|
from loky import get_reusable_executor
|
|
4
|
-
|
|
5
|
-
from
|
|
6
|
-
import atexit
|
|
5
|
+
|
|
6
|
+
from flowfile_core.configs import logger
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
# process_executor: Uses loky for process-based parallelism
|
|
@@ -13,18 +13,18 @@ def process_executor(wait_on_completion: bool = False, max_workers: int = 12):
|
|
|
13
13
|
def executor(f):
|
|
14
14
|
@wraps(f)
|
|
15
15
|
def inner(*args, **kwargs):
|
|
16
|
-
logger.debug(f
|
|
17
|
-
logger.debug(f
|
|
16
|
+
logger.debug(f"Added task {f.__name__} to a process executor")
|
|
17
|
+
logger.debug(f"max_workers: {max_workers}")
|
|
18
18
|
|
|
19
19
|
# Create a new executor with the required number of workers
|
|
20
20
|
func_executor = get_reusable_executor(max_workers=max_workers, timeout=2, kill_workers=False, reuse=True)
|
|
21
21
|
r = func_executor.submit(f, *args, **kwargs)
|
|
22
22
|
if wait_on_completion:
|
|
23
23
|
result = r.result()
|
|
24
|
-
logger.info(f
|
|
24
|
+
logger.info(f"done executing {f.__name__}")
|
|
25
25
|
return result
|
|
26
26
|
|
|
27
|
-
logger.info(f
|
|
27
|
+
logger.info(f"done submitting {f.__name__} to a process executor")
|
|
28
28
|
return r
|
|
29
29
|
|
|
30
30
|
return inner
|
|
@@ -34,5 +34,3 @@ def process_executor(wait_on_completion: bool = False, max_workers: int = 12):
|
|
|
34
34
|
wait_on_completion = False
|
|
35
35
|
return executor(f)
|
|
36
36
|
return executor
|
|
37
|
-
|
|
38
|
-
|
flowfile_core/utils/utils.py
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import re
|
|
2
2
|
from itertools import chain
|
|
3
|
-
|
|
3
|
+
|
|
4
4
|
|
|
5
5
|
def camel_case_to_snake_case(text: str) -> str:
|
|
6
6
|
# Use a regular expression to find capital letters and replace them with _ followed by the lowercase letter
|
|
7
|
-
transformed_text = re.sub(r
|
|
7
|
+
transformed_text = re.sub(r"(?<!^)(?=[A-Z])", "_", text).lower()
|
|
8
8
|
return transformed_text
|
|
9
9
|
|
|
10
10
|
|
|
11
|
-
def ensure_similarity_dicts(datas:
|
|
11
|
+
def ensure_similarity_dicts(datas: list[dict], respect_order: bool = True):
|
|
12
12
|
all_cols = (data.keys() for data in datas)
|
|
13
13
|
if not respect_order:
|
|
14
14
|
unique_cols = set(chain(*all_cols))
|
|
@@ -44,4 +44,4 @@ def standardize_col_dtype(vals):
|
|
|
44
44
|
elif int in types and float in types:
|
|
45
45
|
return vals
|
|
46
46
|
else:
|
|
47
|
-
return [convert_to_string(v) for v in vals]
|
|
47
|
+
return [convert_to_string(v) for v in vals]
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
"""This script runs on run time and checks if all the nodes that are created have a function in the flow_graph as well
|
|
2
2
|
as have a component in flowfile_frontend"""
|
|
3
3
|
|
|
4
|
-
from flowfile_core.schemas import input_schema
|
|
5
|
-
from flowfile_core.flowfile.flow_graph import FlowGraph
|
|
6
|
-
from flowfile_core.configs.node_store import nodes_list, NodeTemplate
|
|
7
4
|
import inspect
|
|
8
5
|
|
|
6
|
+
from flowfile_core.configs.node_store import NodeTemplate, nodes_list
|
|
7
|
+
from flowfile_core.flowfile.flow_graph import FlowGraph
|
|
8
|
+
from flowfile_core.schemas import input_schema
|
|
9
|
+
|
|
9
10
|
|
|
10
11
|
def check_if_node_has_add_function_in_flow_graph(node: NodeTemplate):
|
|
11
12
|
func_name = "add_" + node.item
|
|
@@ -17,7 +18,7 @@ def check_if_node_has_add_function_in_flow_graph(node: NodeTemplate):
|
|
|
17
18
|
|
|
18
19
|
|
|
19
20
|
def check_if_node_has_input_schema_definition(node: NodeTemplate):
|
|
20
|
-
if "node"+node.item.replace("_","") not in {k.lower() for k in inspect.getmodule(input_schema).__dict__.keys()}:
|
|
21
|
+
if "node" + node.item.replace("_", "") not in {k.lower() for k in inspect.getmodule(input_schema).__dict__.keys()}:
|
|
21
22
|
raise ValueError(
|
|
22
23
|
f"Node {node.name} ({node.item}) does not have a corresponding input schema definition in input_schema.py."
|
|
23
24
|
"Check if the schema is implemented or if the node item is correct."
|
flowfile_frame/__init__.py
CHANGED
|
@@ -1,69 +1,124 @@
|
|
|
1
1
|
# flowframe/__init__.py
|
|
2
2
|
"""A Polars-like API for building ETL graphs."""
|
|
3
3
|
|
|
4
|
-
from importlib.metadata import version
|
|
4
|
+
from importlib.metadata import PackageNotFoundError, version
|
|
5
5
|
|
|
6
|
-
# Core classes
|
|
7
|
-
from flowfile_frame.flow_frame import FlowFrame # noqa: F401
|
|
8
6
|
from pl_fuzzy_frame_match.models import FuzzyMapping # noqa: F401
|
|
7
|
+
from polars.datatypes import ( # noqa: F401
|
|
8
|
+
Array,
|
|
9
|
+
Binary,
|
|
10
|
+
# Other primitive types
|
|
11
|
+
Boolean,
|
|
12
|
+
# Special types
|
|
13
|
+
Categorical,
|
|
14
|
+
# Type classes
|
|
15
|
+
DataType,
|
|
16
|
+
DataTypeClass,
|
|
17
|
+
# Date/time types
|
|
18
|
+
Date,
|
|
19
|
+
Datetime,
|
|
20
|
+
Decimal,
|
|
21
|
+
Duration,
|
|
22
|
+
Enum,
|
|
23
|
+
Field,
|
|
24
|
+
# Float types
|
|
25
|
+
Float32,
|
|
26
|
+
Float64,
|
|
27
|
+
# Integer types
|
|
28
|
+
Int8,
|
|
29
|
+
Int16,
|
|
30
|
+
Int32,
|
|
31
|
+
Int64,
|
|
32
|
+
Int128,
|
|
33
|
+
IntegerType,
|
|
34
|
+
# Complex types
|
|
35
|
+
List,
|
|
36
|
+
Null,
|
|
37
|
+
Object,
|
|
38
|
+
String,
|
|
39
|
+
Struct,
|
|
40
|
+
TemporalType,
|
|
41
|
+
Time,
|
|
42
|
+
UInt8,
|
|
43
|
+
UInt16,
|
|
44
|
+
UInt32,
|
|
45
|
+
UInt64,
|
|
46
|
+
Unknown,
|
|
47
|
+
Utf8,
|
|
48
|
+
)
|
|
9
49
|
|
|
10
|
-
from flowfile_frame.
|
|
50
|
+
from flowfile_frame.cloud_storage.secret_manager import (
|
|
51
|
+
create_cloud_storage_connection,
|
|
52
|
+
create_cloud_storage_connection_if_not_exists,
|
|
53
|
+
del_cloud_storage_connection,
|
|
54
|
+
get_all_available_cloud_storage_connections,
|
|
55
|
+
)
|
|
11
56
|
|
|
12
57
|
# Commonly used functions
|
|
13
58
|
from flowfile_frame.expr import ( # noqa: F401
|
|
14
|
-
col,
|
|
15
|
-
|
|
16
|
-
|
|
59
|
+
col,
|
|
60
|
+
column,
|
|
61
|
+
corr,
|
|
62
|
+
count,
|
|
63
|
+
cov,
|
|
64
|
+
cum_count,
|
|
65
|
+
first,
|
|
66
|
+
implode,
|
|
67
|
+
last,
|
|
68
|
+
len,
|
|
69
|
+
lit,
|
|
70
|
+
max,
|
|
71
|
+
mean,
|
|
72
|
+
min,
|
|
73
|
+
sum,
|
|
74
|
+
when,
|
|
17
75
|
)
|
|
18
76
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
# Selector utilities
|
|
22
|
-
from flowfile_frame.selectors import ( # noqa: F401
|
|
23
|
-
numeric, float_, integer, string, temporal,
|
|
24
|
-
datetime, date, time, duration, boolean,
|
|
25
|
-
categorical, object_, list_, struct, all_,
|
|
26
|
-
by_dtype, contains, starts_with, ends_with, matches
|
|
27
|
-
)
|
|
28
|
-
|
|
29
|
-
from flowfile_frame.series import Series
|
|
77
|
+
# Core classes
|
|
78
|
+
from flowfile_frame.flow_frame import FlowFrame # noqa: F401
|
|
30
79
|
|
|
31
80
|
# File I/O
|
|
32
81
|
from flowfile_frame.flow_frame_methods import ( # noqa: F401
|
|
33
|
-
|
|
34
|
-
|
|
82
|
+
concat,
|
|
83
|
+
from_dict,
|
|
84
|
+
read_csv,
|
|
85
|
+
read_parquet,
|
|
86
|
+
scan_csv,
|
|
35
87
|
scan_csv_from_cloud_storage,
|
|
36
|
-
scan_delta
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
from polars.datatypes import ( # noqa: F401
|
|
44
|
-
# Integer types
|
|
45
|
-
Int8, Int16, Int32, Int64, Int128,
|
|
46
|
-
UInt8, UInt16, UInt32, UInt64,
|
|
47
|
-
IntegerType,
|
|
48
|
-
|
|
49
|
-
# Float types
|
|
50
|
-
Float32, Float64,
|
|
51
|
-
|
|
52
|
-
# Other primitive types
|
|
53
|
-
Boolean, String, Utf8, Binary, Null,
|
|
54
|
-
|
|
55
|
-
# Complex types
|
|
56
|
-
List, Array, Struct, Object,
|
|
57
|
-
|
|
58
|
-
# Date/time types
|
|
59
|
-
Date, Time, Datetime, Duration,
|
|
60
|
-
TemporalType,
|
|
61
|
-
|
|
62
|
-
# Special types
|
|
63
|
-
Categorical, Decimal, Enum, Unknown,
|
|
88
|
+
scan_delta,
|
|
89
|
+
scan_json_from_cloud_storage,
|
|
90
|
+
scan_parquet,
|
|
91
|
+
scan_parquet_from_cloud_storage,
|
|
92
|
+
)
|
|
93
|
+
from flowfile_frame.lazy import fold
|
|
64
94
|
|
|
65
|
-
|
|
66
|
-
|
|
95
|
+
# Selector utilities
|
|
96
|
+
from flowfile_frame.selectors import ( # noqa: F401
|
|
97
|
+
all_,
|
|
98
|
+
boolean,
|
|
99
|
+
by_dtype,
|
|
100
|
+
categorical,
|
|
101
|
+
contains,
|
|
102
|
+
date,
|
|
103
|
+
datetime,
|
|
104
|
+
duration,
|
|
105
|
+
ends_with,
|
|
106
|
+
float_,
|
|
107
|
+
integer,
|
|
108
|
+
list_,
|
|
109
|
+
matches,
|
|
110
|
+
numeric,
|
|
111
|
+
object_,
|
|
112
|
+
starts_with,
|
|
113
|
+
string,
|
|
114
|
+
struct,
|
|
115
|
+
temporal,
|
|
116
|
+
time,
|
|
67
117
|
)
|
|
118
|
+
from flowfile_frame.series import Series
|
|
119
|
+
from flowfile_frame.utils import create_flow_graph # noqa: F401
|
|
68
120
|
|
|
69
|
-
|
|
121
|
+
try:
|
|
122
|
+
__version__ = version("Flowfile")
|
|
123
|
+
except PackageNotFoundError:
|
|
124
|
+
__version__ = "0.5.0"
|
flowfile_frame/adapters.py
CHANGED
|
@@ -2,16 +2,9 @@
|
|
|
2
2
|
"""Adapters to connect FlowFrame with the flowfile-core library."""
|
|
3
3
|
|
|
4
4
|
# Import from your existing project
|
|
5
|
-
from flowfile_core.flowfile.flow_graph import FlowGraph, add_connection
|
|
6
5
|
from flowfile_core.flowfile.flow_data_engine.flow_data_engine import FlowDataEngine
|
|
6
|
+
from flowfile_core.flowfile.flow_graph import FlowGraph, add_connection
|
|
7
7
|
from flowfile_core.schemas import input_schema, schemas, transform_schema
|
|
8
8
|
|
|
9
9
|
# Export these for use in FlowFrame
|
|
10
|
-
__all__ = [
|
|
11
|
-
'FlowGraph',
|
|
12
|
-
'add_connection',
|
|
13
|
-
'FlowDataEngine',
|
|
14
|
-
'input_schema',
|
|
15
|
-
'schemas',
|
|
16
|
-
'transform_schema'
|
|
17
|
-
]
|
|
10
|
+
__all__ = ["FlowGraph", "add_connection", "FlowDataEngine", "input_schema", "schemas", "transform_schema"]
|