Flowfile 0.2.2__tar.gz → 0.3.0__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.

Files changed (172) hide show
  1. flowfile-0.3.0/PKG-INFO +219 -0
  2. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile/__init__.py +2 -2
  3. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_frame/flowfile_frame/__init__.py +1 -1
  4. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_frame/flowfile_frame/flow_frame.py +6 -6
  5. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_frame/flowfile_frame/utils.py +5 -5
  6. {flowfile-0.2.2 → flowfile-0.3.0}/pyproject.toml +2 -2
  7. flowfile-0.3.0/readme-pypi.md +175 -0
  8. flowfile-0.2.2/PKG-INFO +0 -225
  9. flowfile-0.2.2/README.md +0 -181
  10. {flowfile-0.2.2 → flowfile-0.3.0}/LICENSE +0 -0
  11. {flowfile-0.2.2 → flowfile-0.3.0}/build_backends/build_backends/__init__.py +0 -0
  12. {flowfile-0.2.2 → flowfile-0.3.0}/build_backends/build_backends/main.py +0 -0
  13. {flowfile-0.2.2 → flowfile-0.3.0}/build_backends/build_backends/main_prd.py +0 -0
  14. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile/__main__.py +0 -0
  15. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/__init__.py +0 -0
  16. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/auth/__init__.py +0 -0
  17. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/auth/jwt.py +0 -0
  18. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/auth/models.py +0 -0
  19. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/auth/secrets.py +0 -0
  20. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/configs/__init__.py +0 -0
  21. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/configs/flow_logger.py +0 -0
  22. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/configs/node_store/__init__.py +0 -0
  23. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/configs/node_store/nodes.py +0 -0
  24. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/configs/settings.py +0 -0
  25. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/database/__init__.py +0 -0
  26. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/database/connection.py +0 -0
  27. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/database/init_db.py +0 -0
  28. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/database/models.py +0 -0
  29. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/fileExplorer/__init__.py +0 -0
  30. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/fileExplorer/funcs.py +0 -0
  31. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/fileExplorer/utils.py +0 -0
  32. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/FlowfileFlow.py +0 -0
  33. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/__init__.py +0 -0
  34. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/_extensions/__init__.py +0 -0
  35. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/_extensions/real_time_interface.py +0 -0
  36. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/analytics/__init__.py +0 -0
  37. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/analytics/analytics_processor.py +0 -0
  38. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/analytics/graphic_walker.py +0 -0
  39. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/analytics/schemas/__init__.py +0 -0
  40. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/analytics/utils.py +0 -0
  41. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/connection_manager/__init__.py +0 -0
  42. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/connection_manager/_connection_manager.py +0 -0
  43. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/connection_manager/models.py +0 -0
  44. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/database_connection_manager/__init__.py +0 -0
  45. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/database_connection_manager/db_connections.py +0 -0
  46. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/database_connection_manager/models.py +0 -0
  47. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/extensions.py +0 -0
  48. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/flow_data_engine/__init__.py +0 -0
  49. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/flow_data_engine/create/__init__.py +0 -0
  50. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/flow_data_engine/create/funcs.py +0 -0
  51. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/flow_data_engine/flow_data_engine.py +0 -0
  52. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/flow_data_engine/flow_file_column/__init__.py +0 -0
  53. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/flow_data_engine/flow_file_column/main.py +0 -0
  54. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/flow_data_engine/flow_file_column/polars_type.py +0 -0
  55. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/flow_data_engine/flow_file_column/utils.py +0 -0
  56. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/flow_data_engine/fuzzy_matching/__init__.py +0 -0
  57. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/flow_data_engine/fuzzy_matching/prepare_for_fuzzy_match.py +0 -0
  58. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/flow_data_engine/fuzzy_matching/settings_validator.py +0 -0
  59. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/flow_data_engine/join/__init__.py +0 -0
  60. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/flow_data_engine/join/verify_integrity.py +0 -0
  61. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/flow_data_engine/pivot_table.py +0 -0
  62. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/flow_data_engine/polars_code_parser.py +0 -0
  63. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/flow_data_engine/read_excel_tables.py +0 -0
  64. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/flow_data_engine/sample_data.py +0 -0
  65. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/flow_data_engine/subprocess_operations/__init__.py +0 -0
  66. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/flow_data_engine/subprocess_operations/models.py +0 -0
  67. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/flow_data_engine/subprocess_operations/subprocess_operations.py +0 -0
  68. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/flow_data_engine/threaded_processes.py +0 -0
  69. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/flow_data_engine/types.py +0 -0
  70. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/flow_data_engine/utils.py +0 -0
  71. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/flow_node/__init__.py +0 -0
  72. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/flow_node/flow_node.py +0 -0
  73. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/flow_node/models.py +0 -0
  74. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/flow_node/schema_callback.py +0 -0
  75. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/handler.py +0 -0
  76. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/manage/__init__.py +0 -0
  77. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/manage/compatibility_enhancements.py +0 -0
  78. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/manage/manage_flowfile.py +0 -0
  79. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/manage/open_flowfile.py +0 -0
  80. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/setting_generator/__init__.py +0 -0
  81. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/setting_generator/setting_generator.py +0 -0
  82. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/setting_generator/settings.py +0 -0
  83. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/sources/__init__.py +0 -0
  84. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/sources/external_sources/__init__.py +0 -0
  85. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/sources/external_sources/airbyte_sources/__init__.py +0 -0
  86. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/sources/external_sources/airbyte_sources/airbyte.py +0 -0
  87. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/sources/external_sources/airbyte_sources/models.py +0 -0
  88. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/sources/external_sources/airbyte_sources/settings.py +0 -0
  89. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/sources/external_sources/base_class.py +0 -0
  90. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/sources/external_sources/custom_external_sources/__init__.py +0 -0
  91. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/sources/external_sources/custom_external_sources/exchange_rate.py +0 -0
  92. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/sources/external_sources/custom_external_sources/external_source.py +0 -0
  93. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/sources/external_sources/custom_external_sources/google_sheet.py +0 -0
  94. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/sources/external_sources/custom_external_sources/sample_users.py +0 -0
  95. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/sources/external_sources/factory.py +0 -0
  96. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/sources/external_sources/sql_source/__init__.py +0 -0
  97. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/sources/external_sources/sql_source/models.py +0 -0
  98. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/sources/external_sources/sql_source/sql_source.py +0 -0
  99. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/sources/external_sources/sql_source/utils.py +0 -0
  100. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/util/__init__.py +0 -0
  101. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/util/calculate_layout.py +0 -0
  102. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/util/execution_orderer.py +0 -0
  103. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/flowfile/utils.py +0 -0
  104. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/main.py +0 -0
  105. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/routes/__init__.py +0 -0
  106. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/routes/auth.py +0 -0
  107. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/routes/logs.py +0 -0
  108. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/routes/public.py +0 -0
  109. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/routes/routes.py +0 -0
  110. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/routes/secrets.py +0 -0
  111. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/run_lock.py +0 -0
  112. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/schemas/__init__.py +0 -0
  113. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/schemas/analysis_schemas/__init__.py +0 -0
  114. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/schemas/analysis_schemas/graphic_walker_schemas.py +0 -0
  115. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/schemas/defaults.py +0 -0
  116. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/schemas/external_sources/__init__.py +0 -0
  117. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/schemas/external_sources/airbyte_schemas.py +0 -0
  118. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/schemas/input_schema.py +0 -0
  119. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/schemas/models.py +0 -0
  120. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/schemas/output_model.py +0 -0
  121. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/schemas/schemas.py +0 -0
  122. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/schemas/transform_schema.py +0 -0
  123. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/secrets/__init__.py +0 -0
  124. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/secrets/secrets.py +0 -0
  125. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/utils/__init__.py +0 -0
  126. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/utils/arrow_reader.py +0 -0
  127. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/utils/excel_file_manager.py +0 -0
  128. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/utils/fileManager.py +0 -0
  129. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/utils/fl_executor.py +0 -0
  130. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_core/flowfile_core/utils/utils.py +0 -0
  131. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_frame/flowfile_frame/__main__.py +0 -0
  132. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_frame/flowfile_frame/adapters.py +0 -0
  133. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_frame/flowfile_frame/expr.py +0 -0
  134. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_frame/flowfile_frame/group_frame.py +0 -0
  135. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_frame/flowfile_frame/join.py +0 -0
  136. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_frame/flowfile_frame/selectors.py +0 -0
  137. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_worker/flowfile_worker/__init__.py +0 -0
  138. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_worker/flowfile_worker/configs.py +0 -0
  139. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_worker/flowfile_worker/create/__init__.py +0 -0
  140. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_worker/flowfile_worker/create/funcs.py +0 -0
  141. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_worker/flowfile_worker/create/models.py +0 -0
  142. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_worker/flowfile_worker/create/pl_types.py +0 -0
  143. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_worker/flowfile_worker/create/read_excel_tables.py +0 -0
  144. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_worker/flowfile_worker/create/utils.py +0 -0
  145. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_worker/flowfile_worker/external_sources/__init__.py +0 -0
  146. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_worker/flowfile_worker/external_sources/airbyte_sources/__init__.py +0 -0
  147. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_worker/flowfile_worker/external_sources/airbyte_sources/cache_manager.py +0 -0
  148. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_worker/flowfile_worker/external_sources/airbyte_sources/main.py +0 -0
  149. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_worker/flowfile_worker/external_sources/airbyte_sources/models.py +0 -0
  150. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_worker/flowfile_worker/external_sources/airbyte_sources/settings.py +0 -0
  151. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_worker/flowfile_worker/external_sources/sql_source/__init__.py +0 -0
  152. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_worker/flowfile_worker/external_sources/sql_source/main.py +0 -0
  153. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_worker/flowfile_worker/external_sources/sql_source/models.py +0 -0
  154. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_worker/flowfile_worker/flow_logger.py +0 -0
  155. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_worker/flowfile_worker/funcs.py +0 -0
  156. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_worker/flowfile_worker/main.py +0 -0
  157. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_worker/flowfile_worker/models.py +0 -0
  158. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_worker/flowfile_worker/polars_fuzzy_match/__init__.py +0 -0
  159. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_worker/flowfile_worker/polars_fuzzy_match/matcher.py +0 -0
  160. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_worker/flowfile_worker/polars_fuzzy_match/models.py +0 -0
  161. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_worker/flowfile_worker/polars_fuzzy_match/pre_process.py +0 -0
  162. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_worker/flowfile_worker/polars_fuzzy_match/process.py +0 -0
  163. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_worker/flowfile_worker/polars_fuzzy_match/utils.py +0 -0
  164. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_worker/flowfile_worker/process_manager.py +0 -0
  165. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_worker/flowfile_worker/routes.py +0 -0
  166. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_worker/flowfile_worker/secrets.py +0 -0
  167. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_worker/flowfile_worker/spawner.py +0 -0
  168. {flowfile-0.2.2 → flowfile-0.3.0}/flowfile_worker/flowfile_worker/utils.py +0 -0
  169. {flowfile-0.2.2 → flowfile-0.3.0}/test_utils/__init__.py +0 -0
  170. {flowfile-0.2.2 → flowfile-0.3.0}/test_utils/postgres/__init__.py +0 -0
  171. {flowfile-0.2.2 → flowfile-0.3.0}/test_utils/postgres/commands.py +0 -0
  172. {flowfile-0.2.2 → flowfile-0.3.0}/test_utils/postgres/fixtures.py +0 -0
@@ -0,0 +1,219 @@
1
+ Metadata-Version: 2.3
2
+ Name: Flowfile
3
+ Version: 0.3.0
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
+
@@ -18,7 +18,7 @@ from flowfile_frame.expr import (
18
18
  sum, min, max, mean, count, when
19
19
  )
20
20
  from flowfile_frame.group_frame import GroupByFrame
21
- from flowfile_frame.utils import create_etl_graph, open_graph_in_editor
21
+ from flowfile_frame.utils import create_flow_graph, open_graph_in_editor
22
22
  from flowfile_frame.selectors import (
23
23
  numeric, float_, integer, string, temporal,
24
24
  datetime, date, time, duration, boolean,
@@ -57,7 +57,7 @@ __all__ = [
57
57
  'by_dtype', 'contains', 'starts_with', 'ends_with', 'matches',
58
58
 
59
59
  # Utilities
60
- 'create_etl_graph', 'open_graph_in_editor',
60
+ 'create_flow_graph', 'open_graph_in_editor',
61
61
 
62
62
  # Data types from Polars
63
63
  'Int8', 'Int16', 'Int32', 'Int64', 'Int128',
@@ -4,7 +4,7 @@
4
4
  # Core classes
5
5
  from flowfile_frame.flow_frame import FlowFrame # noqa: F401
6
6
 
7
- from flowfile_frame.utils import create_etl_graph # noqa: F401
7
+ from flowfile_frame.utils import create_flow_graph # noqa: F401
8
8
 
9
9
  # Commonly used functions
10
10
  from flowfile_frame.expr import ( # noqa: F401
@@ -16,7 +16,7 @@ from flowfile_core.schemas import input_schema, transform_schema
16
16
  from flowfile_frame.expr import Expr, Column, lit, col
17
17
  from flowfile_frame.selectors import Selector
18
18
  from flowfile_frame.group_frame import GroupByFrame
19
- from flowfile_frame.utils import _parse_inputs_as_iterable, create_etl_graph
19
+ from flowfile_frame.utils import _parse_inputs_as_iterable, create_flow_graph
20
20
  from flowfile_frame.join import _normalize_columns_to_list, _create_join_mappings
21
21
 
22
22
  node_id_counter = 0
@@ -92,7 +92,7 @@ class FlowFrame:
92
92
 
93
93
  # Create a new flow graph if none is provided
94
94
  if flow_graph is None:
95
- flow_graph = create_etl_graph()
95
+ flow_graph = create_flow_graph()
96
96
 
97
97
  flow_id = flow_graph.flow_id
98
98
 
@@ -198,7 +198,7 @@ class FlowFrame:
198
198
 
199
199
  # Initialize graph
200
200
  if flow_graph is None:
201
- flow_graph = create_etl_graph()
201
+ flow_graph = create_flow_graph()
202
202
  self.flow_graph = flow_graph
203
203
  # Set up data
204
204
  if isinstance(data, FlowDataEngine):
@@ -1922,7 +1922,7 @@ def read_csv(file_path, *, flow_graph: FlowGraph = None, separator: str = ';',
1922
1922
  # Create new node ID
1923
1923
  node_id = generate_node_id()
1924
1924
  if flow_graph is None:
1925
- flow_graph = create_etl_graph()
1925
+ flow_graph = create_flow_graph()
1926
1926
 
1927
1927
  flow_id = flow_graph.flow_id
1928
1928
 
@@ -1982,7 +1982,7 @@ def read_parquet(file_path, *, flow_graph: FlowGraph = None, description: str =
1982
1982
  node_id = generate_node_id()
1983
1983
 
1984
1984
  if flow_graph is None:
1985
- flow_graph = create_etl_graph()
1985
+ flow_graph = create_flow_graph()
1986
1986
 
1987
1987
  flow_id = flow_graph.flow_id
1988
1988
 
@@ -2028,7 +2028,7 @@ def from_dict(data, *, flow_graph: FlowGraph = None, description: str = None) ->
2028
2028
  node_id = generate_node_id()
2029
2029
 
2030
2030
  if not flow_graph:
2031
- flow_graph = create_etl_graph()
2031
+ flow_graph = create_flow_graph()
2032
2032
  flow_id = flow_graph.flow_id
2033
2033
 
2034
2034
  input_node = input_schema.NodeManualInput(
@@ -33,7 +33,7 @@ def _generate_id() -> int:
33
33
  return int(uuid.uuid4().int % 100000)
34
34
 
35
35
 
36
- def create_etl_graph() -> FlowGraph:
36
+ def create_flow_graph() -> FlowGraph:
37
37
  flow_id = _generate_id()
38
38
  flow_settings = schemas.FlowSettings(
39
39
  flow_id=flow_id,
@@ -127,13 +127,13 @@ def import_flow_to_editor(flow_path: str, auth_token: str) -> Optional[int]:
127
127
  return None
128
128
 
129
129
 
130
- def open_graph_in_editor(etl_graph: FlowGraph, storage_location: str = None) -> bool:
130
+ def open_graph_in_editor(flow_graph: FlowGraph, storage_location: str = None) -> bool:
131
131
  """
132
132
  Save the ETL graph and open it in the Flowfile editor.
133
133
 
134
134
  Parameters:
135
135
  -----------
136
- etl_graph : FlowGraph
136
+ flow_graph : FlowGraph
137
137
  The graph to save and open
138
138
  storage_location : str, optional
139
139
  Where to save the flowfile. If None, a default name is used.
@@ -152,8 +152,8 @@ def open_graph_in_editor(etl_graph: FlowGraph, storage_location: str = None) ->
152
152
  # Ensure path is absolute
153
153
  storage_location = os.path.abspath(storage_location)
154
154
 
155
- etl_graph.apply_layout()
156
- etl_graph.save_flow(storage_location)
155
+ flow_graph.apply_layout()
156
+ flow_graph.save_flow(storage_location)
157
157
  print(f"Flow saved to: {storage_location}")
158
158
 
159
159
  # Check if Flowfile is running, and start it if not
@@ -1,8 +1,8 @@
1
1
  [tool.poetry]
2
2
  name = "Flowfile"
3
- version = "0.2.2"
3
+ version = "0.3.0"
4
4
  description = "Project combining flowfile core (backend) and flowfile_worker (compute offloader) and flowfile_frame (api)"
5
- readme = "README.md"
5
+ readme = "readme-pypi.md"
6
6
  authors = ["Edward van Eechoud <evaneechoud@gmail.com>"]
7
7
  packages = [
8
8
  { include = "flowfile_core", from = "flowfile_core" },
@@ -0,0 +1,175 @@
1
+ <h1 align="center">
2
+ <img src="https://raw.githubusercontent.com/Edwardvaneechoud/Flowfile/main/.github/images/logo.png" alt="Flowfile Logo" width="100">
3
+ <br>
4
+ Flowfile
5
+ </h1>
6
+
7
+ <p align="center">
8
+ <b>Main Repository</b>: <a href="https://github.com/Edwardvaneechoud/Flowfile">Edwardvaneechoud/Flowfile</a><br>
9
+ <b>Documentation</b>:
10
+ <a href="https://edwardvaneechoud.github.io/Flowfile/">Website</a> -
11
+ <a href="https://github.com/Edwardvaneechoud/Flowfile/blob/main/flowfile_core/README.md">Core</a> -
12
+ <a href="https://github.com/Edwardvaneechoud/Flowfile/blob/main/flowfile_worker/README.md">Worker</a> -
13
+ <a href="https://github.com/Edwardvaneechoud/Flowfile/blob/main/flowfile_frontend/README.md">Frontend</a> -
14
+ <a href="https://dev.to/edwardvaneechoud/building-flowfile-architecting-a-visual-etl-tool-with-polars-576c">Technical Architecture</a>
15
+ </p>
16
+
17
+ <p>
18
+ 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.
19
+ </p>
20
+
21
+ <div align="center">
22
+ <img src="https://raw.githubusercontent.com/Edwardvaneechoud/Flowfile/main/.github/images/group_by_screenshot.png" alt="Flowfile Interface" width="800"/>
23
+ </div>
24
+
25
+ ## ⚡ Technical Design
26
+
27
+ The `Flowfile` PyPI package provides the backend services and the `flowfile_frame` Python library:
28
+
29
+ - **Core (`flowfile_core`)** (FastAPI): The main ETL engine using Polars for high-performance data transformations. Typically runs on port `:63578`.
30
+ - **Worker (`flowfile_worker`)** (FastAPI): Handles computation-intensive tasks and caching of data operations, supporting the Core service. Typically runs on port `:63579`.
31
+ - **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.
32
+
33
+ Each flow is represented as a directed acyclic graph (DAG), where nodes represent data operations and edges represent data flow between operations.
34
+
35
+ 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.
36
+
37
+ ## ✨ Introducing FlowFile Frame - A Polars-Like API for ETL
38
+
39
+ 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:
40
+
41
+ 1. Write data transformation code using a simple, Pandas/Polars-like API
42
+ 2. Automatically generate executable ETL workflows compatible with the Flowfile ecosystem
43
+ 3. Visualize, save, and share your data pipelines
44
+ 4. Get the performance benefits of Polars with the traceability of ETL graphs
45
+
46
+ ### FlowFrame Quick Start
47
+
48
+ ```python
49
+ import flowfile_frame as ff
50
+ from flowfile_frame.utils import open_graph_in_editor
51
+
52
+ # Create a complex data pipeline
53
+ df = ff.from_dict({
54
+ "id": [1, 2, 3, 4, 5],
55
+ "category": ["A", "B", "A", "C", "B"],
56
+ "value": [100, 200, 150, 300, 250]
57
+ })
58
+
59
+ open_graph_in_editor(df.flow_graph)
60
+
61
+ ```
62
+
63
+ ### Key FlowFrame Features
64
+
65
+ - **Familiar API**: Based on Polars, making it easy to learn if you know Pandas or Polars
66
+ - **ETL Graph Generation**: Automatically builds a directed acyclic graph of your data operations
67
+ - **Lazy Evaluation**: Operations are not executed until `collect()` or a write operation
68
+ - **Interoperability**: Saved `.flowfile` graphs can be opened in the visual Flowfile Designer
69
+ - **High Performance**: Leverages Polars for fast data processing
70
+ - **Reproducible**: Save and share your data transformation workflows
71
+
72
+ ### Common FlowFrame Operations
73
+
74
+ ```python
75
+ import flowfile_frame as ff
76
+ from flowfile_frame import col, when
77
+
78
+ # Create from dictionary
79
+ df = ff.from_dict({
80
+ "id": [1, 2, 3],
81
+ "name": ["Alice", "Bob", "Charlie"],
82
+ "age": [25, 35, 28]
83
+ })
84
+
85
+ flow_graph = df.flow_graph
86
+ # Reading data
87
+ # df_csv = ff.read_csv("data.csv")
88
+ # df_parquet = ff.read_parquet("data.parquet")
89
+
90
+ # Filtering
91
+ adults = df.filter(col("age") >= 30)
92
+
93
+ # Select and transform
94
+ result = df.select(
95
+ col("name"),
96
+ (col("age") * 2).alias("double_age")
97
+ )
98
+
99
+ # Add new columns
100
+ df_with_cols = df.with_columns([
101
+ (col("age") + 10).alias("future_age"),
102
+ when(col("age") >= 30).then(ff.lit("Senior")).otherwise(ff.lit("Junior")).alias("status")]
103
+ )
104
+
105
+ # Group by and aggregate
106
+ df_sales = ff.from_dict({
107
+ "region": ["North", "South", "North", "South"],
108
+ "sales": [100, 200, 150, 300]
109
+ })
110
+ sales_by_region = df_sales.group_by("region").agg([
111
+ col("sales").sum().alias("total_sales"),
112
+ col("sales").mean().alias("avg_sales")
113
+ ])
114
+
115
+ # Joins
116
+ customers = ff.from_dict({"id": [1, 2, 3], "name": ["Alice", "Bob", "Charlie"]}, flow_graph=flow_graph)
117
+ orders = ff.from_dict({"id": [101, 102], "customer_id": [1, 2], "amount": [100, 200]}, flow_graph=flow_graph)
118
+ joined = customers.join(orders, left_on="id", right_on="customer_id")
119
+
120
+ # Save and visualize ETL graph
121
+
122
+ result.save_graph("my_pipeline.flowfile")
123
+ # open_graph_in_editor(result.flow_graph, "my_pipeline.flowfile") # Opens in Designer UI if installed
124
+ ```
125
+
126
+ 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).
127
+
128
+ ## 🔥 Example Use Cases
129
+
130
+ Flowfile is great for:
131
+
132
+ - **Data Cleaning & Transformation**
133
+ - Complex joins (fuzzy matching)
134
+ - Text-to-rows transformations
135
+ - Advanced filtering and grouping
136
+ - Custom formulas and expressions
137
+ - Filter data based on conditions
138
+
139
+ - **Performance**
140
+ - Built to scale out of core
141
+ - Using Polars for data processing
142
+
143
+ - **Data Integration**
144
+ - Standardize data formats
145
+ - Handle messy Excel files
146
+
147
+ - **ETL Operations**
148
+ - Data quality checks
149
+
150
+ (For more visual examples of these use cases, please see our [main GitHub repository](https://github.com/Edwardvaneechoud/Flowfile#-example-use-cases)).
151
+
152
+ ## 🚀 Getting Started
153
+
154
+ ### Installing the Flowfile Python Package
155
+
156
+ This package provides the `flowfile_core` and `flowfile_worker` backend services, and the `flowfile_frame` library.
157
+
158
+ ```bash
159
+ pip install Flowfile
160
+ ```
161
+
162
+ Once installed, you can use `flowfile_frame` as a library in your Python scripts (see Quick Start above).
163
+
164
+ ### Full Application with Visual Designer
165
+
166
+ 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).
167
+
168
+ Available options include:
169
+ - Desktop application (recommended for most users)
170
+ - Docker setup (backend services + web frontend)
171
+ - Manual setup for development
172
+
173
+ ## 📋 Development Roadmap
174
+
175
+ For the latest development roadmap and TODO list, please refer to the [main repository](https://github.com/Edwardvaneechoud/Flowfile#-todo).