Flowfile 0.2.2__tar.gz → 0.3.0.1__tar.gz
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.
Potentially problematic release.
This version of Flowfile might be problematic. Click here for more details.
- flowfile-0.3.0.1/PKG-INFO +219 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile/__init__.py +14 -7
- flowfile-0.3.0.1/flowfile/__main__.py +60 -0
- flowfile-0.3.0.1/flowfile/api.py +379 -0
- flowfile-0.3.0.1/flowfile/web/__init__.py +155 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/AirbyteReader-1ac35765.css +314 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/AirbyteReader-cb0c1d4a.js +921 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/CrossJoin-41efa4cb.css +100 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/CrossJoin-a514fa59.js +153 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/DatabaseConnectionSettings-0c04b2e5.css +77 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/DatabaseConnectionSettings-f2cecf33.js +151 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/DatabaseManager-30fa27e5.css +64 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/DatabaseManager-83ee3c98.js +484 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/DatabaseReader-dc0c6881.js +426 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/DatabaseReader-f50c6558.css +158 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/DatabaseWriter-2f570e53.css +96 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/DatabaseWriter-5afe9f8d.js +312 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/ExploreData-5bdae813.css +45 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/ExploreData-c7ee19cf.js +118306 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/ExternalSource-17b23a01.js +225 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/ExternalSource-e37b6275.css +94 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/Filter-90856b4f.js +238 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/Filter-a9d08ba1.css +20 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/Formula-38b71e9e.js +197 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/Formula-d60a74f4.css +17 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/FuzzyMatch-6857de82.css +254 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/FuzzyMatch-d0f1fe81.js +422 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/GoogleSheet-854294a4.js +2616 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/GoogleSheet-92084da7.css +233 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/GraphSolver-0c86bbc6.js +382 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/GraphSolver-17fd26db.css +68 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/GroupBy-ab1ea74b.css +51 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/GroupBy-f2772e9f.js +413 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/Join-41c0f331.css +109 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/Join-bc3e1cf7.js +247 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/ManualInput-03aa0245.js +391 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/ManualInput-ac7b9972.css +84 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/Output-48f81019.css +2642 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/Output-5b35eee8.js +536 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/Pivot-7164087c.js +408 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/Pivot-f415e85f.css +35 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/PolarsCode-3abf6507.js +2863 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/PolarsCode-650322d1.css +35 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/PopOver-b37ff9be.js +577 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/PopOver-bccfde04.css +32 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/Read-65966a3e.js +701 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/Read-80dc1675.css +197 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/RecordCount-c66c6d6d.js +121 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/RecordId-826dc095.js +339 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/Sample-4ed555c8.js +184 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/SecretManager-eac1e97d.js +382 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/Select-085f05cc.js +231 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/SettingsSection-1f5e79c1.js +87 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/SettingsSection-9c836ecc.css +47 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/Sort-3e6cb414.js +309 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/Sort-7ccfa0fe.css +51 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/TextToRows-606349bc.js +307 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/TextToRows-c92d1ec2.css +48 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/UnavailableFields-5edd5322.css +49 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/UnavailableFields-b41976ed.js +36 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/Union-8d9ac7f9.css +30 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/Union-fca91665.js +145 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/Unique-a59f830e.js +273 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/Unique-b5615727.css +51 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/Unpivot-246e9bbd.css +77 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/Unpivot-c3815565.js +441 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/airbyte-292aa232.png +0 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/api-22b338bd.js +60 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/cross_join-d30c0290.png +0 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/database_reader-ce1e55f3.svg +24 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/database_writer-b4ad0753.svg +23 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/designer-2394122a.css +10697 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/designer-e5bbe26f.js +69712 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/documentation-08045cf2.js +33 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/documentation-12216a74.css +50 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/dropDown-35135ba8.css +143 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/dropDown-5e7e9a5a.js +319 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/dropDownGeneric-50a91b99.js +72 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/dropDownGeneric-895680d6.css +10 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/element-icons-9c88a535.woff +0 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/element-icons-de5eb258.ttf +0 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/explore_data-8a0a2861.png +0 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/fa-brands-400-808443ae.ttf +0 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/fa-brands-400-d7236a19.woff2 +0 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/fa-regular-400-54cf6086.ttf +0 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/fa-regular-400-e3456d12.woff2 +0 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/fa-solid-900-aa759986.woff2 +0 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/fa-solid-900-d2f05935.ttf +0 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/fa-v4compatibility-0ce9033c.woff2 +0 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/fa-v4compatibility-30f6abf6.ttf +0 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/filter-d7708bda.png +0 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/formula-eeeb1611.png +0 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/fullEditor-178376bb.css +256 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/fullEditor-705c6ccb.js +630 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/fuzzy_match-40c161b2.png +0 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/genericNodeSettings-65587f20.js +137 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/genericNodeSettings-924759c7.css +46 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/graph_solver-8b7888b8.png +0 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/group_by-80561fc3.png +0 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/index-552863fd.js +58652 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/index-681a3ed0.css +8843 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/input_data-ab2eb678.png +0 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/join-349043ae.png +0 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/manual_input-ae98f31d.png +0 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/nodeTitle-cf9bae3c.js +227 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/nodeTitle-f4b12bcb.css +134 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/old_join-5d0eb604.png +0 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/output-06ec0371.png +0 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/pivot-9660df51.png +0 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/polars_code-05ce5dc6.png +0 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/record_count-dab44eb5.png +0 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/record_id-0b15856b.png +0 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/sample-693a88b5.png +0 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/secretApi-3ad510e1.js +46 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/select-b0d0437a.png +0 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/selectDynamic-b062bc9b.css +107 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/selectDynamic-bd644891.js +302 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/sort-2aa579f0.png +0 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/summarize-2a099231.png +0 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/text_to_rows-859b29ea.png +0 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/union-2d8609f4.png +0 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/unique-1958b98a.png +0 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/unpivot-d3cb4b5b.png +0 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/view-7a0f0be1.png +0 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/vue-codemirror.esm-dd17b478.js +22281 -0
- flowfile-0.3.0.1/flowfile/web/static/assets/vue-content-loader.es-6b36f05e.js +210 -0
- flowfile-0.3.0.1/flowfile/web/static/flowfile.svg +47 -0
- flowfile-0.3.0.1/flowfile/web/static/icons/flowfile.png +0 -0
- flowfile-0.3.0.1/flowfile/web/static/images/airbyte.png +0 -0
- flowfile-0.3.0.1/flowfile/web/static/images/flowfile.svg +47 -0
- flowfile-0.3.0.1/flowfile/web/static/images/google.svg +1 -0
- flowfile-0.3.0.1/flowfile/web/static/images/sheets.png +0 -0
- flowfile-0.3.0.1/flowfile/web/static/index.html +22 -0
- flowfile-0.3.0.1/flowfile/web/static/vite.svg +1 -0
- flowfile-0.3.0.1/flowfile/web/static/vue.svg +1 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/configs/settings.py +7 -32
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/FlowfileFlow.py +4 -2
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/analytics/analytics_processor.py +1 -1
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/main.py +4 -1
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/schemas/input_schema.py +1 -8
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_frame/flowfile_frame/__init__.py +1 -2
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_frame/flowfile_frame/flow_frame.py +6 -6
- flowfile-0.3.0.1/flowfile_frame/flowfile_frame/utils.py +45 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/pyproject.toml +7 -3
- flowfile-0.3.0.1/readme-pypi.md +175 -0
- flowfile-0.2.2/PKG-INFO +0 -225
- flowfile-0.2.2/README.md +0 -181
- flowfile-0.2.2/flowfile/__main__.py +0 -24
- flowfile-0.2.2/flowfile_frame/flowfile_frame/__main__.py +0 -12
- flowfile-0.2.2/flowfile_frame/flowfile_frame/utils.py +0 -184
- {flowfile-0.2.2 → flowfile-0.3.0.1}/LICENSE +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/build_backends/build_backends/__init__.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/build_backends/build_backends/main.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/build_backends/build_backends/main_prd.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/__init__.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/auth/__init__.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/auth/jwt.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/auth/models.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/auth/secrets.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/configs/__init__.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/configs/flow_logger.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/configs/node_store/__init__.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/configs/node_store/nodes.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/database/__init__.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/database/connection.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/database/init_db.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/database/models.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/fileExplorer/__init__.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/fileExplorer/funcs.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/fileExplorer/utils.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/__init__.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/_extensions/__init__.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/_extensions/real_time_interface.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/analytics/__init__.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/analytics/graphic_walker.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/analytics/schemas/__init__.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/analytics/utils.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/connection_manager/__init__.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/connection_manager/_connection_manager.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/connection_manager/models.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/database_connection_manager/__init__.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/database_connection_manager/db_connections.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/database_connection_manager/models.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/extensions.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/flow_data_engine/__init__.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/flow_data_engine/create/__init__.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/flow_data_engine/create/funcs.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/flow_data_engine/flow_data_engine.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/flow_data_engine/flow_file_column/__init__.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/flow_data_engine/flow_file_column/main.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/flow_data_engine/flow_file_column/polars_type.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/flow_data_engine/flow_file_column/utils.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/flow_data_engine/fuzzy_matching/__init__.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/flow_data_engine/fuzzy_matching/prepare_for_fuzzy_match.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/flow_data_engine/fuzzy_matching/settings_validator.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/flow_data_engine/join/__init__.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/flow_data_engine/join/verify_integrity.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/flow_data_engine/pivot_table.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/flow_data_engine/polars_code_parser.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/flow_data_engine/read_excel_tables.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/flow_data_engine/sample_data.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/flow_data_engine/subprocess_operations/__init__.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/flow_data_engine/subprocess_operations/models.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/flow_data_engine/subprocess_operations/subprocess_operations.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/flow_data_engine/threaded_processes.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/flow_data_engine/types.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/flow_data_engine/utils.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/flow_node/__init__.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/flow_node/flow_node.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/flow_node/models.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/flow_node/schema_callback.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/handler.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/manage/__init__.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/manage/compatibility_enhancements.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/manage/manage_flowfile.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/manage/open_flowfile.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/setting_generator/__init__.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/setting_generator/setting_generator.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/setting_generator/settings.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/sources/__init__.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/sources/external_sources/__init__.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/sources/external_sources/airbyte_sources/__init__.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/sources/external_sources/airbyte_sources/airbyte.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/sources/external_sources/airbyte_sources/models.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/sources/external_sources/airbyte_sources/settings.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/sources/external_sources/base_class.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/sources/external_sources/custom_external_sources/__init__.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/sources/external_sources/custom_external_sources/exchange_rate.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/sources/external_sources/custom_external_sources/external_source.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/sources/external_sources/custom_external_sources/google_sheet.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/sources/external_sources/custom_external_sources/sample_users.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/sources/external_sources/factory.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/sources/external_sources/sql_source/__init__.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/sources/external_sources/sql_source/models.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/sources/external_sources/sql_source/sql_source.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/sources/external_sources/sql_source/utils.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/util/__init__.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/util/calculate_layout.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/util/execution_orderer.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/flowfile/utils.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/routes/__init__.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/routes/auth.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/routes/logs.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/routes/public.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/routes/routes.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/routes/secrets.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/run_lock.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/schemas/__init__.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/schemas/analysis_schemas/__init__.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/schemas/analysis_schemas/graphic_walker_schemas.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/schemas/defaults.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/schemas/external_sources/__init__.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/schemas/external_sources/airbyte_schemas.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/schemas/models.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/schemas/output_model.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/schemas/schemas.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/schemas/transform_schema.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/secrets/__init__.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/secrets/secrets.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/utils/__init__.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/utils/arrow_reader.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/utils/excel_file_manager.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/utils/fileManager.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/utils/fl_executor.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_core/flowfile_core/utils/utils.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_frame/flowfile_frame/adapters.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_frame/flowfile_frame/expr.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_frame/flowfile_frame/group_frame.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_frame/flowfile_frame/join.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_frame/flowfile_frame/selectors.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_worker/flowfile_worker/__init__.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_worker/flowfile_worker/configs.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_worker/flowfile_worker/create/__init__.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_worker/flowfile_worker/create/funcs.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_worker/flowfile_worker/create/models.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_worker/flowfile_worker/create/pl_types.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_worker/flowfile_worker/create/read_excel_tables.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_worker/flowfile_worker/create/utils.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_worker/flowfile_worker/external_sources/__init__.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_worker/flowfile_worker/external_sources/airbyte_sources/__init__.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_worker/flowfile_worker/external_sources/airbyte_sources/cache_manager.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_worker/flowfile_worker/external_sources/airbyte_sources/main.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_worker/flowfile_worker/external_sources/airbyte_sources/models.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_worker/flowfile_worker/external_sources/airbyte_sources/settings.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_worker/flowfile_worker/external_sources/sql_source/__init__.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_worker/flowfile_worker/external_sources/sql_source/main.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_worker/flowfile_worker/external_sources/sql_source/models.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_worker/flowfile_worker/flow_logger.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_worker/flowfile_worker/funcs.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_worker/flowfile_worker/main.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_worker/flowfile_worker/models.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_worker/flowfile_worker/polars_fuzzy_match/__init__.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_worker/flowfile_worker/polars_fuzzy_match/matcher.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_worker/flowfile_worker/polars_fuzzy_match/models.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_worker/flowfile_worker/polars_fuzzy_match/pre_process.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_worker/flowfile_worker/polars_fuzzy_match/process.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_worker/flowfile_worker/polars_fuzzy_match/utils.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_worker/flowfile_worker/process_manager.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_worker/flowfile_worker/routes.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_worker/flowfile_worker/secrets.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_worker/flowfile_worker/spawner.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/flowfile_worker/flowfile_worker/utils.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/test_utils/__init__.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/test_utils/postgres/__init__.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/test_utils/postgres/commands.py +0 -0
- {flowfile-0.2.2 → flowfile-0.3.0.1}/test_utils/postgres/fixtures.py +0 -0
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
Metadata-Version: 2.3
|
|
2
|
+
Name: Flowfile
|
|
3
|
+
Version: 0.3.0.1
|
|
4
|
+
Summary: Project combining flowfile core (backend) and flowfile_worker (compute offloader) and flowfile_frame (api)
|
|
5
|
+
Author: Edward van Eechoud
|
|
6
|
+
Author-email: evaneechoud@gmail.com
|
|
7
|
+
Requires-Python: >=3.10,<3.13
|
|
8
|
+
Classifier: Programming Language :: Python :: 3
|
|
9
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
10
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
11
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
12
|
+
Requires-Dist: XlsxWriter (>=3.2.0,<3.3.0)
|
|
13
|
+
Requires-Dist: aiofiles (>=24.1.0,<25.0.0)
|
|
14
|
+
Requires-Dist: airbyte-cdk (==6.47.2)
|
|
15
|
+
Requires-Dist: bcrypt (>=4.3.0,<5.0.0)
|
|
16
|
+
Requires-Dist: connectorx (>=0.4.2,<0.5.0)
|
|
17
|
+
Requires-Dist: databases (>=0.9.0,<0.10.0)
|
|
18
|
+
Requires-Dist: faker (>=23.1.0,<23.2.0)
|
|
19
|
+
Requires-Dist: fastapi (>=0.115.2,<0.116.0)
|
|
20
|
+
Requires-Dist: fastexcel (>=0.12.0,<0.13.0)
|
|
21
|
+
Requires-Dist: google-api-python-client (>=2.149.0,<2.150.0)
|
|
22
|
+
Requires-Dist: gspread (>=6.1.3,<6.2.0)
|
|
23
|
+
Requires-Dist: loky (>=3.4.1,<3.5.0)
|
|
24
|
+
Requires-Dist: methodtools (>=0.4.7,<0.5.0)
|
|
25
|
+
Requires-Dist: openpyxl (>=3.1.2,<3.2.0)
|
|
26
|
+
Requires-Dist: passlib (>=1.7.4,<1.8.0)
|
|
27
|
+
Requires-Dist: pendulum (==2.1.2) ; python_version < "3.12"
|
|
28
|
+
Requires-Dist: polars (>1.8.2,<=1.25.2)
|
|
29
|
+
Requires-Dist: polars-distance (>=0.4.3,<0.5.0)
|
|
30
|
+
Requires-Dist: polars-ds (>=0.6.0)
|
|
31
|
+
Requires-Dist: polars-expr-transformer (>0.4.7.0)
|
|
32
|
+
Requires-Dist: polars-grouper (>=0.3.0,<0.4.0)
|
|
33
|
+
Requires-Dist: polars_simed (>=0.3.4,<0.4.0)
|
|
34
|
+
Requires-Dist: pyairbyte-flowfile (==0.20.2)
|
|
35
|
+
Requires-Dist: pyarrow (>=18.0.0,<19.0.0)
|
|
36
|
+
Requires-Dist: pydantic (>=2.9.2,<2.10.0)
|
|
37
|
+
Requires-Dist: pyinstaller (>=6.11.0,<7.0.0)
|
|
38
|
+
Requires-Dist: pytest (>=8.3.4,<9.0.0)
|
|
39
|
+
Requires-Dist: python-jose (>=3.4.0,<4.0.0)
|
|
40
|
+
Requires-Dist: python-multipart (>=0.0.12,<0.1.0)
|
|
41
|
+
Requires-Dist: uvicorn (>=0.32.0,<0.33.0)
|
|
42
|
+
Description-Content-Type: text/markdown
|
|
43
|
+
|
|
44
|
+
<h1 align="center">
|
|
45
|
+
<img src="https://raw.githubusercontent.com/Edwardvaneechoud/Flowfile/main/.github/images/logo.png" alt="Flowfile Logo" width="100">
|
|
46
|
+
<br>
|
|
47
|
+
Flowfile
|
|
48
|
+
</h1>
|
|
49
|
+
|
|
50
|
+
<p align="center">
|
|
51
|
+
<b>Main Repository</b>: <a href="https://github.com/Edwardvaneechoud/Flowfile">Edwardvaneechoud/Flowfile</a><br>
|
|
52
|
+
<b>Documentation</b>:
|
|
53
|
+
<a href="https://edwardvaneechoud.github.io/Flowfile/">Website</a> -
|
|
54
|
+
<a href="https://github.com/Edwardvaneechoud/Flowfile/blob/main/flowfile_core/README.md">Core</a> -
|
|
55
|
+
<a href="https://github.com/Edwardvaneechoud/Flowfile/blob/main/flowfile_worker/README.md">Worker</a> -
|
|
56
|
+
<a href="https://github.com/Edwardvaneechoud/Flowfile/blob/main/flowfile_frontend/README.md">Frontend</a> -
|
|
57
|
+
<a href="https://dev.to/edwardvaneechoud/building-flowfile-architecting-a-visual-etl-tool-with-polars-576c">Technical Architecture</a>
|
|
58
|
+
</p>
|
|
59
|
+
|
|
60
|
+
<p>
|
|
61
|
+
Flowfile is a visual ETL tool and Python library suite that combines drag-and-drop workflow building with the speed of Polars dataframes. Build data pipelines visually, transform data using powerful nodes, or define data flows programmatically with Python and analyze results - all with high-performance data processing.
|
|
62
|
+
</p>
|
|
63
|
+
|
|
64
|
+
<div align="center">
|
|
65
|
+
<img src="https://raw.githubusercontent.com/Edwardvaneechoud/Flowfile/main/.github/images/group_by_screenshot.png" alt="Flowfile Interface" width="800"/>
|
|
66
|
+
</div>
|
|
67
|
+
|
|
68
|
+
## ⚡ Technical Design
|
|
69
|
+
|
|
70
|
+
The `Flowfile` PyPI package provides the backend services and the `flowfile_frame` Python library:
|
|
71
|
+
|
|
72
|
+
- **Core (`flowfile_core`)** (FastAPI): The main ETL engine using Polars for high-performance data transformations. Typically runs on port `:63578`.
|
|
73
|
+
- **Worker (`flowfile_worker`)** (FastAPI): Handles computation-intensive tasks and caching of data operations, supporting the Core service. Typically runs on port `:63579`.
|
|
74
|
+
- **FlowFrame API (`flowfile_frame`)**: A Python library with a Polars-like API for defining data manipulation pipelines programmatically, which also generates an underlying ETL graph compatible with the Flowfile ecosystem.
|
|
75
|
+
|
|
76
|
+
Each flow is represented as a directed acyclic graph (DAG), where nodes represent data operations and edges represent data flow between operations.
|
|
77
|
+
|
|
78
|
+
For a deeper dive into the technical architecture, check out [this article](https://dev.to/edwardvaneechoud/building-flowfile-architecting-a-visual-etl-tool-with-polars-576c) on how Flowfile leverages Polars for efficient data processing.
|
|
79
|
+
|
|
80
|
+
## ✨ Introducing FlowFile Frame - A Polars-Like API for ETL
|
|
81
|
+
|
|
82
|
+
FlowFile Frame is a Python library that provides a familiar Polars-like API for data manipulation, while simultaneously building an ETL (Extract, Transform, Load) graph under the hood. This allows you to:
|
|
83
|
+
|
|
84
|
+
1. Write data transformation code using a simple, Pandas/Polars-like API
|
|
85
|
+
2. Automatically generate executable ETL workflows compatible with the Flowfile ecosystem
|
|
86
|
+
3. Visualize, save, and share your data pipelines
|
|
87
|
+
4. Get the performance benefits of Polars with the traceability of ETL graphs
|
|
88
|
+
|
|
89
|
+
### FlowFrame Quick Start
|
|
90
|
+
|
|
91
|
+
```python
|
|
92
|
+
import flowfile_frame as ff
|
|
93
|
+
from flowfile_frame.utils import open_graph_in_editor
|
|
94
|
+
|
|
95
|
+
# Create a complex data pipeline
|
|
96
|
+
df = ff.from_dict({
|
|
97
|
+
"id": [1, 2, 3, 4, 5],
|
|
98
|
+
"category": ["A", "B", "A", "C", "B"],
|
|
99
|
+
"value": [100, 200, 150, 300, 250]
|
|
100
|
+
})
|
|
101
|
+
|
|
102
|
+
open_graph_in_editor(df.flow_graph)
|
|
103
|
+
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### Key FlowFrame Features
|
|
107
|
+
|
|
108
|
+
- **Familiar API**: Based on Polars, making it easy to learn if you know Pandas or Polars
|
|
109
|
+
- **ETL Graph Generation**: Automatically builds a directed acyclic graph of your data operations
|
|
110
|
+
- **Lazy Evaluation**: Operations are not executed until `collect()` or a write operation
|
|
111
|
+
- **Interoperability**: Saved `.flowfile` graphs can be opened in the visual Flowfile Designer
|
|
112
|
+
- **High Performance**: Leverages Polars for fast data processing
|
|
113
|
+
- **Reproducible**: Save and share your data transformation workflows
|
|
114
|
+
|
|
115
|
+
### Common FlowFrame Operations
|
|
116
|
+
|
|
117
|
+
```python
|
|
118
|
+
import flowfile_frame as ff
|
|
119
|
+
from flowfile_frame import col, when
|
|
120
|
+
|
|
121
|
+
# Create from dictionary
|
|
122
|
+
df = ff.from_dict({
|
|
123
|
+
"id": [1, 2, 3],
|
|
124
|
+
"name": ["Alice", "Bob", "Charlie"],
|
|
125
|
+
"age": [25, 35, 28]
|
|
126
|
+
})
|
|
127
|
+
|
|
128
|
+
flow_graph = df.flow_graph
|
|
129
|
+
# Reading data
|
|
130
|
+
# df_csv = ff.read_csv("data.csv")
|
|
131
|
+
# df_parquet = ff.read_parquet("data.parquet")
|
|
132
|
+
|
|
133
|
+
# Filtering
|
|
134
|
+
adults = df.filter(col("age") >= 30)
|
|
135
|
+
|
|
136
|
+
# Select and transform
|
|
137
|
+
result = df.select(
|
|
138
|
+
col("name"),
|
|
139
|
+
(col("age") * 2).alias("double_age")
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
# Add new columns
|
|
143
|
+
df_with_cols = df.with_columns([
|
|
144
|
+
(col("age") + 10).alias("future_age"),
|
|
145
|
+
when(col("age") >= 30).then(ff.lit("Senior")).otherwise(ff.lit("Junior")).alias("status")]
|
|
146
|
+
)
|
|
147
|
+
|
|
148
|
+
# Group by and aggregate
|
|
149
|
+
df_sales = ff.from_dict({
|
|
150
|
+
"region": ["North", "South", "North", "South"],
|
|
151
|
+
"sales": [100, 200, 150, 300]
|
|
152
|
+
})
|
|
153
|
+
sales_by_region = df_sales.group_by("region").agg([
|
|
154
|
+
col("sales").sum().alias("total_sales"),
|
|
155
|
+
col("sales").mean().alias("avg_sales")
|
|
156
|
+
])
|
|
157
|
+
|
|
158
|
+
# Joins
|
|
159
|
+
customers = ff.from_dict({"id": [1, 2, 3], "name": ["Alice", "Bob", "Charlie"]}, flow_graph=flow_graph)
|
|
160
|
+
orders = ff.from_dict({"id": [101, 102], "customer_id": [1, 2], "amount": [100, 200]}, flow_graph=flow_graph)
|
|
161
|
+
joined = customers.join(orders, left_on="id", right_on="customer_id")
|
|
162
|
+
|
|
163
|
+
# Save and visualize ETL graph
|
|
164
|
+
|
|
165
|
+
result.save_graph("my_pipeline.flowfile")
|
|
166
|
+
# open_graph_in_editor(result.flow_graph, "my_pipeline.flowfile") # Opens in Designer UI if installed
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
For more detailed information on all available operations, including pivoting, window functions, complex workflows, and more, please refer to the [FlowFrame documentation](https://github.com/Edwardvaneechoud/Flowfile/blob/main/flowfile_frame/README.md).
|
|
170
|
+
|
|
171
|
+
## 🔥 Example Use Cases
|
|
172
|
+
|
|
173
|
+
Flowfile is great for:
|
|
174
|
+
|
|
175
|
+
- **Data Cleaning & Transformation**
|
|
176
|
+
- Complex joins (fuzzy matching)
|
|
177
|
+
- Text-to-rows transformations
|
|
178
|
+
- Advanced filtering and grouping
|
|
179
|
+
- Custom formulas and expressions
|
|
180
|
+
- Filter data based on conditions
|
|
181
|
+
|
|
182
|
+
- **Performance**
|
|
183
|
+
- Built to scale out of core
|
|
184
|
+
- Using Polars for data processing
|
|
185
|
+
|
|
186
|
+
- **Data Integration**
|
|
187
|
+
- Standardize data formats
|
|
188
|
+
- Handle messy Excel files
|
|
189
|
+
|
|
190
|
+
- **ETL Operations**
|
|
191
|
+
- Data quality checks
|
|
192
|
+
|
|
193
|
+
(For more visual examples of these use cases, please see our [main GitHub repository](https://github.com/Edwardvaneechoud/Flowfile#-example-use-cases)).
|
|
194
|
+
|
|
195
|
+
## 🚀 Getting Started
|
|
196
|
+
|
|
197
|
+
### Installing the Flowfile Python Package
|
|
198
|
+
|
|
199
|
+
This package provides the `flowfile_core` and `flowfile_worker` backend services, and the `flowfile_frame` library.
|
|
200
|
+
|
|
201
|
+
```bash
|
|
202
|
+
pip install Flowfile
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
Once installed, you can use `flowfile_frame` as a library in your Python scripts (see Quick Start above).
|
|
206
|
+
|
|
207
|
+
### Full Application with Visual Designer
|
|
208
|
+
|
|
209
|
+
For the complete visual ETL experience with the Designer UI, please see the [installation instructions in the main repository](https://github.com/Edwardvaneechoud/Flowfile#-getting-started).
|
|
210
|
+
|
|
211
|
+
Available options include:
|
|
212
|
+
- Desktop application (recommended for most users)
|
|
213
|
+
- Docker setup (backend services + web frontend)
|
|
214
|
+
- Manual setup for development
|
|
215
|
+
|
|
216
|
+
## 📋 Development Roadmap
|
|
217
|
+
|
|
218
|
+
For the latest development roadmap and TODO list, please refer to the [main repository](https://github.com/Edwardvaneechoud/Flowfile#-todo).
|
|
219
|
+
|
|
@@ -7,9 +7,16 @@ This package ties together the FlowFile ecosystem components:
|
|
|
7
7
|
- flowfile_worker: Computation engine
|
|
8
8
|
"""
|
|
9
9
|
|
|
10
|
-
__version__ = "0.
|
|
10
|
+
__version__ = "0.3.1"
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
import os
|
|
13
|
+
import logging
|
|
14
|
+
|
|
15
|
+
os.environ['WORKER_PORT'] = "63578"
|
|
16
|
+
os.environ['SINGLE_FILE_MODE'] = "1"
|
|
17
|
+
|
|
18
|
+
from flowfile.web import start_server as start_web_ui
|
|
19
|
+
from flowfile.api import open_graph_in_editor
|
|
13
20
|
from flowfile_frame.flow_frame import (
|
|
14
21
|
FlowFrame, read_csv, read_parquet, from_dict, concat
|
|
15
22
|
)
|
|
@@ -18,7 +25,7 @@ from flowfile_frame.expr import (
|
|
|
18
25
|
sum, min, max, mean, count, when
|
|
19
26
|
)
|
|
20
27
|
from flowfile_frame.group_frame import GroupByFrame
|
|
21
|
-
from flowfile_frame.utils import
|
|
28
|
+
from flowfile_frame.utils import create_flow_graph
|
|
22
29
|
from flowfile_frame.selectors import (
|
|
23
30
|
numeric, float_, integer, string, temporal,
|
|
24
31
|
datetime, date, time, duration, boolean,
|
|
@@ -26,7 +33,6 @@ from flowfile_frame.selectors import (
|
|
|
26
33
|
by_dtype, contains, starts_with, ends_with, matches
|
|
27
34
|
)
|
|
28
35
|
|
|
29
|
-
# Import Polars data types for convenience
|
|
30
36
|
from polars.datatypes import (
|
|
31
37
|
Int8, Int16, Int32, Int64, Int128,
|
|
32
38
|
UInt8, UInt16, UInt32, UInt64,
|
|
@@ -38,7 +44,6 @@ from polars.datatypes import (
|
|
|
38
44
|
DataType, DataTypeClass, Field
|
|
39
45
|
)
|
|
40
46
|
|
|
41
|
-
# Define what's publicly available from the package
|
|
42
47
|
__all__ = [
|
|
43
48
|
# Core FlowFrame classes
|
|
44
49
|
'FlowFrame', 'GroupByFrame',
|
|
@@ -57,7 +62,7 @@ __all__ = [
|
|
|
57
62
|
'by_dtype', 'contains', 'starts_with', 'ends_with', 'matches',
|
|
58
63
|
|
|
59
64
|
# Utilities
|
|
60
|
-
'
|
|
65
|
+
'create_flow_graph', 'open_graph_in_editor',
|
|
61
66
|
|
|
62
67
|
# Data types from Polars
|
|
63
68
|
'Int8', 'Int16', 'Int32', 'Int64', 'Int128',
|
|
@@ -68,4 +73,6 @@ __all__ = [
|
|
|
68
73
|
'Date', 'Time', 'Datetime', 'Duration',
|
|
69
74
|
'Categorical', 'Decimal', 'Enum', 'Unknown',
|
|
70
75
|
'DataType', 'DataTypeClass', 'Field',
|
|
71
|
-
|
|
76
|
+
'start_web_ui'
|
|
77
|
+
]
|
|
78
|
+
logging.getLogger("PipelineHandler").setLevel(logging.WARNING)
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# flowfile/__main__.py
|
|
2
|
+
|
|
3
|
+
def main():
|
|
4
|
+
"""
|
|
5
|
+
Display information about FlowFile when run directly as a module.
|
|
6
|
+
"""
|
|
7
|
+
import flowfile
|
|
8
|
+
import argparse
|
|
9
|
+
|
|
10
|
+
parser = argparse.ArgumentParser(description="FlowFile: A visual ETL tool with a Polars-like API")
|
|
11
|
+
parser.add_argument("command", nargs="?", choices=["run"], help="Command to execute")
|
|
12
|
+
parser.add_argument("component", nargs="?", choices=["web", "core", "worker"],
|
|
13
|
+
help="Component to run (web, core, or worker)")
|
|
14
|
+
parser.add_argument("--host", default="127.0.0.1", help="Host to bind the server to")
|
|
15
|
+
parser.add_argument("--port", type=int, default=63578, help="Port to bind the server to")
|
|
16
|
+
parser.add_argument("--no-browser", action="store_true", help="Don't open a browser window")
|
|
17
|
+
|
|
18
|
+
# Parse arguments
|
|
19
|
+
args = parser.parse_args()
|
|
20
|
+
|
|
21
|
+
if args.command == "run" and args.component:
|
|
22
|
+
if args.component == "web":
|
|
23
|
+
try:
|
|
24
|
+
flowfile.start_web_ui(
|
|
25
|
+
host=args.host,
|
|
26
|
+
port=args.port,
|
|
27
|
+
open_browser=not args.no_browser
|
|
28
|
+
)
|
|
29
|
+
except KeyboardInterrupt:
|
|
30
|
+
print("\nFlowFile service stopped.")
|
|
31
|
+
elif args.component == "core":
|
|
32
|
+
# Only for direct core service usage
|
|
33
|
+
from flowfile_core.main import run as run_core
|
|
34
|
+
run_core(host=args.host, port=args.port)
|
|
35
|
+
elif args.component == "worker":
|
|
36
|
+
# Only for direct worker service usage
|
|
37
|
+
from flowfile_worker.main import run as run_worker
|
|
38
|
+
run_worker(host=args.host, port=args.port)
|
|
39
|
+
else:
|
|
40
|
+
# Default action - show info
|
|
41
|
+
print(f"FlowFile v{flowfile.__version__}")
|
|
42
|
+
print("A framework combining visual ETL with a Polars-like API")
|
|
43
|
+
print("\nUsage:")
|
|
44
|
+
print(" # Start the FlowFile web UI with integrated services")
|
|
45
|
+
print(" flowfile run web")
|
|
46
|
+
print("")
|
|
47
|
+
print(" # Advanced: Run individual components")
|
|
48
|
+
print(" flowfile run core # Start only the core service")
|
|
49
|
+
print(" flowfile run worker # Start only the worker service")
|
|
50
|
+
print("")
|
|
51
|
+
print(" # Options")
|
|
52
|
+
print(" flowfile run web --host 0.0.0.0 --port 8080 # Custom host/port")
|
|
53
|
+
print(" flowfile run web --no-browser # Don't open browser")
|
|
54
|
+
print("")
|
|
55
|
+
print(" # Python API usage examples")
|
|
56
|
+
print(" import flowfile as ff")
|
|
57
|
+
print(" df = ff.read_csv('data.csv')")
|
|
58
|
+
print(" result = df.filter(ff.col('value') > 10)")
|
|
59
|
+
print(" ff.open_graph_in_editor(result)")
|
|
60
|
+
print(" ff.start_web_ui()")
|