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
@@ -1,5 +1,3 @@
1
- from typing import List, Union, TYPE_CHECKING # Added TYPE_CHECKING
2
-
3
1
  import polars as pl
4
2
 
5
3
  # --- TYPE CHECKING IMPORTS ---
@@ -7,11 +5,12 @@ import polars as pl
7
5
  # Import Expr only for type hints
8
6
  from flowfile_frame.expr import Expr
9
7
 
10
-
11
8
  # --- Selector Base Classes (Compound, Complement) ---
12
9
 
10
+
13
11
  class Selector:
14
12
  """Base class for column selectors, inspired by polars.selectors"""
13
+
15
14
  def __init__(self):
16
15
  self._repr_str = self._get_repr_str() # Use base repr calculation method
17
16
  # No agg_func state stored here anymore
@@ -28,25 +27,25 @@ class Selector:
28
27
  def __repr__(self) -> str:
29
28
  return self._repr_str
30
29
 
31
- def __or__(self, other: 'Selector') -> 'CompoundSelector':
32
- return CompoundSelector(self, other, 'union')
30
+ def __or__(self, other: "Selector") -> "CompoundSelector":
31
+ return CompoundSelector(self, other, "union")
33
32
 
34
- def __and__(self, other: 'Selector') -> 'CompoundSelector':
35
- return CompoundSelector(self, other, 'intersection')
33
+ def __and__(self, other: "Selector") -> "CompoundSelector":
34
+ return CompoundSelector(self, other, "intersection")
36
35
 
37
- def __sub__(self, other: 'Selector') -> 'CompoundSelector':
38
- return CompoundSelector(self, other, 'difference')
36
+ def __sub__(self, other: "Selector") -> "CompoundSelector":
37
+ return CompoundSelector(self, other, "difference")
39
38
 
40
- def __xor__(self, other: 'Selector') -> 'CompoundSelector':
41
- return CompoundSelector(self, other, 'symmetric_difference')
39
+ def __xor__(self, other: "Selector") -> "CompoundSelector":
40
+ return CompoundSelector(self, other, "symmetric_difference")
42
41
 
43
- def __invert__(self) -> 'ComplementSelector':
42
+ def __invert__(self) -> "ComplementSelector":
44
43
  return ComplementSelector(self)
45
44
 
46
45
  # --- Aggregation Methods ---
47
46
  # These methods now return Expr objects, importing Expr locally
48
47
 
49
- def sum(self) -> 'Expr':
48
+ def sum(self) -> "Expr":
50
49
  """Create an expression to sum columns selected by this selector."""
51
50
  # Expr init will handle creating the 'pl.sum(selector)' repr
52
51
  return Expr(expr=None, selector=self, agg_func="sum")
@@ -54,43 +53,43 @@ class Selector:
54
53
  def expr(self):
55
54
  return eval(self.repr_str)
56
55
 
57
- def mean(self) -> 'Expr':
56
+ def mean(self) -> "Expr":
58
57
  """Create an expression to average columns selected by this selector."""
59
58
  return Expr(expr=None, selector=self, agg_func="mean")
60
59
 
61
- def median(self) -> 'Expr':
60
+ def median(self) -> "Expr":
62
61
  """Create an expression to find the median of columns selected by this selector."""
63
62
  return Expr(expr=None, selector=self, agg_func="median")
64
63
 
65
- def min(self) -> 'Expr':
64
+ def min(self) -> "Expr":
66
65
  """Create an expression to find the minimum of columns selected by this selector."""
67
66
  return Expr(expr=None, selector=self, agg_func="min")
68
67
 
69
- def max(self) -> 'Expr':
68
+ def max(self) -> "Expr":
70
69
  """Create an expression to find the maximum of columns selected by this selector."""
71
70
  return Expr(expr=None, selector=self, agg_func="max")
72
71
 
73
- def std(self, ddof: int = 1) -> 'Expr':
72
+ def std(self, ddof: int = 1) -> "Expr":
74
73
  """Create an expression to find the standard deviation of columns selected by this selector."""
75
74
  return Expr(expr=None, selector=self, agg_func="std", ddof=ddof)
76
75
 
77
- def var(self, ddof: int = 1) -> 'Expr':
76
+ def var(self, ddof: int = 1) -> "Expr":
78
77
  """Create an expression to find the variance of columns selected by this selector."""
79
78
  return Expr(expr=None, selector=self, agg_func="var", ddof=ddof)
80
79
 
81
- def first(self) -> 'Expr':
80
+ def first(self) -> "Expr":
82
81
  """Create an expression to get the first element of columns selected by this selector."""
83
82
  return Expr(expr=None, selector=self, agg_func="first")
84
83
 
85
- def last(self) -> 'Expr':
84
+ def last(self) -> "Expr":
86
85
  """Create an expression to get the last element of columns selected by this selector."""
87
86
  return Expr(expr=None, selector=self, agg_func="last")
88
87
 
89
- def count(self) -> 'Expr':
88
+ def count(self) -> "Expr":
90
89
  """Create an expression to count elements in columns selected by this selector."""
91
90
  return Expr(expr=None, selector=self, agg_func="count")
92
91
 
93
- def n_unique(self) -> 'Expr':
92
+ def n_unique(self) -> "Expr":
94
93
  """Create an expression to count unique elements in columns selected by this selector."""
95
94
  return Expr(expr=None, selector=self, agg_func="n_unique")
96
95
 
@@ -99,6 +98,7 @@ class Selector:
99
98
 
100
99
  class CompoundSelector(Selector):
101
100
  """Selector representing a compound operation between two selectors"""
101
+
102
102
  def __init__(self, left: Selector, right: Selector, operation: str):
103
103
  self.left = left
104
104
  self.right = right
@@ -106,8 +106,8 @@ class CompoundSelector(Selector):
106
106
  super().__init__()
107
107
 
108
108
  def _get_repr_str(self) -> str:
109
- op_map = {'union': '|', 'intersection': '&', 'difference': '-', 'symmetric_difference': '^'}
110
- op_symbol = op_map.get(self.operation, '|')
109
+ op_map = {"union": "|", "intersection": "&", "difference": "-", "symmetric_difference": "^"}
110
+ op_symbol = op_map.get(self.operation, "|")
111
111
  # Use base repr (_repr_str) of operands
112
112
  left_repr = f"({self.left._repr_str})" if isinstance(self.left, CompoundSelector) else self.left._repr_str
113
113
  right_repr = f"({self.right._repr_str})" if isinstance(self.right, CompoundSelector) else self.right._repr_str
@@ -116,77 +116,95 @@ class CompoundSelector(Selector):
116
116
 
117
117
  class ComplementSelector(Selector):
118
118
  """Selector representing the complement (NOT) of another selector"""
119
+
119
120
  def __init__(self, selector: Selector):
120
121
  self.selector = selector
121
122
  super().__init__()
122
123
 
123
124
  def _get_repr_str(self) -> str:
124
- selector_repr = f"({self.selector._repr_str})" if isinstance(self.selector, CompoundSelector) else self.selector._repr_str
125
+ selector_repr = (
126
+ f"({self.selector._repr_str})" if isinstance(self.selector, CompoundSelector) else self.selector._repr_str
127
+ )
125
128
  return f"~{selector_repr}"
126
129
 
127
130
 
128
131
  class NumericSelector(Selector):
129
- def _get_repr_str(self) -> str: return "pl.selectors.numeric()"
132
+ def _get_repr_str(self) -> str:
133
+ return "pl.selectors.numeric()"
130
134
 
131
135
 
132
136
  class FloatSelector(Selector):
133
- def _get_repr_str(self) -> str: return "pl.selectors.float()"
137
+ def _get_repr_str(self) -> str:
138
+ return "pl.selectors.float()"
134
139
 
135
140
 
136
141
  class IntegerSelector(Selector):
137
- def _get_repr_str(self) -> str: return "pl.selectors.integer()"
142
+ def _get_repr_str(self) -> str:
143
+ return "pl.selectors.integer()"
138
144
 
139
145
 
140
146
  class StringSelector(Selector):
141
- def _get_repr_str(self) -> str: return "pl.selectors.string()"
147
+ def _get_repr_str(self) -> str:
148
+ return "pl.selectors.string()"
142
149
 
143
150
 
144
151
  class TemporalSelector(Selector):
145
- def _get_repr_str(self) -> str: return "pl.selectors.temporal()"
152
+ def _get_repr_str(self) -> str:
153
+ return "pl.selectors.temporal()"
146
154
 
147
155
 
148
156
  class DatetimeSelector(Selector):
149
- def _get_repr_str(self) -> str: return "pl.selectors.datetime()"
157
+ def _get_repr_str(self) -> str:
158
+ return "pl.selectors.datetime()"
150
159
 
151
160
 
152
161
  class DateSelector(Selector):
153
- def _get_repr_str(self) -> str: return "pl.selectors.date()"
162
+ def _get_repr_str(self) -> str:
163
+ return "pl.selectors.date()"
154
164
 
155
165
 
156
166
  class TimeSelector(Selector):
157
- def _get_repr_str(self) -> str: return "pl.selectors.time()"
167
+ def _get_repr_str(self) -> str:
168
+ return "pl.selectors.time()"
158
169
 
159
170
 
160
171
  class DurationSelector(Selector):
161
- def _get_repr_str(self) -> str: return "pl.selectors.duration()"
172
+ def _get_repr_str(self) -> str:
173
+ return "pl.selectors.duration()"
162
174
 
163
175
 
164
176
  class BooleanSelector(Selector):
165
- def _get_repr_str(self) -> str: return "pl.selectors.boolean()"
177
+ def _get_repr_str(self) -> str:
178
+ return "pl.selectors.boolean()"
166
179
 
167
180
 
168
181
  class CategoricalSelector(Selector):
169
- def _get_repr_str(self) -> str: return "pl.selectors.categorical()"
182
+ def _get_repr_str(self) -> str:
183
+ return "pl.selectors.categorical()"
170
184
 
171
185
 
172
186
  class ObjectSelector(Selector):
173
- def _get_repr_str(self) -> str: return "pl.selectors.object()"
187
+ def _get_repr_str(self) -> str:
188
+ return "pl.selectors.object()"
174
189
 
175
190
 
176
191
  class ListSelector(Selector):
177
- def _get_repr_str(self) -> str: return "pl.selectors.list()"
192
+ def _get_repr_str(self) -> str:
193
+ return "pl.selectors.list()"
178
194
 
179
195
 
180
196
  class StructSelector(Selector):
181
- def _get_repr_str(self) -> str: return "pl.selectors.struct()"
197
+ def _get_repr_str(self) -> str:
198
+ return "pl.selectors.struct()"
182
199
 
183
200
 
184
201
  class AllSelector(Selector):
185
- def _get_repr_str(self) -> str: return "pl.selectors.all()"
202
+ def _get_repr_str(self) -> str:
203
+ return "pl.selectors.all()"
186
204
 
187
205
 
188
206
  class DtypeSelector(Selector):
189
- def __init__(self, dtypes: Union[pl.DataType, List[pl.DataType]]):
207
+ def __init__(self, dtypes: pl.DataType | list[pl.DataType]):
190
208
  self.dtypes = dtypes if isinstance(dtypes, list) else [dtypes]
191
209
  super().__init__()
192
210
 
@@ -208,38 +226,100 @@ class PatternSelector(Selector):
208
226
 
209
227
 
210
228
  class ContainsSelector(PatternSelector):
211
- def _get_repr_str(self) -> str: return f"pl.selectors.contains({self.pattern!r})"
229
+ def _get_repr_str(self) -> str:
230
+ return f"pl.selectors.contains({self.pattern!r})"
212
231
 
213
232
 
214
233
  class StartsWithSelector(PatternSelector):
215
- def _get_repr_str(self) -> str: return f"pl.selectors.starts_with({self.pattern!r})"
234
+ def _get_repr_str(self) -> str:
235
+ return f"pl.selectors.starts_with({self.pattern!r})"
216
236
 
217
237
 
218
238
  class EndsWithSelector(PatternSelector):
219
- def _get_repr_str(self) -> str: return f"pl.selectors.ends_with({self.pattern!r})"
239
+ def _get_repr_str(self) -> str:
240
+ return f"pl.selectors.ends_with({self.pattern!r})"
220
241
 
221
242
 
222
243
  class MatchesSelector(PatternSelector):
223
- def _get_repr_str(self) -> str: return f"pl.selectors.matches({self.pattern!r})"
224
-
225
-
226
- def numeric() -> NumericSelector: return NumericSelector()
227
- def float_() -> FloatSelector: return FloatSelector()
228
- def integer() -> IntegerSelector: return IntegerSelector()
229
- def string() -> StringSelector: return StringSelector()
230
- def temporal() -> TemporalSelector: return TemporalSelector()
231
- def datetime() -> DatetimeSelector: return DatetimeSelector()
232
- def date() -> DateSelector: return DateSelector()
233
- def time() -> TimeSelector: return TimeSelector()
234
- def duration() -> DurationSelector: return DurationSelector()
235
- def boolean() -> BooleanSelector: return BooleanSelector()
236
- def categorical() -> CategoricalSelector: return CategoricalSelector()
237
- def object_() -> ObjectSelector: return ObjectSelector()
238
- def list_() -> ListSelector: return ListSelector()
239
- def struct() -> StructSelector: return StructSelector()
240
- def all_() -> AllSelector: return AllSelector()
241
- def by_dtype(dtypes: Union[pl.DataType, List[pl.DataType]]) -> DtypeSelector: return DtypeSelector(dtypes)
242
- def contains(pattern: str) -> ContainsSelector: return ContainsSelector(pattern)
243
- def starts_with(pattern: str) -> StartsWithSelector: return StartsWithSelector(pattern)
244
- def ends_with(pattern: str) -> EndsWithSelector: return EndsWithSelector(pattern)
245
- def matches(pattern: str) -> MatchesSelector: return MatchesSelector(pattern)
244
+ def _get_repr_str(self) -> str:
245
+ return f"pl.selectors.matches({self.pattern!r})"
246
+
247
+
248
+ def numeric() -> NumericSelector:
249
+ return NumericSelector()
250
+
251
+
252
+ def float_() -> FloatSelector:
253
+ return FloatSelector()
254
+
255
+
256
+ def integer() -> IntegerSelector:
257
+ return IntegerSelector()
258
+
259
+
260
+ def string() -> StringSelector:
261
+ return StringSelector()
262
+
263
+
264
+ def temporal() -> TemporalSelector:
265
+ return TemporalSelector()
266
+
267
+
268
+ def datetime() -> DatetimeSelector:
269
+ return DatetimeSelector()
270
+
271
+
272
+ def date() -> DateSelector:
273
+ return DateSelector()
274
+
275
+
276
+ def time() -> TimeSelector:
277
+ return TimeSelector()
278
+
279
+
280
+ def duration() -> DurationSelector:
281
+ return DurationSelector()
282
+
283
+
284
+ def boolean() -> BooleanSelector:
285
+ return BooleanSelector()
286
+
287
+
288
+ def categorical() -> CategoricalSelector:
289
+ return CategoricalSelector()
290
+
291
+
292
+ def object_() -> ObjectSelector:
293
+ return ObjectSelector()
294
+
295
+
296
+ def list_() -> ListSelector:
297
+ return ListSelector()
298
+
299
+
300
+ def struct() -> StructSelector:
301
+ return StructSelector()
302
+
303
+
304
+ def all_() -> AllSelector:
305
+ return AllSelector()
306
+
307
+
308
+ def by_dtype(dtypes: pl.DataType | list[pl.DataType]) -> DtypeSelector:
309
+ return DtypeSelector(dtypes)
310
+
311
+
312
+ def contains(pattern: str) -> ContainsSelector:
313
+ return ContainsSelector(pattern)
314
+
315
+
316
+ def starts_with(pattern: str) -> StartsWithSelector:
317
+ return StartsWithSelector(pattern)
318
+
319
+
320
+ def ends_with(pattern: str) -> EndsWithSelector:
321
+ return EndsWithSelector(pattern)
322
+
323
+
324
+ def matches(pattern: str) -> MatchesSelector:
325
+ return MatchesSelector(pattern)
flowfile_frame/series.py CHANGED
@@ -1,6 +1,8 @@
1
1
  from __future__ import annotations
2
+
3
+ from typing import Any
4
+
2
5
  import polars as pl
3
- from typing import Any, Optional, Union, List
4
6
 
5
7
 
6
8
  class Series:
@@ -9,11 +11,11 @@ class Series:
9
11
  """
10
12
 
11
13
  def __init__(
12
- self,
13
- name: str | list | pl.Series | None = None,
14
- values: list | None = None,
15
- dtype: Any = None,
16
- **kwargs # Ignored parameters
14
+ self,
15
+ name: str | list | pl.Series | None = None,
16
+ values: list | None = None,
17
+ dtype: Any = None,
18
+ **kwargs, # Ignored parameters
17
19
  ):
18
20
  """
19
21
  Initialize a FlowSeries with the same API as pl.Series.
@@ -67,4 +69,4 @@ class Series:
67
69
 
68
70
  def __str__(self) -> str:
69
71
  """Same as __repr__."""
70
- return self.__repr__()
72
+ return self.__repr__()
flowfile_frame/utils.py CHANGED
@@ -1,25 +1,23 @@
1
+ import inspect
2
+ import textwrap
1
3
  import uuid
2
- import time
3
- import os
4
- import requests
5
- import subprocess
6
- from pathlib import Path
4
+ from collections.abc import Iterable
5
+ from typing import Any
6
+
7
7
  import polars as pl
8
- from typing import Iterable, Any, List, Optional
9
8
 
10
9
  from flowfile_core.flowfile.flow_graph import FlowGraph
11
10
  from flowfile_core.schemas import schemas
12
- from tempfile import TemporaryDirectory
13
- import inspect
14
- import textwrap
11
+
15
12
 
16
13
  def _is_iterable(obj: Any) -> bool:
17
14
  # Avoid treating strings as iterables in this context
18
15
  return isinstance(obj, Iterable) and not isinstance(obj, (str, bytes))
19
16
 
20
17
 
21
- def _check_if_convertible_to_code(expressions: List[Any]) -> bool:
18
+ def _check_if_convertible_to_code(expressions: list[Any]) -> bool:
22
19
  from flowfile_frame.expr import Expr
20
+
23
21
  for expr in expressions:
24
22
  if isinstance(expr, Expr):
25
23
  if not expr.convertable_to_code:
@@ -27,7 +25,9 @@ def _check_if_convertible_to_code(expressions: List[Any]) -> bool:
27
25
  return True
28
26
 
29
27
 
30
- def _parse_inputs_as_iterable(inputs: tuple[Any, ...] | tuple[Iterable[Any]],) -> List[Any]:
28
+ def _parse_inputs_as_iterable(
29
+ inputs: tuple[Any, ...] | tuple[Iterable[Any]],
30
+ ) -> list[Any]:
31
31
  if not inputs:
32
32
  return []
33
33
 
@@ -55,7 +55,7 @@ def _get_function_source(func):
55
55
  source = inspect.getsource(func)
56
56
 
57
57
  # Check if it's a lambda
58
- if func.__name__ == '<lambda>':
58
+ if func.__name__ == "<lambda>":
59
59
  # Extract just the lambda expression
60
60
  # This is tricky as getsource returns the entire line
61
61
  return None, False
@@ -72,9 +72,9 @@ def _get_function_source(func):
72
72
  return None, False
73
73
 
74
74
 
75
- def ensure_inputs_as_iterable(inputs: Any | Iterable[Any]) -> List[Any]:
75
+ def ensure_inputs_as_iterable(inputs: Any | Iterable[Any]) -> list[Any]:
76
76
  """Convert inputs to list, treating strings as single items."""
77
- if inputs is None or (hasattr(inputs, '__len__') and len(inputs) == 0):
77
+ if inputs is None or (hasattr(inputs, "__len__") and len(inputs) == 0):
78
78
  return []
79
79
  # Treat strings/bytes as atomic items, everything else check if iterable
80
80
  if isinstance(inputs, (str, bytes)) or not _is_iterable(inputs):
@@ -99,13 +99,11 @@ def create_flow_graph(flow_id: int = None) -> FlowGraph:
99
99
  """
100
100
  if flow_id is None:
101
101
  flow_id = _generate_id()
102
- flow_settings = schemas.FlowSettings(
103
- flow_id=flow_id,
104
- name=f"Flow_{flow_id}",
105
- path=f"flow_{flow_id}"
106
- )
102
+ flow_settings = schemas.FlowSettings(flow_id=flow_id, name=f"Flow_{flow_id}", path=f"flow_{flow_id}")
107
103
  flow_graph = FlowGraph(flow_settings=flow_settings)
108
- flow_graph.flow_settings.execution_location = 'local' # always create a local frame so that the run time does not attempt to use the flowfile_worker process
104
+ flow_graph.flow_settings.execution_location = (
105
+ "local" # always create a local frame so that the run time does not attempt to use the flowfile_worker process
106
+ )
109
107
  return flow_graph
110
108
 
111
109
 
@@ -140,4 +138,4 @@ def generate_node_id() -> int:
140
138
 
141
139
  def set_node_id(node_id):
142
140
  """Set the node ID to a specific value."""
143
- data["c"] = node_id
141
+ data["c"] = node_id
@@ -1,16 +1,24 @@
1
- from typing import Dict
2
- import threading
1
+ # ruff: noqa: E402
2
+
3
3
  import multiprocessing
4
+ import threading
5
+ from importlib.metadata import PackageNotFoundError, version
6
+
4
7
  from shared.storage_config import storage
5
8
 
9
+ try:
10
+ __version__ = version("Flowfile")
11
+ except PackageNotFoundError:
12
+ __version__ = "0.5.0"
6
13
  multiprocessing.set_start_method('spawn', force=True)
7
14
 
8
15
  from multiprocessing import get_context
16
+
9
17
  from flowfile_worker.models import Status
10
18
 
11
19
  mp_context = get_context("spawn")
12
20
 
13
- status_dict: Dict[str, Status] = dict()
21
+ status_dict: dict[str, Status] = dict()
14
22
  process_dict = dict()
15
23
 
16
24
  status_dict_lock = threading.Lock()
@@ -23,4 +31,4 @@ CACHE_EXPIRATION_TIME = 24 * 60 * 60
23
31
  CACHE_DIR = storage.cache_directory
24
32
 
25
33
 
26
- PROCESS_MEMORY_USAGE: Dict[str, float] = dict()
34
+ PROCESS_MEMORY_USAGE: dict[str, float] = dict()
@@ -1,15 +1,15 @@
1
1
  # flowfile_worker.configs
2
2
 
3
- import logging
4
- import platform
5
3
  import argparse
4
+ import logging
6
5
  import os
7
- from connectorx import __version__
6
+ import platform
8
7
 
8
+ from connectorx import __version__
9
9
 
10
10
  # Configure logging
11
- logging.basicConfig(format='%(asctime)s: %(message)s')
12
- logger = logging.getLogger('FlowfileWorker')
11
+ logging.basicConfig(format="%(asctime)s: %(message)s")
12
+ logger = logging.getLogger("FlowfileWorker")
13
13
  logger.setLevel(logging.INFO)
14
14
 
15
15
  # Constants for worker and core configuration
@@ -17,18 +17,14 @@ DEFAULT_SERVICE_HOST = "0.0.0.0" if platform.system() != "Windows" else "127.0.0
17
17
  DEFAULT_SERVICE_PORT = 63579
18
18
  DEFAULT_CORE_HOST = "0.0.0.0" if platform.system() != "Windows" else "127.0.0.1"
19
19
  DEFAULT_CORE_PORT = 63578
20
- TEST_MODE = True if 'TEST_MODE' in os.environ else False
20
+ TEST_MODE = True if "TEST_MODE" in os.environ else False
21
21
 
22
22
 
23
23
  def parse_args():
24
24
  """Parse command line arguments"""
25
25
  parser = argparse.ArgumentParser(description="Flowfile Worker Server")
26
- parser.add_argument(
27
- "--host", type=str, default=DEFAULT_SERVICE_HOST, help="Host to bind worker to"
28
- )
29
- parser.add_argument(
30
- "--port", type=int, default=DEFAULT_SERVICE_PORT, help="Port to bind worker to"
31
- )
26
+ parser.add_argument("--host", type=str, default=DEFAULT_SERVICE_HOST, help="Host to bind worker to")
27
+ parser.add_argument("--port", type=int, default=DEFAULT_SERVICE_PORT, help="Port to bind worker to")
32
28
  parser.add_argument(
33
29
  "--core-host",
34
30
  type=str,
@@ -47,14 +43,10 @@ def parse_args():
47
43
 
48
44
  # Validate arguments
49
45
  if args.port < 1 or args.port > 65535:
50
- raise ValueError(
51
- f"Invalid port number: {args.port}. Port must be between 1 and 65535."
52
- )
46
+ raise ValueError(f"Invalid port number: {args.port}. Port must be between 1 and 65535.")
53
47
 
54
48
  if args.core_port < 1 or args.core_port > 65535:
55
- raise ValueError(
56
- f"Invalid core port number: {args.core_port}. Port must be between 1 and 65535."
57
- )
49
+ raise ValueError(f"Invalid core port number: {args.core_port}. Port must be between 1 and 65535.")
58
50
 
59
51
  # Check if hosts are valid (basic check)
60
52
  if not args.host:
@@ -92,4 +84,4 @@ FLOWFILE_CORE_URI = get_core_url(CORE_HOST, CORE_PORT)
92
84
  logger.info(f"ConnectorX version: {__version__}")
93
85
  # Log configuration
94
86
  logger.info(f"Worker configured at {SERVICE_HOST}:{SERVICE_PORT}")
95
- logger.info(f"Core service configured at {FLOWFILE_CORE_URI}")
87
+ logger.info(f"Core service configured at {FLOWFILE_CORE_URI}")
@@ -1,37 +1,24 @@
1
- from flowfile_worker.create.models import (ReceivedCsvTable, ReceivedParquetTable, ReceivedExcelTable,
2
- ReceivedJsonTable)
3
- from flowfile_worker.create.funcs import (create_from_path_csv, create_from_path_parquet, create_from_path_excel,
4
- create_from_path_json)
5
- from typing import Dict, Literal
1
+ from typing import Literal
6
2
 
7
- ReceivedTableCollection = ReceivedCsvTable | ReceivedParquetTable | ReceivedJsonTable | ReceivedExcelTable
8
- FileType = Literal['csv', 'parquet', 'json', 'excel']
3
+ from flowfile_worker.create.funcs import (
4
+ create_from_path_csv,
5
+ create_from_path_excel,
6
+ create_from_path_json,
7
+ create_from_path_parquet,
8
+ )
9
9
 
10
-
11
- def received_table_parser(received_table_raw: Dict, file_type: FileType) -> ReceivedTableCollection:
12
- match file_type:
13
- case 'csv':
14
- received_table = ReceivedCsvTable.model_validate(received_table_raw)
15
- case 'parquet':
16
- received_table = ReceivedParquetTable.model_validate(received_table_raw)
17
- case 'excel':
18
- received_table = ReceivedExcelTable.model_validate(received_table_raw)
19
- case 'json':
20
- return ReceivedJsonTable.model_validate(received_table_raw)
21
- case _:
22
- raise ValueError(f'Unsupported file type: {file_type}')
23
- return received_table
10
+ FileType = Literal["csv", "parquet", "json", "excel"]
24
11
 
25
12
 
26
- def table_creator_factory_method(file_type: Literal['csv', 'parquet', 'json', 'excel']) -> callable:
13
+ def table_creator_factory_method(file_type: FileType) -> callable:
27
14
  match file_type:
28
- case 'csv':
15
+ case "csv":
29
16
  return create_from_path_csv
30
- case 'parquet':
17
+ case "parquet":
31
18
  return create_from_path_parquet
32
- case 'excel':
19
+ case "excel":
33
20
  return create_from_path_excel
34
- case 'json':
21
+ case "json":
35
22
  return create_from_path_json
36
23
  case _:
37
- raise ValueError(f'Unsupported file type: {file_type}')
24
+ raise ValueError(f"Unsupported file type: {file_type}")