Flowfile 0.4.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.
Files changed (332) hide show
  1. build_backends/main.py +25 -22
  2. build_backends/main_prd.py +10 -19
  3. flowfile/__init__.py +179 -73
  4. flowfile/__main__.py +10 -7
  5. flowfile/api.py +52 -59
  6. flowfile/web/__init__.py +14 -9
  7. flowfile/web/static/assets/AdminView-49392a9a.js +713 -0
  8. flowfile/web/static/assets/AdminView-f53bad23.css +129 -0
  9. flowfile/web/static/assets/CloudConnectionView-36bcd6df.css +72 -0
  10. flowfile/web/static/assets/{CloudConnectionManager-d3248f8d.js → CloudConnectionView-f13f202b.js} +11 -11
  11. flowfile/web/static/assets/{CloudStorageReader-d65bf041.js → CloudStorageReader-0023d4a5.js} +10 -8
  12. flowfile/web/static/assets/{CloudStorageReader-29d14fcc.css → CloudStorageReader-24c54524.css} +27 -27
  13. flowfile/web/static/assets/{CloudStorageWriter-b0ee067f.css → CloudStorageWriter-60547855.css} +26 -26
  14. flowfile/web/static/assets/{CloudStorageWriter-e83be3ed.js → CloudStorageWriter-8e781e11.js} +10 -8
  15. flowfile/web/static/assets/{ColumnSelector-47996a16.css → ColumnSelector-371637fb.css} +2 -2
  16. flowfile/web/static/assets/{ColumnSelector-cce661cf.js → ColumnSelector-8ad68ea9.js} +3 -5
  17. flowfile/web/static/assets/{ContextMenu-c13f91d0.css → ContextMenu-26d4dd27.css} +6 -6
  18. flowfile/web/static/assets/{ContextMenu-11a4652a.js → ContextMenu-31ee57f0.js} +3 -3
  19. flowfile/web/static/assets/{ContextMenu-160afb08.js → ContextMenu-69a74055.js} +3 -3
  20. flowfile/web/static/assets/{ContextMenu-cf18d2cc.js → ContextMenu-8e2051c6.js} +3 -3
  21. flowfile/web/static/assets/{ContextMenu-4c74eef1.css → ContextMenu-8ec1729e.css} +6 -6
  22. flowfile/web/static/assets/{ContextMenu-63cfa99b.css → ContextMenu-9b310c60.css} +6 -6
  23. flowfile/web/static/assets/{CrossJoin-d395d38c.js → CrossJoin-03df6938.js} +12 -10
  24. flowfile/web/static/assets/{CrossJoin-1119d18e.css → CrossJoin-71b4cc10.css} +20 -20
  25. flowfile/web/static/assets/CustomNode-59e99a86.css +32 -0
  26. flowfile/web/static/assets/{CustomNode-b812dc0b.js → CustomNode-8479239b.js} +36 -24
  27. flowfile/web/static/assets/{DatabaseConnectionSettings-7000bf2c.js → DatabaseConnectionSettings-869e3efd.js} +5 -4
  28. flowfile/web/static/assets/{DatabaseConnectionSettings-0c04b2e5.css → DatabaseConnectionSettings-e91df89a.css} +13 -13
  29. flowfile/web/static/assets/{DatabaseReader-ae61773c.css → DatabaseReader-36898a00.css} +24 -24
  30. flowfile/web/static/assets/{DatabaseReader-4f035d0c.js → DatabaseReader-c58b9552.js} +25 -15
  31. flowfile/web/static/assets/DatabaseView-6655afd6.css +57 -0
  32. flowfile/web/static/assets/{DatabaseManager-9662ec5b.js → DatabaseView-d26a9140.js} +11 -11
  33. flowfile/web/static/assets/{DatabaseWriter-2f570e53.css → DatabaseWriter-217a99f1.css} +19 -19
  34. flowfile/web/static/assets/{DatabaseWriter-f65dcd54.js → DatabaseWriter-4d05ddc7.js} +17 -10
  35. flowfile/web/static/assets/{designer-e3c150ec.css → DesignerView-a6d0ee84.css} +629 -538
  36. flowfile/web/static/assets/{designer-f3656d8c.js → DesignerView-e6f5c0e8.js} +1214 -3209
  37. flowfile/web/static/assets/{documentation-52b241e7.js → DocumentationView-2e78ef1b.js} +5 -5
  38. flowfile/web/static/assets/{documentation-12216a74.css → DocumentationView-fd46c656.css} +7 -7
  39. flowfile/web/static/assets/{ExploreData-2d0cf4db.css → ExploreData-10c5acc8.css} +13 -12
  40. flowfile/web/static/assets/{ExploreData-94c43dfc.js → ExploreData-7b54caca.js} +18 -9
  41. flowfile/web/static/assets/{ExternalSource-ac04b3cc.js → ExternalSource-3fa399b2.js} +9 -7
  42. flowfile/web/static/assets/{ExternalSource-e37b6275.css → ExternalSource-47ab05a3.css} +17 -17
  43. flowfile/web/static/assets/Filter-7494ea97.css +48 -0
  44. flowfile/web/static/assets/Filter-8cbbdbf3.js +287 -0
  45. flowfile/web/static/assets/{Formula-bb96803d.css → Formula-53d58c43.css} +7 -7
  46. flowfile/web/static/assets/{Formula-71472193.js → Formula-aac42b1e.js} +13 -11
  47. flowfile/web/static/assets/{FuzzyMatch-1010f966.css → FuzzyMatch-ad6361d6.css} +68 -69
  48. flowfile/web/static/assets/{FuzzyMatch-b317f631.js → FuzzyMatch-cd9bbfca.js} +12 -10
  49. flowfile/web/static/assets/{Pivot-cf333e3d.css → GraphSolver-c24dec17.css} +5 -5
  50. flowfile/web/static/assets/{GraphSolver-754a234f.js → GraphSolver-c7e6780e.js} +13 -11
  51. flowfile/web/static/assets/{GroupBy-6c6f9802.js → GroupBy-93c5d22b.js} +9 -7
  52. flowfile/web/static/assets/{GroupBy-b9505323.css → GroupBy-be7ac0bf.css} +10 -10
  53. flowfile/web/static/assets/{Join-fd79b451.css → Join-28b5e18f.css} +22 -22
  54. flowfile/web/static/assets/{Join-a1b800be.js → Join-a19b2de2.js} +13 -11
  55. flowfile/web/static/assets/LoginView-0df4ed0a.js +134 -0
  56. flowfile/web/static/assets/LoginView-d325d632.css +172 -0
  57. flowfile/web/static/assets/ManualInput-3702e677.css +293 -0
  58. flowfile/web/static/assets/{ManualInput-a9640276.js → ManualInput-8d3374b2.js} +170 -116
  59. flowfile/web/static/assets/{MultiSelect-97213888.js → MultiSelect-ad1b6243.js} +2 -2
  60. flowfile/web/static/assets/{MultiSelect.vue_vue_type_script_setup_true_lang-6ffe088a.js → MultiSelect.vue_vue_type_script_setup_true_lang-e278950d.js} +1 -1
  61. flowfile/web/static/assets/NodeDesigner-40b647c9.js +2610 -0
  62. flowfile/web/static/assets/NodeDesigner-5f53be3f.css +1429 -0
  63. flowfile/web/static/assets/{NumericInput-e638088a.js → NumericInput-7100234c.js} +2 -2
  64. flowfile/web/static/assets/{NumericInput.vue_vue_type_script_setup_true_lang-90eb2cba.js → NumericInput.vue_vue_type_script_setup_true_lang-5130219f.js} +5 -2
  65. flowfile/web/static/assets/{Output-ddc9079f.css → Output-35e97000.css} +6 -6
  66. flowfile/web/static/assets/{Output-76750610.js → Output-f5efd2aa.js} +60 -38
  67. flowfile/web/static/assets/{GraphSolver-f0cb7bfb.css → Pivot-0eda81b4.css} +5 -5
  68. flowfile/web/static/assets/{Pivot-7814803f.js → Pivot-d981d23c.js} +11 -9
  69. flowfile/web/static/assets/PivotValidation-0e905b1a.css +13 -0
  70. flowfile/web/static/assets/{PivotValidation-f92137d2.js → PivotValidation-39386e95.js} +3 -3
  71. flowfile/web/static/assets/PivotValidation-41b57ad6.css +13 -0
  72. flowfile/web/static/assets/{PivotValidation-76dd431a.js → PivotValidation-63de1f73.js} +3 -3
  73. flowfile/web/static/assets/{PolarsCode-650322d1.css → PolarsCode-2b1f1f23.css} +4 -4
  74. flowfile/web/static/assets/{PolarsCode-889c3008.js → PolarsCode-f9d69217.js} +18 -9
  75. flowfile/web/static/assets/PopOver-b22f049e.js +939 -0
  76. flowfile/web/static/assets/PopOver-d96599db.css +33 -0
  77. flowfile/web/static/assets/{Read-6b17491f.css → Read-36e7bd51.css} +12 -12
  78. flowfile/web/static/assets/{Read-637b72a7.js → Read-aec2e377.js} +83 -105
  79. flowfile/web/static/assets/{RecordCount-2b050c41.js → RecordCount-78ed6845.js} +6 -4
  80. flowfile/web/static/assets/{RecordId-81df7784.js → RecordId-2156e890.js} +8 -6
  81. flowfile/web/static/assets/{SQLQueryComponent-36cef432.css → SQLQueryComponent-1c2f26b4.css} +5 -5
  82. flowfile/web/static/assets/{SQLQueryComponent-88dcfe53.js → SQLQueryComponent-48c72f5b.js} +3 -3
  83. flowfile/web/static/assets/{Sample-258ad2a9.js → Sample-1352ca74.js} +6 -4
  84. flowfile/web/static/assets/SecretSelector-22b5ff89.js +113 -0
  85. flowfile/web/static/assets/SecretSelector-6329f743.css +43 -0
  86. flowfile/web/static/assets/{SecretManager-2a2cb7e2.js → SecretsView-17df66ee.js} +35 -36
  87. flowfile/web/static/assets/SecretsView-aa291340.css +38 -0
  88. flowfile/web/static/assets/{Select-850215fd.js → Select-0aee4c54.js} +9 -7
  89. flowfile/web/static/assets/{SettingsSection-55bae608.js → SettingsSection-0784e157.js} +3 -3
  90. flowfile/web/static/assets/{SettingsSection-71e6b7e3.css → SettingsSection-07fbbc39.css} +4 -4
  91. flowfile/web/static/assets/{SettingsSection-5c696bee.css → SettingsSection-26fe48d4.css} +4 -4
  92. flowfile/web/static/assets/{SettingsSection-2e4d03c4.css → SettingsSection-8f980839.css} +4 -4
  93. flowfile/web/static/assets/{SettingsSection-0e8d9123.js → SettingsSection-cd341bb6.js} +3 -3
  94. flowfile/web/static/assets/{SettingsSection-29b4fa6b.js → SettingsSection-f2002a6d.js} +3 -3
  95. flowfile/web/static/assets/{SingleSelect-bebd408b.js → SingleSelect-460cc0ea.js} +2 -2
  96. flowfile/web/static/assets/{SingleSelect.vue_vue_type_script_setup_true_lang-6093741c.js → SingleSelect.vue_vue_type_script_setup_true_lang-30741bb2.js} +1 -1
  97. flowfile/web/static/assets/{SliderInput-6a05ab61.js → SliderInput-5d926864.js} +7 -4
  98. flowfile/web/static/assets/SliderInput-f2e4f23c.css +4 -0
  99. flowfile/web/static/assets/{Sort-10ab48ed.js → Sort-3cdc971b.js} +9 -7
  100. flowfile/web/static/assets/{Unique-f9fb0809.css → Sort-8a871341.css} +10 -10
  101. flowfile/web/static/assets/{TextInput-df9d6259.js → TextInput-a2d0bfbd.js} +2 -2
  102. flowfile/web/static/assets/{TextInput.vue_vue_type_script_setup_true_lang-000e1178.js → TextInput.vue_vue_type_script_setup_true_lang-abad1ca2.js} +5 -2
  103. flowfile/web/static/assets/{TextToRows-5d2c1190.css → TextToRows-12afb4f4.css} +10 -10
  104. flowfile/web/static/assets/{TextToRows-6c2d93d8.js → TextToRows-918945f7.js} +11 -10
  105. flowfile/web/static/assets/{ToggleSwitch-0ff7ac52.js → ToggleSwitch-f0ef5196.js} +2 -2
  106. flowfile/web/static/assets/{ToggleSwitch.vue_vue_type_script_setup_true_lang-c6dc3029.js → ToggleSwitch.vue_vue_type_script_setup_true_lang-5605c793.js} +1 -1
  107. flowfile/web/static/assets/{UnavailableFields-5edd5322.css → UnavailableFields-54d2f518.css} +6 -6
  108. flowfile/web/static/assets/{UnavailableFields-1bab97cb.js → UnavailableFields-bdad6144.js} +4 -4
  109. flowfile/web/static/assets/{Union-af6c3d9b.css → Union-d6a8d7d5.css} +7 -7
  110. flowfile/web/static/assets/{Union-b563478a.js → Union-e8ab8c86.js} +8 -6
  111. flowfile/web/static/assets/{Unique-f90db5db.js → Unique-8cd4f976.js} +13 -22
  112. flowfile/web/static/assets/{Sort-3643d625.css → Unique-9fb2f567.css} +10 -10
  113. flowfile/web/static/assets/{Unpivot-1e422df3.css → Unpivot-710a2948.css} +7 -7
  114. flowfile/web/static/assets/{Unpivot-bcb0025f.js → Unpivot-8da14095.js} +10 -8
  115. flowfile/web/static/assets/{UnpivotValidation-c4e73b04.js → UnpivotValidation-6f7d89ff.js} +3 -3
  116. flowfile/web/static/assets/UnpivotValidation-d5ca3b7b.css +13 -0
  117. flowfile/web/static/assets/{VueGraphicWalker-bb8535e2.js → VueGraphicWalker-3fb312e1.js} +4 -4
  118. flowfile/web/static/assets/{VueGraphicWalker-ed5ab88b.css → VueGraphicWalker-430f0b86.css} +1 -1
  119. flowfile/web/static/assets/{api-4c8e3822.js → api-24483f0d.js} +1 -1
  120. flowfile/web/static/assets/{api-2d6adc4f.js → api-8b81fa73.js} +1 -1
  121. flowfile/web/static/assets/{dropDown-35135ba8.css → dropDown-3d8dc5fa.css} +40 -40
  122. flowfile/web/static/assets/{dropDown-1bca8a74.js → dropDown-ac0fda9d.js} +3 -3
  123. flowfile/web/static/assets/{fullEditor-2985687e.js → fullEditor-5497a84a.js} +11 -10
  124. flowfile/web/static/assets/{fullEditor-178376bb.css → fullEditor-a0be62b3.css} +74 -62
  125. flowfile/web/static/assets/{genericNodeSettings-924759c7.css → genericNodeSettings-3b2507ea.css} +10 -10
  126. flowfile/web/static/assets/{genericNodeSettings-0476ba4e.js → genericNodeSettings-99014e1d.js} +5 -5
  127. flowfile/web/static/assets/index-07dda503.js +38 -0
  128. flowfile/web/static/assets/index-3ba44389.js +2696 -0
  129. flowfile/web/static/assets/{index-50508d4d.css → index-e6289dd0.css} +1945 -569
  130. flowfile/web/static/assets/{index-246f201c.js → index-fb6493ae.js} +41626 -40869
  131. flowfile/web/static/assets/node.types-2c15bb7e.js +82 -0
  132. flowfile/web/static/assets/nodeInput-0eb13f1a.js +2 -0
  133. flowfile/web/static/assets/{outputCsv-d686eeaf.js → outputCsv-8f8ba42d.js} +3 -3
  134. flowfile/web/static/assets/outputCsv-b9a072af.css +2499 -0
  135. flowfile/web/static/assets/{outputExcel-8809ea2f.js → outputExcel-393f4fef.js} +3 -3
  136. flowfile/web/static/assets/{outputExcel-b41305c0.css → outputExcel-f5d272b2.css} +26 -26
  137. flowfile/web/static/assets/{outputParquet-53ba645a.js → outputParquet-07c81f65.js} +4 -4
  138. flowfile/web/static/assets/outputParquet-54597c3c.css +4 -0
  139. flowfile/web/static/assets/{readCsv-053bf97b.js → readCsv-07f6d9ad.js} +21 -20
  140. flowfile/web/static/assets/{readCsv-bca3ed53.css → readCsv-3bfac4c3.css} +15 -15
  141. flowfile/web/static/assets/{readExcel-e1b381ea.css → readExcel-3db6b763.css} +13 -13
  142. flowfile/web/static/assets/{readExcel-ad531eab.js → readExcel-ed69bc8f.js} +10 -12
  143. flowfile/web/static/assets/{readParquet-cee068e2.css → readParquet-c5244ad5.css} +4 -4
  144. flowfile/web/static/assets/{readParquet-58e899a1.js → readParquet-e3ed4528.js} +4 -7
  145. flowfile/web/static/assets/secrets.api-002e7d7e.js +65 -0
  146. flowfile/web/static/assets/{selectDynamic-b38de2ba.js → selectDynamic-80b92899.js} +5 -5
  147. flowfile/web/static/assets/{selectDynamic-aa913ff4.css → selectDynamic-f2fb394f.css} +21 -20
  148. flowfile/web/static/assets/{vue-codemirror.esm-db9b8936.js → vue-codemirror.esm-0965f39f.js} +31 -637
  149. flowfile/web/static/assets/{vue-content-loader.es-b5f3ac30.js → vue-content-loader.es-c506ad97.js} +1 -1
  150. flowfile/web/static/index.html +2 -2
  151. {flowfile-0.4.1.dist-info → flowfile-0.5.3.dist-info}/METADATA +4 -4
  152. flowfile-0.5.3.dist-info/RECORD +402 -0
  153. {flowfile-0.4.1.dist-info → flowfile-0.5.3.dist-info}/WHEEL +1 -1
  154. {flowfile-0.4.1.dist-info → flowfile-0.5.3.dist-info}/entry_points.txt +1 -0
  155. flowfile_core/__init__.py +13 -3
  156. flowfile_core/auth/jwt.py +51 -16
  157. flowfile_core/auth/models.py +32 -7
  158. flowfile_core/auth/password.py +89 -0
  159. flowfile_core/auth/secrets.py +8 -6
  160. flowfile_core/configs/__init__.py +9 -7
  161. flowfile_core/configs/flow_logger.py +15 -14
  162. flowfile_core/configs/node_store/__init__.py +72 -4
  163. flowfile_core/configs/node_store/nodes.py +155 -172
  164. flowfile_core/configs/node_store/user_defined_node_registry.py +108 -27
  165. flowfile_core/configs/settings.py +28 -15
  166. flowfile_core/database/connection.py +7 -6
  167. flowfile_core/database/init_db.py +96 -2
  168. flowfile_core/database/models.py +3 -1
  169. flowfile_core/fileExplorer/__init__.py +17 -0
  170. flowfile_core/fileExplorer/funcs.py +123 -57
  171. flowfile_core/fileExplorer/utils.py +10 -11
  172. flowfile_core/flowfile/_extensions/real_time_interface.py +10 -8
  173. flowfile_core/flowfile/analytics/analytics_processor.py +27 -24
  174. flowfile_core/flowfile/analytics/graphic_walker.py +11 -12
  175. flowfile_core/flowfile/analytics/utils.py +1 -1
  176. flowfile_core/flowfile/code_generator/code_generator.py +391 -279
  177. flowfile_core/flowfile/connection_manager/_connection_manager.py +6 -5
  178. flowfile_core/flowfile/connection_manager/models.py +1 -1
  179. flowfile_core/flowfile/database_connection_manager/db_connections.py +60 -44
  180. flowfile_core/flowfile/database_connection_manager/models.py +1 -1
  181. flowfile_core/flowfile/extensions.py +17 -12
  182. flowfile_core/flowfile/flow_data_engine/cloud_storage_reader.py +34 -32
  183. flowfile_core/flowfile/flow_data_engine/create/funcs.py +152 -103
  184. flowfile_core/flowfile/flow_data_engine/flow_data_engine.py +526 -477
  185. flowfile_core/flowfile/flow_data_engine/flow_file_column/interface.py +2 -2
  186. flowfile_core/flowfile/flow_data_engine/flow_file_column/main.py +92 -52
  187. flowfile_core/flowfile/flow_data_engine/flow_file_column/polars_type.py +12 -11
  188. flowfile_core/flowfile/flow_data_engine/flow_file_column/type_registry.py +6 -6
  189. flowfile_core/flowfile/flow_data_engine/flow_file_column/utils.py +26 -30
  190. flowfile_core/flowfile/flow_data_engine/fuzzy_matching/prepare_for_fuzzy_match.py +43 -32
  191. flowfile_core/flowfile/flow_data_engine/join/__init__.py +1 -1
  192. flowfile_core/flowfile/flow_data_engine/join/utils.py +11 -9
  193. flowfile_core/flowfile/flow_data_engine/join/verify_integrity.py +15 -11
  194. flowfile_core/flowfile/flow_data_engine/pivot_table.py +5 -7
  195. flowfile_core/flowfile/flow_data_engine/polars_code_parser.py +95 -82
  196. flowfile_core/flowfile/flow_data_engine/read_excel_tables.py +66 -65
  197. flowfile_core/flowfile/flow_data_engine/sample_data.py +27 -21
  198. flowfile_core/flowfile/flow_data_engine/subprocess_operations/__init__.py +1 -1
  199. flowfile_core/flowfile/flow_data_engine/subprocess_operations/models.py +13 -11
  200. flowfile_core/flowfile/flow_data_engine/subprocess_operations/subprocess_operations.py +360 -191
  201. flowfile_core/flowfile/flow_data_engine/threaded_processes.py +8 -8
  202. flowfile_core/flowfile/flow_data_engine/utils.py +101 -67
  203. flowfile_core/flowfile/flow_graph.py +1011 -561
  204. flowfile_core/flowfile/flow_graph_utils.py +31 -49
  205. flowfile_core/flowfile/flow_node/flow_node.py +332 -232
  206. flowfile_core/flowfile/flow_node/models.py +54 -41
  207. flowfile_core/flowfile/flow_node/schema_callback.py +14 -19
  208. flowfile_core/flowfile/graph_tree/graph_tree.py +41 -41
  209. flowfile_core/flowfile/handler.py +82 -32
  210. flowfile_core/flowfile/manage/compatibility_enhancements.py +493 -47
  211. flowfile_core/flowfile/manage/io_flowfile.py +391 -0
  212. flowfile_core/flowfile/node_designer/__init__.py +15 -13
  213. flowfile_core/flowfile/node_designer/_type_registry.py +34 -37
  214. flowfile_core/flowfile/node_designer/custom_node.py +162 -36
  215. flowfile_core/flowfile/node_designer/ui_components.py +136 -35
  216. flowfile_core/flowfile/schema_callbacks.py +77 -54
  217. flowfile_core/flowfile/setting_generator/__init__.py +0 -1
  218. flowfile_core/flowfile/setting_generator/setting_generator.py +6 -5
  219. flowfile_core/flowfile/setting_generator/settings.py +72 -55
  220. flowfile_core/flowfile/sources/external_sources/base_class.py +12 -10
  221. flowfile_core/flowfile/sources/external_sources/custom_external_sources/external_source.py +27 -17
  222. flowfile_core/flowfile/sources/external_sources/custom_external_sources/sample_users.py +9 -9
  223. flowfile_core/flowfile/sources/external_sources/factory.py +0 -1
  224. flowfile_core/flowfile/sources/external_sources/sql_source/models.py +45 -31
  225. flowfile_core/flowfile/sources/external_sources/sql_source/sql_source.py +198 -73
  226. flowfile_core/flowfile/sources/external_sources/sql_source/utils.py +250 -196
  227. flowfile_core/flowfile/util/calculate_layout.py +9 -13
  228. flowfile_core/flowfile/util/execution_orderer.py +25 -17
  229. flowfile_core/flowfile/util/node_skipper.py +4 -4
  230. flowfile_core/flowfile/utils.py +19 -21
  231. flowfile_core/main.py +26 -19
  232. flowfile_core/routes/auth.py +284 -11
  233. flowfile_core/routes/cloud_connections.py +25 -25
  234. flowfile_core/routes/logs.py +21 -29
  235. flowfile_core/routes/public.py +3 -3
  236. flowfile_core/routes/routes.py +77 -43
  237. flowfile_core/routes/secrets.py +25 -27
  238. flowfile_core/routes/user_defined_components.py +483 -4
  239. flowfile_core/run_lock.py +0 -1
  240. flowfile_core/schemas/__init__.py +4 -6
  241. flowfile_core/schemas/analysis_schemas/graphic_walker_schemas.py +55 -55
  242. flowfile_core/schemas/cloud_storage_schemas.py +59 -55
  243. flowfile_core/schemas/input_schema.py +398 -154
  244. flowfile_core/schemas/output_model.py +50 -35
  245. flowfile_core/schemas/schemas.py +207 -67
  246. flowfile_core/schemas/transform_schema.py +1360 -435
  247. flowfile_core/schemas/yaml_types.py +117 -0
  248. flowfile_core/secret_manager/secret_manager.py +17 -13
  249. flowfile_core/{flowfile/node_designer/data_types.py → types.py} +33 -3
  250. flowfile_core/utils/arrow_reader.py +7 -6
  251. flowfile_core/utils/excel_file_manager.py +3 -3
  252. flowfile_core/utils/fileManager.py +7 -7
  253. flowfile_core/utils/fl_executor.py +8 -10
  254. flowfile_core/utils/utils.py +4 -4
  255. flowfile_core/utils/validate_setup.py +5 -4
  256. flowfile_frame/__init__.py +107 -50
  257. flowfile_frame/adapters.py +2 -9
  258. flowfile_frame/adding_expr.py +73 -32
  259. flowfile_frame/cloud_storage/frame_helpers.py +27 -23
  260. flowfile_frame/cloud_storage/secret_manager.py +12 -26
  261. flowfile_frame/config.py +2 -5
  262. flowfile_frame/expr.py +311 -218
  263. flowfile_frame/expr.pyi +160 -159
  264. flowfile_frame/expr_name.py +23 -23
  265. flowfile_frame/flow_frame.py +581 -489
  266. flowfile_frame/flow_frame.pyi +123 -104
  267. flowfile_frame/flow_frame_methods.py +236 -252
  268. flowfile_frame/group_frame.py +50 -20
  269. flowfile_frame/join.py +2 -2
  270. flowfile_frame/lazy.py +129 -87
  271. flowfile_frame/lazy_methods.py +83 -30
  272. flowfile_frame/list_name_space.py +55 -50
  273. flowfile_frame/selectors.py +148 -68
  274. flowfile_frame/series.py +9 -7
  275. flowfile_frame/utils.py +19 -21
  276. flowfile_worker/__init__.py +12 -4
  277. flowfile_worker/configs.py +11 -19
  278. flowfile_worker/create/__init__.py +14 -27
  279. flowfile_worker/create/funcs.py +143 -94
  280. flowfile_worker/create/models.py +139 -68
  281. flowfile_worker/create/pl_types.py +14 -15
  282. flowfile_worker/create/read_excel_tables.py +34 -41
  283. flowfile_worker/create/utils.py +22 -19
  284. flowfile_worker/external_sources/s3_source/main.py +18 -51
  285. flowfile_worker/external_sources/s3_source/models.py +34 -27
  286. flowfile_worker/external_sources/sql_source/main.py +8 -5
  287. flowfile_worker/external_sources/sql_source/models.py +13 -9
  288. flowfile_worker/flow_logger.py +10 -8
  289. flowfile_worker/funcs.py +214 -155
  290. flowfile_worker/main.py +11 -17
  291. flowfile_worker/models.py +35 -28
  292. flowfile_worker/process_manager.py +2 -3
  293. flowfile_worker/routes.py +121 -93
  294. flowfile_worker/secrets.py +9 -6
  295. flowfile_worker/spawner.py +80 -49
  296. flowfile_worker/utils.py +3 -2
  297. shared/__init__.py +2 -7
  298. shared/storage_config.py +25 -13
  299. test_utils/postgres/commands.py +3 -2
  300. test_utils/postgres/fixtures.py +9 -9
  301. test_utils/s3/commands.py +1 -1
  302. test_utils/s3/data_generator.py +3 -4
  303. test_utils/s3/demo_data_generator.py +4 -7
  304. test_utils/s3/fixtures.py +7 -5
  305. tools/migrate/README.md +56 -0
  306. tools/migrate/__init__.py +12 -0
  307. tools/migrate/__main__.py +118 -0
  308. tools/migrate/legacy_schemas.py +682 -0
  309. tools/migrate/migrate.py +610 -0
  310. tools/migrate/tests/__init__.py +0 -0
  311. tools/migrate/tests/conftest.py +21 -0
  312. tools/migrate/tests/test_migrate.py +622 -0
  313. tools/migrate/tests/test_migration_e2e.py +1009 -0
  314. tools/migrate/tests/test_node_migrations.py +843 -0
  315. flowfile/web/static/assets/CloudConnectionManager-2dfdce2f.css +0 -86
  316. flowfile/web/static/assets/CustomNode-74a37f74.css +0 -32
  317. flowfile/web/static/assets/DatabaseManager-30fa27e5.css +0 -64
  318. flowfile/web/static/assets/Filter-812dcbca.js +0 -164
  319. flowfile/web/static/assets/Filter-f62091b3.css +0 -20
  320. flowfile/web/static/assets/ManualInput-3246a08d.css +0 -96
  321. flowfile/web/static/assets/PivotValidation-891ddfb0.css +0 -13
  322. flowfile/web/static/assets/PivotValidation-c46cd420.css +0 -13
  323. flowfile/web/static/assets/SliderInput-b8fb6a8c.css +0 -4
  324. flowfile/web/static/assets/UnpivotValidation-0d240eeb.css +0 -13
  325. flowfile/web/static/assets/outputCsv-9cc59e0b.css +0 -2499
  326. flowfile/web/static/assets/outputParquet-cf8cf3f2.css +0 -4
  327. flowfile/web/static/assets/secretApi-538058f3.js +0 -46
  328. flowfile/web/static/assets/vue-codemirror-bccfde04.css +0 -32
  329. flowfile-0.4.1.dist-info/RECORD +0 -376
  330. flowfile_core/flowfile/manage/open_flowfile.py +0 -143
  331. {flowfile-0.4.1.dist-info → flowfile-0.5.3.dist-info}/licenses/LICENSE +0 -0
  332. /flowfile_core/flowfile/manage/manage_flowfile.py → /tools/__init__.py +0 -0
flowfile/api.py CHANGED
@@ -1,23 +1,23 @@
1
1
  # flowfile/api.py
2
2
 
3
- import uuid
4
- import time
3
+ import atexit
4
+ import logging
5
5
  import os
6
- import requests
6
+ import platform
7
+ import shutil
7
8
  import subprocess
8
9
  import sys
9
- import atexit
10
- import logging
10
+ import time
11
+ import uuid
11
12
  import webbrowser
12
- import shutil
13
- import platform
14
-
15
13
  from pathlib import Path
16
- from typing import Optional, Dict, Any, Union, Tuple, List
17
14
  from subprocess import Popen
18
- from flowfile_core.flowfile.flow_graph import FlowGraph
19
15
  from tempfile import TemporaryDirectory
20
- import flowfile as ff
16
+ from typing import Any
17
+
18
+ import requests
19
+
20
+ from flowfile_core.flowfile.flow_graph import FlowGraph
21
21
 
22
22
  # Configuration
23
23
  FLOWFILE_HOST: str = os.environ.get("FLOWFILE_HOST", "127.0.0.1")
@@ -30,7 +30,7 @@ POETRY_PATH: str = os.environ.get("POETRY_PATH", "poetry")
30
30
  logger: logging.Logger = logging.getLogger(__name__)
31
31
 
32
32
  # Global variable to track the managed server process
33
- _server_process: Optional[Popen] = None
33
+ _server_process: Popen | None = None
34
34
 
35
35
 
36
36
  def is_flowfile_running() -> bool:
@@ -56,9 +56,7 @@ def stop_flowfile_server_process() -> None:
56
56
  try:
57
57
  # On Windows, use subprocess to kill the process tree
58
58
  subprocess.run(
59
- ["taskkill", "/F", "/T", "/PID", str(_server_process.pid)],
60
- capture_output=True,
61
- check=False
59
+ ["taskkill", "/F", "/T", "/PID", str(_server_process.pid)], capture_output=True, check=False
62
60
  )
63
61
  logger.info("Server process terminated (Windows).")
64
62
  except Exception as e:
@@ -116,10 +114,7 @@ def is_poetry_environment() -> bool:
116
114
 
117
115
  # Check if we're in a poetry virtual environment
118
116
  venv_path = os.environ.get("VIRTUAL_ENV", "")
119
- if venv_path and (
120
- "poetry" in venv_path.lower() or
121
- Path(venv_path).joinpath(".poetry-venv").exists()
122
- ):
117
+ if venv_path and ("poetry" in venv_path.lower() or Path(venv_path).joinpath(".poetry-venv").exists()):
123
118
  return True
124
119
 
125
120
  # Look for pyproject.toml with poetry section
@@ -128,7 +123,7 @@ def is_poetry_environment() -> bool:
128
123
  pyproject = parent / "pyproject.toml"
129
124
  if pyproject.exists():
130
125
  try:
131
- with open(pyproject, "r") as f:
126
+ with open(pyproject) as f:
132
127
  content = f.read()
133
128
  if "[tool.poetry]" in content:
134
129
  return True
@@ -143,7 +138,7 @@ def is_command_available(command: str) -> bool:
143
138
  return shutil.which(command) is not None
144
139
 
145
140
 
146
- def build_server_command(module_name: str) -> List[str]:
141
+ def build_server_command(module_name: str) -> list[str]:
147
142
  """
148
143
  Build the appropriate command to start the server based on environment detection.
149
144
  Tries Poetry first if in a Poetry environment, falls back to direct module execution.
@@ -167,7 +162,7 @@ def build_server_command(module_name: str) -> List[str]:
167
162
  # Case 2: Fallback to direct script execution
168
163
  logger.info("Falling back to direct script execution.")
169
164
  python_parent_dir = Path(sys.executable).parent
170
- command: List[str]
165
+ command: list[str]
171
166
  scripts_dir = Path(sys.executable).parent
172
167
 
173
168
  if platform.system() == "Windows":
@@ -194,7 +189,7 @@ def build_server_command(module_name: str) -> List[str]:
194
189
  # On Unix-like systems, the script in 'bin' is directly executable
195
190
  script_path = python_parent_dir / "bin" / module_name
196
191
  if not script_path.exists():
197
- script_path = python_parent_dir / module_name # Fallback for different venv structures
192
+ script_path = python_parent_dir / module_name # Fallback for different venv structures
198
193
 
199
194
  logger.info(f"Using direct script execution path: {script_path}")
200
195
  command = [str(script_path), "run", "ui", "--no-browser"]
@@ -213,7 +208,7 @@ def check_if_in_single_mode() -> bool:
213
208
  return False
214
209
 
215
210
 
216
- def start_flowfile_server_process(module_name: str = DEFAULT_MODULE_NAME) -> Tuple[bool, bool]:
211
+ def start_flowfile_server_process(module_name: str = DEFAULT_MODULE_NAME) -> tuple[bool, bool]:
217
212
  """
218
213
  Start the Flowfile server as a background process if it's not already running.
219
214
  Automatically detects and uses Poetry if in a Poetry environment.
@@ -241,7 +236,7 @@ def start_flowfile_server_process(module_name: str = DEFAULT_MODULE_NAME) -> Tup
241
236
  command,
242
237
  stdout=subprocess.DEVNULL,
243
238
  stderr=subprocess.PIPE,
244
- creationflags=subprocess.CREATE_NEW_PROCESS_GROUP
239
+ creationflags=subprocess.CREATE_NEW_PROCESS_GROUP,
245
240
  )
246
241
  else:
247
242
  _server_process = Popen(
@@ -265,12 +260,14 @@ def start_flowfile_server_process(module_name: str = DEFAULT_MODULE_NAME) -> Tup
265
260
  print("Waiting for Flowfile UI to start...")
266
261
  time.sleep(1)
267
262
  else:
268
- logger.error("Failed to start server: API did not become responsive within 60 seconds. "
269
- "Try again or start service by running\n"
270
- "flowfile run ui")
263
+ logger.error(
264
+ "Failed to start server: API did not become responsive within 60 seconds. "
265
+ "Try again or start service by running\n"
266
+ "flowfile run ui"
267
+ )
271
268
  if _server_process and _server_process.stderr:
272
269
  try:
273
- stderr_output: str = _server_process.stderr.read().decode(errors='ignore')
270
+ stderr_output: str = _server_process.stderr.read().decode(errors="ignore")
274
271
  logger.error(f"Server process stderr:\n{stderr_output[:1000]}...")
275
272
  except Exception as read_err:
276
273
  logger.error(f"Could not read stderr from server process: {read_err}")
@@ -286,7 +283,7 @@ def start_flowfile_server_process(module_name: str = DEFAULT_MODULE_NAME) -> Tup
286
283
  logger.error(f"An unexpected error occurred while starting the server process: {e}")
287
284
  if _server_process and _server_process.stderr:
288
285
  try:
289
- stderr_output = _server_process.stderr.read().decode(errors='ignore')
286
+ stderr_output = _server_process.stderr.read().decode(errors="ignore")
290
287
  logger.error(f"Server process stderr:\n{stderr_output[:1000]}...")
291
288
  except Exception as read_err:
292
289
  logger.error(f"Could not read stderr from server process: {read_err}")
@@ -295,17 +292,13 @@ def start_flowfile_server_process(module_name: str = DEFAULT_MODULE_NAME) -> Tup
295
292
  return False, False
296
293
 
297
294
 
298
- def get_auth_token() -> Optional[str]:
295
+ def get_auth_token() -> str | None:
299
296
  """Get an authentication token from the Flowfile API."""
300
297
  try:
301
- response: requests.Response = requests.post(
302
- f"{FLOWFILE_BASE_URL}/auth/token",
303
- json={},
304
- timeout=5
305
- )
298
+ response: requests.Response = requests.post(f"{FLOWFILE_BASE_URL}/auth/token", json={}, timeout=5)
306
299
  response.raise_for_status()
307
- token_data: Dict[str, Any] = response.json()
308
- access_token: Optional[str] = token_data.get("access_token")
300
+ token_data: dict[str, Any] = response.json()
301
+ access_token: str | None = token_data.get("access_token")
309
302
  if not access_token:
310
303
  logger.error("Auth token endpoint succeeded but 'access_token' was missing in response.")
311
304
  return None
@@ -319,7 +312,7 @@ def get_auth_token() -> Optional[str]:
319
312
  return None
320
313
 
321
314
 
322
- def import_flow_to_editor(flow_path: Path, auth_token: str) -> Optional[int]:
315
+ def import_flow_to_editor(flow_path: Path, auth_token: str) -> int | None:
323
316
  """Import the flow into the Flowfile editor using the API endpoint."""
324
317
  if not flow_path.is_file():
325
318
  logger.error(f"Flow file not found: {flow_path}")
@@ -329,19 +322,15 @@ def import_flow_to_editor(flow_path: Path, auth_token: str) -> Optional[int]:
329
322
  return None
330
323
 
331
324
  try:
332
- headers: Dict[str, str] = {"Authorization": f"Bearer {auth_token}"}
333
- params: Dict[str, str] = {"flow_path": str(flow_path)}
334
-
325
+ headers: dict[str, str] = {"Authorization": f"Bearer {auth_token}"}
326
+ params: dict[str, str] = {"flow_path": str(flow_path)}
335
327
  response: requests.Response = requests.get(
336
- f"{FLOWFILE_BASE_URL}/import_flow/",
337
- params=params,
338
- headers=headers,
339
- timeout=10
328
+ f"{FLOWFILE_BASE_URL}/import_flow/", params=params, headers=headers, timeout=10
340
329
  )
341
330
  response.raise_for_status()
342
331
 
343
- flow_id_data: Union[int, Dict[str, Any], Any] = response.json()
344
- flow_id: Optional[int] = None
332
+ flow_id_data: int | dict[str, Any] | Any = response.json()
333
+ flow_id: int | None = None
345
334
 
346
335
  if isinstance(flow_id_data, int):
347
336
  flow_id = flow_id_data
@@ -356,7 +345,7 @@ def import_flow_to_editor(flow_path: Path, auth_token: str) -> Optional[int]:
356
345
 
357
346
  except requests.exceptions.RequestException as e:
358
347
  logger.error(f"Failed to import flow: {e}")
359
- if hasattr(e, 'response') and e.response is not None:
348
+ if hasattr(e, "response") and e.response is not None:
360
349
  logger.error(f"Server response: {e.response.status_code} - {e.response.text[:500]}")
361
350
  return None
362
351
  except Exception as e:
@@ -365,10 +354,10 @@ def import_flow_to_editor(flow_path: Path, auth_token: str) -> Optional[int]:
365
354
 
366
355
 
367
356
  def _save_flow_to_location(
368
- flow_graph: FlowGraph, storage_location: Optional[str]
369
- ) -> Tuple[Optional[Path], Optional[TemporaryDirectory]]:
357
+ flow_graph: FlowGraph, storage_location: str | None
358
+ ) -> tuple[Path | None, TemporaryDirectory | None]:
370
359
  """Handles graph saving, path resolution, and temporary directory creation."""
371
- temp_dir_obj: Optional[TemporaryDirectory] = None
360
+ temp_dir_obj: TemporaryDirectory | None = None
372
361
  flow_file_path: Path
373
362
  try:
374
363
  if storage_location:
@@ -410,7 +399,7 @@ def _open_flow_in_browser(flow_id: int) -> None:
410
399
  logger.info("Not in unified mode ('electron'), browser will not be opened automatically.")
411
400
 
412
401
 
413
- def _cleanup_temporary_storage(temp_dir_obj: Optional[TemporaryDirectory]) -> None:
402
+ def _cleanup_temporary_storage(temp_dir_obj: TemporaryDirectory | None) -> None:
414
403
  """Safely cleans up the temporary directory if one was created."""
415
404
  if temp_dir_obj:
416
405
  try:
@@ -420,8 +409,12 @@ def _cleanup_temporary_storage(temp_dir_obj: Optional[TemporaryDirectory]) -> No
420
409
  logger.error(f"Error cleaning up temporary directory {temp_dir_obj.name}: {e}")
421
410
 
422
411
 
423
- def open_graph_in_editor(flow_graph: FlowGraph, storage_location: Optional[str] = None,
424
- module_name: str = DEFAULT_MODULE_NAME, automatically_open_browser: bool = True) -> bool:
412
+ def open_graph_in_editor(
413
+ flow_graph: FlowGraph,
414
+ storage_location: str | None = None,
415
+ module_name: str = DEFAULT_MODULE_NAME,
416
+ automatically_open_browser: bool = True,
417
+ ) -> bool:
425
418
  """
426
419
  Save the ETL graph, ensure the Flowfile server is running (starting it
427
420
  if necessary), import the graph via API, and open it in a new browser
@@ -437,10 +430,10 @@ def open_graph_in_editor(flow_graph: FlowGraph, storage_location: Optional[str]
437
430
  Returns:
438
431
  True if the graph was successfully imported, False otherwise.
439
432
  """
440
- temp_dir_obj: Optional[TemporaryDirectory] = None
433
+ temp_dir_obj: TemporaryDirectory | None = None
441
434
  try:
442
435
  original_execution_settings = flow_graph.flow_settings.model_copy()
443
- flow_graph.flow_settings.execution_location = "local" # when running in the process. Go for speed first
436
+ flow_graph.flow_settings.execution_location = "local"
444
437
  flow_graph.flow_settings.execution_mode = "Development"
445
438
  flow_file_path, temp_dir_obj = _save_flow_to_location(flow_graph, storage_location)
446
439
  if not flow_file_path:
@@ -458,7 +451,7 @@ def open_graph_in_editor(flow_graph: FlowGraph, storage_location: Optional[str]
458
451
  if flow_id is not None:
459
452
  if flow_in_single_mode and automatically_open_browser:
460
453
  _open_flow_in_browser(flow_id)
461
- logger.info(f"Ui available at: http://127.0.0.1:63578/ui#/main/designer")
454
+ logger.info("Ui available at: http://127.0.0.1:63578/ui#/main/designer")
462
455
  return True
463
456
  else:
464
457
  return False
@@ -467,4 +460,4 @@ def open_graph_in_editor(flow_graph: FlowGraph, storage_location: Optional[str]
467
460
  logger.error(f"An unexpected error occurred in open_graph_in_editor: {e}", exc_info=True)
468
461
  return False
469
462
  finally:
470
- _cleanup_temporary_storage(temp_dir_obj)
463
+ _cleanup_temporary_storage(temp_dir_obj)
flowfile/web/__init__.py CHANGED
@@ -4,14 +4,16 @@ Web interface for Flowfile.
4
4
  Extends the flowfile_core FastAPI app to serve the Vue.js frontend
5
5
  and includes worker functionality.
6
6
  """
7
+
8
+ import asyncio
7
9
  import os
8
10
  import time
9
- from pathlib import Path
10
11
  import webbrowser
11
- import asyncio
12
+ from pathlib import Path
13
+
12
14
  from fastapi import FastAPI, Response
13
- from fastapi.staticfiles import StaticFiles
14
15
  from fastapi.responses import FileResponse, RedirectResponse
16
+ from fastapi.staticfiles import StaticFiles
15
17
 
16
18
  static_dir = Path(__file__).parent / "static"
17
19
 
@@ -52,8 +54,8 @@ def extend_app(app: FastAPI):
52
54
  @app.get("/single_mode")
53
55
  async def in_single_mode() -> bool:
54
56
  print("Checking if single file mode is enabled")
55
- print(os.environ.get('FLOWFILE_SINGLE_FILE_MODE'))
56
- return os.environ.get('FLOWFILE_SINGLE_FILE_MODE', "0") == "1"
57
+ print(os.environ.get("FLOWFILE_SINGLE_FILE_MODE"))
58
+ return os.environ.get("FLOWFILE_SINGLE_FILE_MODE", "0") == "1"
57
59
 
58
60
  @app.get("/ui", include_in_schema=False)
59
61
  async def web_ui_root():
@@ -95,8 +97,8 @@ def include_worker_routes(app: FastAPI):
95
97
  """
96
98
  try:
97
99
  # Import worker modules
100
+ from flowfile_worker import CACHE_DIR, mp_context
98
101
  from flowfile_worker.routes import router as worker_router
99
- from flowfile_worker import mp_context, CACHE_DIR
100
102
 
101
103
  # Add lifecycle event handler for worker cleanup
102
104
  @app.on_event("shutdown")
@@ -133,12 +135,15 @@ def start_server(host="127.0.0.1", port=63578, open_browser=True):
133
135
  This function is a wrapper around flowfile_core.main.run().
134
136
  """
135
137
  # Set electron mode
136
- os.environ["FLOWFILE_MODE"] = "electron"
138
+ if "FLOWFILE_MODE" not in os.environ:
139
+ os.environ["FLOWFILE_MODE"] = "electron"
137
140
 
138
141
  # Import core app
139
- from flowfile_core.main import run, app as core_app
140
142
  from flowfile_core.configs.settings import OFFLOAD_TO_WORKER
141
- if host != '127.0.0.1':
143
+ from flowfile_core.main import app as core_app
144
+ from flowfile_core.main import run
145
+
146
+ if host != "127.0.0.1":
142
147
  raise NotImplementedError("Other then local host is not supported")
143
148
  if port != 63578:
144
149
  raise NotImplementedError("Service must run on port 63578")