Flowfile 0.5.1__py3-none-any.whl → 0.5.4__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 (346) hide show
  1. build_backends/main.py +25 -22
  2. build_backends/main_prd.py +10 -19
  3. flowfile/__init__.py +194 -74
  4. flowfile/__main__.py +10 -7
  5. flowfile/api.py +51 -57
  6. flowfile/web/__init__.py +14 -9
  7. flowfile/web/static/assets/AdminView-f53bad23.css +129 -0
  8. flowfile/web/static/assets/AdminView-f9847d67.js +713 -0
  9. flowfile/web/static/assets/CloudConnectionView-cf85f943.css +72 -0
  10. flowfile/web/static/assets/{CloudConnectionManager-0dfba9f2.js → CloudConnectionView-faace55b.js} +11 -11
  11. flowfile/web/static/assets/{CloudStorageReader-29d14fcc.css → CloudStorageReader-24c54524.css} +27 -27
  12. flowfile/web/static/assets/{CloudStorageReader-d5b1b6c9.js → CloudStorageReader-d86ecaa7.js} +10 -8
  13. flowfile/web/static/assets/{CloudStorageWriter-00d87aad.js → CloudStorageWriter-0f4d9a44.js} +10 -8
  14. flowfile/web/static/assets/{CloudStorageWriter-b0ee067f.css → CloudStorageWriter-60547855.css} +26 -26
  15. flowfile/web/static/assets/ColumnActionInput-c44b7aee.css +159 -0
  16. flowfile/web/static/assets/ColumnActionInput-f4189ae0.js +330 -0
  17. flowfile/web/static/assets/{ColumnSelector-47996a16.css → ColumnSelector-371637fb.css} +2 -2
  18. flowfile/web/static/assets/{ColumnSelector-4685e75d.js → ColumnSelector-e66b33da.js} +3 -5
  19. flowfile/web/static/assets/ContextMenu-49463352.js +9 -0
  20. flowfile/web/static/assets/ContextMenu-dd5f3f25.js +9 -0
  21. flowfile/web/static/assets/ContextMenu-f709b884.js +9 -0
  22. flowfile/web/static/assets/ContextMenu.vue_vue_type_script_setup_true_lang-a1bd6314.js +59 -0
  23. flowfile/web/static/assets/{CrossJoin-702a3edd.js → CrossJoin-24694b8f.js} +12 -10
  24. flowfile/web/static/assets/{CrossJoin-1119d18e.css → CrossJoin-71b4cc10.css} +20 -20
  25. flowfile/web/static/assets/{CustomNode-b1519993.js → CustomNode-569d45ff.js} +43 -24
  26. flowfile/web/static/assets/CustomNode-edb9b939.css +42 -0
  27. flowfile/web/static/assets/{DatabaseConnectionSettings-0c04b2e5.css → DatabaseConnectionSettings-c20a1e16.css} +23 -21
  28. flowfile/web/static/assets/{DatabaseConnectionSettings-6f3e4ea5.js → DatabaseConnectionSettings-cfc08938.js} +5 -4
  29. flowfile/web/static/assets/{DatabaseReader-ae61773c.css → DatabaseReader-5bf8c75b.css} +41 -46
  30. flowfile/web/static/assets/{DatabaseReader-d38c7295.js → DatabaseReader-701feabb.js} +25 -15
  31. flowfile/web/static/assets/{DatabaseManager-cf5ef661.js → DatabaseView-0482e5b5.js} +11 -11
  32. flowfile/web/static/assets/DatabaseView-6655afd6.css +57 -0
  33. flowfile/web/static/assets/{DatabaseWriter-b04ef46a.js → DatabaseWriter-16721989.js} +17 -10
  34. flowfile/web/static/assets/{DatabaseWriter-2f570e53.css → DatabaseWriter-bdcf2c8b.css} +29 -27
  35. flowfile/web/static/assets/{designer-8da3ba3a.css → DesignerView-49abb835.css} +783 -663
  36. flowfile/web/static/assets/{designer-9633482a.js → DesignerView-f64749fb.js} +1292 -3253
  37. flowfile/web/static/assets/{documentation-ca400224.js → DocumentationView-61bd2990.js} +5 -5
  38. flowfile/web/static/assets/{documentation-12216a74.css → DocumentationView-9ea6e871.css} +9 -9
  39. flowfile/web/static/assets/{ExploreData-2d0cf4db.css → ExploreData-10c5acc8.css} +13 -12
  40. flowfile/web/static/assets/{ExploreData-5fa10ed8.js → ExploreData-e2735b13.js} +18 -9
  41. flowfile/web/static/assets/{ExternalSource-d39af878.js → ExternalSource-2535c3b2.js} +9 -7
  42. flowfile/web/static/assets/{ExternalSource-e37b6275.css → ExternalSource-7ac7373f.css} +20 -20
  43. flowfile/web/static/assets/Filter-2cdbc93c.js +287 -0
  44. flowfile/web/static/assets/Filter-7494ea97.css +48 -0
  45. flowfile/web/static/assets/{Formula-bb96803d.css → Formula-53d58c43.css} +7 -7
  46. flowfile/web/static/assets/{Formula-6b04fb1d.js → Formula-fcda3c2c.js} +13 -11
  47. flowfile/web/static/assets/{FuzzyMatch-1010f966.css → FuzzyMatch-ad6361d6.css} +68 -69
  48. flowfile/web/static/assets/{FuzzyMatch-999521f4.js → FuzzyMatch-f8d3b7d3.js} +12 -10
  49. flowfile/web/static/assets/{Pivot-cf333e3d.css → GraphSolver-4b4d7db9.css} +5 -5
  50. flowfile/web/static/assets/{GraphSolver-17dd2198.js → GraphSolver-72eaa695.js} +14 -12
  51. flowfile/web/static/assets/GroupBy-5792782d.css +9 -0
  52. flowfile/web/static/assets/{GroupBy-6b039e18.js → GroupBy-8aa0598b.js} +9 -7
  53. flowfile/web/static/assets/{Join-fd79b451.css → Join-28b5e18f.css} +22 -22
  54. flowfile/web/static/assets/{Join-24d0f113.js → Join-e40f0ffa.js} +13 -11
  55. flowfile/web/static/assets/LoginView-5111c9ae.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-34639209.js → ManualInput-9b6f3224.js} +170 -116
  59. flowfile/web/static/assets/{MultiSelect-0e8724a3.js → MultiSelect-ef28e19e.js} +2 -2
  60. flowfile/web/static/assets/{MultiSelect.vue_vue_type_script_setup_true_lang-b0e538c2.js → MultiSelect.vue_vue_type_script_setup_true_lang-83b3bbfd.js} +1 -1
  61. flowfile/web/static/assets/NodeDesigner-94cd4dd3.css +1429 -0
  62. flowfile/web/static/assets/NodeDesigner-d2b7ee2b.js +2712 -0
  63. flowfile/web/static/assets/{NumericInput-3d63a470.js → NumericInput-1d789794.js} +2 -2
  64. flowfile/web/static/assets/{NumericInput.vue_vue_type_script_setup_true_lang-e0edeccc.js → NumericInput.vue_vue_type_script_setup_true_lang-7775f83e.js} +5 -2
  65. flowfile/web/static/assets/Output-692dd25d.css +37 -0
  66. flowfile/web/static/assets/{Output-edea9802.js → Output-cefef801.js} +14 -10
  67. flowfile/web/static/assets/{GraphSolver-f0cb7bfb.css → Pivot-0eda81b4.css} +5 -5
  68. flowfile/web/static/assets/{Pivot-61d19301.js → Pivot-bab1b75b.js} +12 -10
  69. flowfile/web/static/assets/PivotValidation-0e905b1a.css +13 -0
  70. flowfile/web/static/assets/PivotValidation-41b57ad6.css +13 -0
  71. flowfile/web/static/assets/{PivotValidation-f97fec5b.js → PivotValidation-e7941f91.js} +3 -3
  72. flowfile/web/static/assets/{PivotValidation-de9f43fe.js → PivotValidation-fba09336.js} +3 -3
  73. flowfile/web/static/assets/{PolarsCode-650322d1.css → PolarsCode-2b1f1f23.css} +4 -4
  74. flowfile/web/static/assets/{PolarsCode-bc3c9984.js → PolarsCode-740e40fa.js} +18 -9
  75. flowfile/web/static/assets/PopOver-862d7e28.js +939 -0
  76. flowfile/web/static/assets/PopOver-d96599db.css +33 -0
  77. flowfile/web/static/assets/{Read-64a3f259.js → Read-225cc63f.js} +16 -12
  78. flowfile/web/static/assets/{Read-e808b239.css → Read-90f366bc.css} +15 -15
  79. flowfile/web/static/assets/{RecordCount-3d5039be.js → RecordCount-ffc71eca.js} +6 -4
  80. flowfile/web/static/assets/{RecordId-597510e0.js → RecordId-a70bb8df.js} +9 -7
  81. flowfile/web/static/assets/{SQLQueryComponent-df51adbe.js → SQLQueryComponent-15a421f5.js} +3 -3
  82. flowfile/web/static/assets/SQLQueryComponent-edb90b98.css +29 -0
  83. flowfile/web/static/assets/{Sample-4be0a507.js → Sample-6c26afc7.js} +6 -4
  84. flowfile/web/static/assets/SecretSelector-6329f743.css +43 -0
  85. flowfile/web/static/assets/SecretSelector-ceed9496.js +113 -0
  86. flowfile/web/static/assets/{SecretManager-4839be57.js → SecretsView-214d255a.js} +35 -36
  87. flowfile/web/static/assets/SecretsView-aa291340.css +38 -0
  88. flowfile/web/static/assets/{Select-9b72f201.js → Select-8fc29999.js} +9 -7
  89. flowfile/web/static/assets/{SettingsSection-71e6b7e3.css → SettingsSection-07fbbc39.css} +4 -4
  90. flowfile/web/static/assets/{SettingsSection-5c696bee.css → SettingsSection-26fe48d4.css} +4 -4
  91. flowfile/web/static/assets/{SettingsSection-7ded385d.js → SettingsSection-3f70e4c3.js} +3 -3
  92. flowfile/web/static/assets/{SettingsSection-f0f75a42.js → SettingsSection-83090218.js} +3 -3
  93. flowfile/web/static/assets/{SettingsSection-2e4d03c4.css → SettingsSection-8f980839.css} +4 -4
  94. flowfile/web/static/assets/{SettingsSection-e1e9c953.js → SettingsSection-9f0d1725.js} +3 -3
  95. flowfile/web/static/assets/SetupView-3fa0aa03.js +160 -0
  96. flowfile/web/static/assets/SetupView-e2da3442.css +230 -0
  97. flowfile/web/static/assets/{SingleSelect-6c777aac.js → SingleSelect-a4a568cb.js} +2 -2
  98. flowfile/web/static/assets/{SingleSelect.vue_vue_type_script_setup_true_lang-33e3ff9b.js → SingleSelect.vue_vue_type_script_setup_true_lang-c8ebdd33.js} +1 -1
  99. flowfile/web/static/assets/{SliderInput-7cb93e62.js → SliderInput-be533e71.js} +7 -4
  100. flowfile/web/static/assets/SliderInput-f2e4f23c.css +4 -0
  101. flowfile/web/static/assets/{Sort-6cbde21a.js → Sort-154dad81.js} +9 -7
  102. flowfile/web/static/assets/Sort-4abb7fae.css +9 -0
  103. flowfile/web/static/assets/{TextInput-d9a40c11.js → TextInput-454e2bda.js} +2 -2
  104. flowfile/web/static/assets/{TextInput.vue_vue_type_script_setup_true_lang-5896c375.js → TextInput.vue_vue_type_script_setup_true_lang-e86510d0.js} +5 -2
  105. flowfile/web/static/assets/{TextToRows-5d2c1190.css → TextToRows-12afb4f4.css} +10 -10
  106. flowfile/web/static/assets/{TextToRows-c4fcbf4d.js → TextToRows-ea73433d.js} +11 -10
  107. flowfile/web/static/assets/{ToggleSwitch-4ef91d19.js → ToggleSwitch-9d7b30f1.js} +2 -2
  108. flowfile/web/static/assets/{ToggleSwitch.vue_vue_type_script_setup_true_lang-38478c20.js → ToggleSwitch.vue_vue_type_script_setup_true_lang-00f2580e.js} +1 -1
  109. flowfile/web/static/assets/{UnavailableFields-5edd5322.css → UnavailableFields-394a1f78.css} +14 -14
  110. flowfile/web/static/assets/{UnavailableFields-a03f512c.js → UnavailableFields-b72a2c72.js} +4 -4
  111. flowfile/web/static/assets/{Union-bfe9b996.js → Union-1e44f263.js} +8 -6
  112. flowfile/web/static/assets/{Union-af6c3d9b.css → Union-d6a8d7d5.css} +7 -7
  113. flowfile/web/static/assets/Unique-2b705521.css +3 -0
  114. flowfile/web/static/assets/{Unique-5d023a27.js → Unique-a3bc6d0a.js} +13 -10
  115. flowfile/web/static/assets/{Unpivot-1e422df3.css → Unpivot-b6ad6427.css} +7 -7
  116. flowfile/web/static/assets/{Unpivot-91cc5354.js → Unpivot-e27935fc.js} +11 -9
  117. flowfile/web/static/assets/{UnpivotValidation-7ee2de44.js → UnpivotValidation-72497680.js} +3 -3
  118. flowfile/web/static/assets/UnpivotValidation-d5ca3b7b.css +13 -0
  119. flowfile/web/static/assets/{VueGraphicWalker-ed5ab88b.css → VueGraphicWalker-430f0b86.css} +1 -1
  120. flowfile/web/static/assets/{VueGraphicWalker-e51b9924.js → VueGraphicWalker-d9ab70a3.js} +4 -4
  121. flowfile/web/static/assets/{api-cf1221f0.js → api-a2102880.js} +1 -1
  122. flowfile/web/static/assets/{api-c1bad5ca.js → api-f75042b0.js} +1 -1
  123. flowfile/web/static/assets/{dropDown-35135ba8.css → dropDown-1d6acbd9.css} +41 -41
  124. flowfile/web/static/assets/{dropDown-614b998d.js → dropDown-2798a109.js} +3 -3
  125. flowfile/web/static/assets/{fullEditor-f7971590.js → fullEditor-cf7d7d93.js} +11 -10
  126. flowfile/web/static/assets/{fullEditor-178376bb.css → fullEditor-fe9f7e18.css} +77 -65
  127. flowfile/web/static/assets/{genericNodeSettings-4fe5f36b.js → genericNodeSettings-14eac1c3.js} +5 -5
  128. flowfile/web/static/assets/{genericNodeSettings-924759c7.css → genericNodeSettings-3b2507ea.css} +10 -10
  129. flowfile/web/static/assets/{index-5429bbf8.js → index-387a6f18.js} +41806 -40958
  130. flowfile/web/static/assets/index-6b367bb5.js +38 -0
  131. flowfile/web/static/assets/{index-50508d4d.css → index-e96ab018.css} +2184 -569
  132. flowfile/web/static/assets/index-f0a6e5a5.js +2696 -0
  133. flowfile/web/static/assets/node.types-2c15bb7e.js +82 -0
  134. flowfile/web/static/assets/nodeInput-ed2ae8d7.js +2 -0
  135. flowfile/web/static/assets/{outputCsv-076b85ab.js → outputCsv-3c1757e8.js} +3 -3
  136. flowfile/web/static/assets/outputCsv-b9a072af.css +2499 -0
  137. flowfile/web/static/assets/{outputExcel-0fd17dbe.js → outputExcel-686e1f48.js} +3 -3
  138. flowfile/web/static/assets/{outputExcel-b41305c0.css → outputExcel-f5d272b2.css} +26 -26
  139. flowfile/web/static/assets/outputParquet-54597c3c.css +4 -0
  140. flowfile/web/static/assets/{outputParquet-b61e0847.js → outputParquet-df28faa7.js} +4 -4
  141. flowfile/web/static/assets/{readCsv-c767cb37.css → readCsv-3bfac4c3.css} +15 -15
  142. flowfile/web/static/assets/{readCsv-a8bb8b61.js → readCsv-e37eee21.js} +3 -3
  143. flowfile/web/static/assets/{readExcel-806d2826.css → readExcel-3db6b763.css} +13 -13
  144. flowfile/web/static/assets/{readExcel-67b4aee0.js → readExcel-a13f14bb.js} +5 -5
  145. flowfile/web/static/assets/{readParquet-92ce1dbc.js → readParquet-344cf746.js} +3 -3
  146. flowfile/web/static/assets/{readParquet-48c81530.css → readParquet-c5244ad5.css} +4 -4
  147. flowfile/web/static/assets/secrets.api-ae198c5c.js +65 -0
  148. flowfile/web/static/assets/{selectDynamic-92e25ee3.js → selectDynamic-6b4b0767.js} +5 -5
  149. flowfile/web/static/assets/{selectDynamic-aa913ff4.css → selectDynamic-f2fb394f.css} +21 -20
  150. flowfile/web/static/assets/{vue-codemirror.esm-41b0e0d7.js → vue-codemirror.esm-31ba0e0b.js} +31 -640
  151. flowfile/web/static/assets/{vue-content-loader.es-2c8e608f.js → vue-content-loader.es-4469c8ff.js} +1 -1
  152. flowfile/web/static/index.html +2 -2
  153. {flowfile-0.5.1.dist-info → flowfile-0.5.4.dist-info}/METADATA +3 -4
  154. flowfile-0.5.4.dist-info/RECORD +407 -0
  155. flowfile_core/__init__.py +13 -6
  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 +64 -19
  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 +145 -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 +26 -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/__init__.py +11 -0
  177. flowfile_core/flowfile/code_generator/code_generator.py +706 -247
  178. flowfile_core/flowfile/connection_manager/_connection_manager.py +6 -5
  179. flowfile_core/flowfile/connection_manager/models.py +1 -1
  180. flowfile_core/flowfile/database_connection_manager/db_connections.py +60 -44
  181. flowfile_core/flowfile/database_connection_manager/models.py +1 -1
  182. flowfile_core/flowfile/extensions.py +17 -12
  183. flowfile_core/flowfile/flow_data_engine/cloud_storage_reader.py +34 -32
  184. flowfile_core/flowfile/flow_data_engine/create/funcs.py +115 -83
  185. flowfile_core/flowfile/flow_data_engine/flow_data_engine.py +493 -423
  186. flowfile_core/flowfile/flow_data_engine/flow_file_column/interface.py +2 -2
  187. flowfile_core/flowfile/flow_data_engine/flow_file_column/main.py +92 -52
  188. flowfile_core/flowfile/flow_data_engine/flow_file_column/polars_type.py +12 -11
  189. flowfile_core/flowfile/flow_data_engine/flow_file_column/type_registry.py +6 -6
  190. flowfile_core/flowfile/flow_data_engine/flow_file_column/utils.py +26 -30
  191. flowfile_core/flowfile/flow_data_engine/fuzzy_matching/prepare_for_fuzzy_match.py +31 -20
  192. flowfile_core/flowfile/flow_data_engine/join/__init__.py +1 -1
  193. flowfile_core/flowfile/flow_data_engine/join/utils.py +11 -9
  194. flowfile_core/flowfile/flow_data_engine/join/verify_integrity.py +14 -15
  195. flowfile_core/flowfile/flow_data_engine/pivot_table.py +5 -7
  196. flowfile_core/flowfile/flow_data_engine/polars_code_parser.py +95 -82
  197. flowfile_core/flowfile/flow_data_engine/read_excel_tables.py +66 -65
  198. flowfile_core/flowfile/flow_data_engine/sample_data.py +27 -21
  199. flowfile_core/flowfile/flow_data_engine/subprocess_operations/__init__.py +1 -1
  200. flowfile_core/flowfile/flow_data_engine/subprocess_operations/models.py +13 -11
  201. flowfile_core/flowfile/flow_data_engine/subprocess_operations/subprocess_operations.py +190 -127
  202. flowfile_core/flowfile/flow_data_engine/threaded_processes.py +8 -8
  203. flowfile_core/flowfile/flow_data_engine/utils.py +99 -67
  204. flowfile_core/flowfile/flow_graph.py +920 -571
  205. flowfile_core/flowfile/flow_graph_utils.py +31 -49
  206. flowfile_core/flowfile/flow_node/flow_node.py +379 -258
  207. flowfile_core/flowfile/flow_node/models.py +53 -41
  208. flowfile_core/flowfile/flow_node/schema_callback.py +14 -19
  209. flowfile_core/flowfile/graph_tree/graph_tree.py +41 -41
  210. flowfile_core/flowfile/handler.py +80 -30
  211. flowfile_core/flowfile/manage/compatibility_enhancements.py +209 -126
  212. flowfile_core/flowfile/manage/io_flowfile.py +54 -57
  213. flowfile_core/flowfile/node_designer/__init__.py +19 -13
  214. flowfile_core/flowfile/node_designer/_type_registry.py +34 -37
  215. flowfile_core/flowfile/node_designer/custom_node.py +162 -36
  216. flowfile_core/flowfile/node_designer/ui_components.py +278 -34
  217. flowfile_core/flowfile/schema_callbacks.py +71 -51
  218. flowfile_core/flowfile/setting_generator/__init__.py +0 -1
  219. flowfile_core/flowfile/setting_generator/setting_generator.py +6 -5
  220. flowfile_core/flowfile/setting_generator/settings.py +64 -53
  221. flowfile_core/flowfile/sources/external_sources/base_class.py +12 -10
  222. flowfile_core/flowfile/sources/external_sources/custom_external_sources/external_source.py +27 -17
  223. flowfile_core/flowfile/sources/external_sources/custom_external_sources/sample_users.py +9 -9
  224. flowfile_core/flowfile/sources/external_sources/factory.py +0 -1
  225. flowfile_core/flowfile/sources/external_sources/sql_source/models.py +45 -31
  226. flowfile_core/flowfile/sources/external_sources/sql_source/sql_source.py +198 -73
  227. flowfile_core/flowfile/sources/external_sources/sql_source/utils.py +250 -196
  228. flowfile_core/flowfile/util/calculate_layout.py +9 -13
  229. flowfile_core/flowfile/util/execution_orderer.py +25 -17
  230. flowfile_core/flowfile/util/node_skipper.py +4 -4
  231. flowfile_core/flowfile/utils.py +19 -21
  232. flowfile_core/main.py +26 -19
  233. flowfile_core/routes/auth.py +284 -11
  234. flowfile_core/routes/cloud_connections.py +25 -25
  235. flowfile_core/routes/logs.py +21 -29
  236. flowfile_core/routes/public.py +46 -4
  237. flowfile_core/routes/routes.py +70 -34
  238. flowfile_core/routes/secrets.py +25 -27
  239. flowfile_core/routes/user_defined_components.py +483 -4
  240. flowfile_core/run_lock.py +0 -1
  241. flowfile_core/schemas/__init__.py +4 -6
  242. flowfile_core/schemas/analysis_schemas/graphic_walker_schemas.py +55 -55
  243. flowfile_core/schemas/cloud_storage_schemas.py +96 -66
  244. flowfile_core/schemas/input_schema.py +231 -144
  245. flowfile_core/schemas/output_model.py +49 -34
  246. flowfile_core/schemas/schemas.py +116 -89
  247. flowfile_core/schemas/transform_schema.py +518 -263
  248. flowfile_core/schemas/yaml_types.py +21 -7
  249. flowfile_core/secret_manager/secret_manager.py +123 -18
  250. flowfile_core/types.py +29 -9
  251. flowfile_core/utils/arrow_reader.py +7 -6
  252. flowfile_core/utils/excel_file_manager.py +3 -3
  253. flowfile_core/utils/fileManager.py +7 -7
  254. flowfile_core/utils/fl_executor.py +8 -10
  255. flowfile_core/utils/utils.py +4 -4
  256. flowfile_core/utils/validate_setup.py +5 -4
  257. flowfile_frame/__init__.py +117 -51
  258. flowfile_frame/adapters.py +2 -9
  259. flowfile_frame/adding_expr.py +73 -32
  260. flowfile_frame/cloud_storage/frame_helpers.py +27 -23
  261. flowfile_frame/cloud_storage/secret_manager.py +12 -26
  262. flowfile_frame/config.py +2 -5
  263. flowfile_frame/database/__init__.py +36 -0
  264. flowfile_frame/database/connection_manager.py +205 -0
  265. flowfile_frame/database/frame_helpers.py +249 -0
  266. flowfile_frame/expr.py +311 -218
  267. flowfile_frame/expr.pyi +160 -159
  268. flowfile_frame/expr_name.py +23 -23
  269. flowfile_frame/flow_frame.py +571 -476
  270. flowfile_frame/flow_frame.pyi +123 -104
  271. flowfile_frame/flow_frame_methods.py +227 -246
  272. flowfile_frame/group_frame.py +50 -20
  273. flowfile_frame/join.py +2 -2
  274. flowfile_frame/lazy.py +129 -87
  275. flowfile_frame/lazy_methods.py +83 -30
  276. flowfile_frame/list_name_space.py +55 -50
  277. flowfile_frame/selectors.py +148 -68
  278. flowfile_frame/series.py +9 -7
  279. flowfile_frame/utils.py +19 -21
  280. flowfile_worker/__init__.py +12 -7
  281. flowfile_worker/configs.py +41 -33
  282. flowfile_worker/create/__init__.py +14 -9
  283. flowfile_worker/create/funcs.py +114 -77
  284. flowfile_worker/create/models.py +46 -43
  285. flowfile_worker/create/pl_types.py +14 -15
  286. flowfile_worker/create/read_excel_tables.py +34 -41
  287. flowfile_worker/create/utils.py +22 -19
  288. flowfile_worker/external_sources/s3_source/main.py +18 -51
  289. flowfile_worker/external_sources/s3_source/models.py +34 -27
  290. flowfile_worker/external_sources/sql_source/main.py +8 -5
  291. flowfile_worker/external_sources/sql_source/models.py +13 -9
  292. flowfile_worker/flow_logger.py +10 -8
  293. flowfile_worker/funcs.py +214 -155
  294. flowfile_worker/main.py +11 -17
  295. flowfile_worker/models.py +35 -28
  296. flowfile_worker/process_manager.py +2 -3
  297. flowfile_worker/routes.py +121 -90
  298. flowfile_worker/secrets.py +114 -21
  299. flowfile_worker/spawner.py +89 -54
  300. flowfile_worker/utils.py +3 -2
  301. shared/__init__.py +2 -7
  302. shared/storage_config.py +25 -13
  303. test_utils/postgres/commands.py +3 -2
  304. test_utils/postgres/fixtures.py +9 -9
  305. test_utils/s3/commands.py +1 -1
  306. test_utils/s3/data_generator.py +3 -4
  307. test_utils/s3/demo_data_generator.py +4 -7
  308. test_utils/s3/fixtures.py +7 -5
  309. tools/migrate/__init__.py +1 -1
  310. tools/migrate/__main__.py +16 -29
  311. tools/migrate/legacy_schemas.py +251 -190
  312. tools/migrate/migrate.py +193 -181
  313. tools/migrate/tests/conftest.py +1 -3
  314. tools/migrate/tests/test_migrate.py +36 -41
  315. tools/migrate/tests/test_migration_e2e.py +28 -29
  316. tools/migrate/tests/test_node_migrations.py +50 -20
  317. flowfile/web/static/assets/CloudConnectionManager-2dfdce2f.css +0 -86
  318. flowfile/web/static/assets/ContextMenu-23e909da.js +0 -41
  319. flowfile/web/static/assets/ContextMenu-4c74eef1.css +0 -26
  320. flowfile/web/static/assets/ContextMenu-63cfa99b.css +0 -26
  321. flowfile/web/static/assets/ContextMenu-70ae0c79.js +0 -41
  322. flowfile/web/static/assets/ContextMenu-c13f91d0.css +0 -26
  323. flowfile/web/static/assets/ContextMenu-f149cf7c.js +0 -41
  324. flowfile/web/static/assets/CustomNode-74a37f74.css +0 -32
  325. flowfile/web/static/assets/DatabaseManager-30fa27e5.css +0 -64
  326. flowfile/web/static/assets/Filter-9b6d08db.js +0 -164
  327. flowfile/web/static/assets/Filter-f62091b3.css +0 -20
  328. flowfile/web/static/assets/GroupBy-b9505323.css +0 -51
  329. flowfile/web/static/assets/ManualInput-3246a08d.css +0 -96
  330. flowfile/web/static/assets/Output-283fe388.css +0 -37
  331. flowfile/web/static/assets/PivotValidation-891ddfb0.css +0 -13
  332. flowfile/web/static/assets/PivotValidation-c46cd420.css +0 -13
  333. flowfile/web/static/assets/SQLQueryComponent-36cef432.css +0 -27
  334. flowfile/web/static/assets/SliderInput-b8fb6a8c.css +0 -4
  335. flowfile/web/static/assets/Sort-3643d625.css +0 -51
  336. flowfile/web/static/assets/Unique-f9fb0809.css +0 -51
  337. flowfile/web/static/assets/UnpivotValidation-0d240eeb.css +0 -13
  338. flowfile/web/static/assets/nodeInput-5d0d6b79.js +0 -41
  339. flowfile/web/static/assets/outputCsv-9cc59e0b.css +0 -2499
  340. flowfile/web/static/assets/outputParquet-cf8cf3f2.css +0 -4
  341. flowfile/web/static/assets/secretApi-68435402.js +0 -46
  342. flowfile/web/static/assets/vue-codemirror-bccfde04.css +0 -32
  343. flowfile-0.5.1.dist-info/RECORD +0 -388
  344. {flowfile-0.5.1.dist-info → flowfile-0.5.4.dist-info}/WHEEL +0 -0
  345. {flowfile-0.5.1.dist-info → flowfile-0.5.4.dist-info}/entry_points.txt +0 -0
  346. {flowfile-0.5.1.dist-info → flowfile-0.5.4.dist-info}/licenses/LICENSE +0 -0
flowfile_worker/models.py CHANGED
@@ -1,35 +1,42 @@
1
- from pydantic import BaseModel
2
- from typing import Optional, Literal, Any
3
1
  from base64 import decodebytes
2
+ from typing import Any, Literal
4
3
 
5
4
  from pl_fuzzy_frame_match import FuzzyMapping
5
+ from pydantic import BaseModel
6
6
 
7
- from flowfile_worker.external_sources.sql_source.models import DatabaseWriteSettings
8
7
  from flowfile_worker.external_sources.s3_source.models import CloudStorageWriteSettings
9
-
8
+ from flowfile_worker.external_sources.sql_source.models import DatabaseWriteSettings
10
9
 
11
10
  OperationType = Literal[
12
- 'store', 'calculate_schema', 'calculate_number_of_records', 'write_output', 'fuzzy', 'store_sample',
13
- 'write_to_database', "write_to_cloud_storage",]
14
- ResultType = Literal['polars', 'other']
11
+ "store",
12
+ "calculate_schema",
13
+ "calculate_number_of_records",
14
+ "write_output",
15
+ "fuzzy",
16
+ "store_sample",
17
+ "write_to_database",
18
+ "write_to_cloud_storage",
19
+ ]
20
+ ResultType = Literal["polars", "other"]
15
21
 
16
22
 
17
23
  class PolarsOperation(BaseModel):
18
24
  operation: bytes
19
- flowfile_flow_id: Optional[int] = 1
20
- flowfile_node_id: Optional[int | str] = -1
25
+ flowfile_flow_id: int | None = 1
26
+ flowfile_node_id: int | str | None = -1
27
+
21
28
  def polars_serializable_object(self):
22
29
  return decodebytes(self.operation)
23
30
 
24
31
 
25
32
  class PolarsScript(PolarsOperation):
26
- task_id: Optional[str] = None
27
- cache_dir: Optional[str] = None
33
+ task_id: str | None = None
34
+ cache_dir: str | None = None
28
35
  operation_type: OperationType
29
36
 
30
37
 
31
38
  class PolarsScriptSample(PolarsScript):
32
- sample_size: Optional[int] = 100
39
+ sample_size: int | None = 100
33
40
 
34
41
 
35
42
  class PolarsScriptWrite(BaseModel):
@@ -37,10 +44,10 @@ class PolarsScriptWrite(BaseModel):
37
44
  data_type: str
38
45
  path: str
39
46
  write_mode: str
40
- sheet_name: Optional[str] = None
41
- delimiter: Optional[str] = None
42
- flowfile_flow_id: Optional[int] = -1
43
- flowfile_node_id: Optional[int | str] = -1
47
+ sheet_name: str | None = None
48
+ delimiter: str | None = None
49
+ flowfile_flow_id: int | None = -1
50
+ flowfile_node_id: int | str | None = -1
44
51
 
45
52
  def polars_serializable_object(self):
46
53
  return decodebytes(self.operation)
@@ -63,7 +70,7 @@ class DatabaseScriptWrite(DatabaseWriteSettings):
63
70
  table_name=self.table_name,
64
71
  if_exists=self.if_exists,
65
72
  flowfile_flow_id=self.flowfile_flow_id,
66
- flowfile_node_id=self.flowfile_node_id
73
+ flowfile_node_id=self.flowfile_node_id,
67
74
  )
68
75
 
69
76
 
@@ -83,28 +90,28 @@ class CloudStorageScriptWrite(CloudStorageWriteSettings):
83
90
  write_settings=self.write_settings,
84
91
  connection=self.connection,
85
92
  flowfile_flow_id=self.flowfile_flow_id,
86
- flowfile_node_id=self.flowfile_node_id
93
+ flowfile_node_id=self.flowfile_node_id,
87
94
  )
88
95
 
89
96
 
90
97
  class FuzzyJoinInput(BaseModel):
91
- task_id: Optional[str] = None
92
- cache_dir: Optional[str] = None
98
+ task_id: str | None = None
99
+ cache_dir: str | None = None
93
100
  left_df_operation: PolarsOperation
94
101
  right_df_operation: PolarsOperation
95
102
  fuzzy_maps: list[FuzzyMapping]
96
- flowfile_flow_id: Optional[int] = 1
97
- flowfile_node_id: Optional[int | str] = -1
103
+ flowfile_flow_id: int | None = 1
104
+ flowfile_node_id: int | str | None = -1
98
105
 
99
106
 
100
107
  class Status(BaseModel):
101
108
  background_task_id: str
102
- status: Literal['Processing', 'Completed', 'Error', 'Unknown Error', 'Starting'] # Type alias for status
109
+ status: Literal["Processing", "Completed", "Error", "Unknown Error", "Starting"] # Type alias for status
103
110
  file_ref: str
104
- progress: Optional[int] = 0
105
- error_message: Optional[str] = None # Add error_message field
106
- results: Optional[Any] = None
107
- result_type: Optional[ResultType] = 'polars'
111
+ progress: int | None = 0
112
+ error_message: str | None = None # Add error_message field
113
+ results: Any | None = None
114
+ result_type: ResultType | None = "polars"
108
115
 
109
116
  def __hash__(self):
110
117
  return hash(self.file_ref)
@@ -114,4 +121,4 @@ class RawLogInput(BaseModel):
114
121
  flowfile_flow_id: int
115
122
  log_message: str
116
123
  log_type: Literal["INFO", "ERROR"]
117
- extra: Optional[dict] = None
124
+ extra: dict | None = None
@@ -1,11 +1,10 @@
1
- from threading import Lock
2
1
  from multiprocessing import Process
3
- from typing import Dict
2
+ from threading import Lock
4
3
 
5
4
 
6
5
  class ProcessManager:
7
6
  def __init__(self):
8
- self.process_dict: Dict[str, Process] = {}
7
+ self.process_dict: dict[str, Process] = {}
9
8
  self.lock = Lock()
10
9
 
11
10
  def add_process(self, task_id: str, process: Process):
flowfile_worker/routes.py CHANGED
@@ -1,18 +1,17 @@
1
- import polars as pl
2
- import uuid
3
1
  import os
4
- from fastapi import APIRouter, HTTPException, Response, BackgroundTasks
5
- from typing import Dict
2
+ import uuid
6
3
  from base64 import encodebytes
7
4
 
8
- from flowfile_worker import status_dict, CACHE_DIR, PROCESS_MEMORY_USAGE, status_dict_lock
9
- from flowfile_worker import models
10
- from flowfile_worker.spawner import start_process, start_fuzzy_process, start_generic_process, process_manager
11
- from flowfile_worker.create import table_creator_factory_method, FileType
5
+ import polars as pl
6
+ from fastapi import APIRouter, BackgroundTasks, HTTPException, Response
7
+
8
+ from flowfile_worker import CACHE_DIR, PROCESS_MEMORY_USAGE, models, status_dict, status_dict_lock
12
9
  from flowfile_worker.configs import logger
13
- from flowfile_worker.external_sources.sql_source.models import DatabaseReadSettings
14
- from flowfile_worker.external_sources.sql_source.main import read_sql_source
10
+ from flowfile_worker.create import FileType, table_creator_factory_method
15
11
  from flowfile_worker.create.models import ReceivedTable
12
+ from flowfile_worker.external_sources.sql_source.main import read_sql_source
13
+ from flowfile_worker.external_sources.sql_source.models import DatabaseReadSettings
14
+ from flowfile_worker.spawner import process_manager, start_fuzzy_process, start_generic_process, start_process
16
15
 
17
16
  router = APIRouter()
18
17
 
@@ -35,15 +34,20 @@ def submit_query(polars_script: models.PolarsScript, background_tasks: Backgroun
35
34
  polars_serializable_object = polars_script.polars_serializable_object()
36
35
  file_path = os.path.join(polars_script.cache_dir, f"{polars_script.task_id}.arrow")
37
36
  result_type = "polars" if polars_script.operation_type == "store" else "other"
38
- status = models.Status(background_task_id=polars_script.task_id, status="Starting", file_ref=file_path,
39
- result_type=result_type)
37
+ status = models.Status(
38
+ background_task_id=polars_script.task_id, status="Starting", file_ref=file_path, result_type=result_type
39
+ )
40
40
  status_dict[polars_script.task_id] = status
41
- background_tasks.add_task(start_process, polars_serializable_object=polars_serializable_object,
42
- task_id=polars_script.task_id, operation=polars_script.operation_type,
43
- file_ref=file_path, flowfile_flow_id=polars_script.flowfile_flow_id,
44
- flowfile_node_id=polars_script.flowfile_node_id,
45
- kwargs={}
46
- )
41
+ background_tasks.add_task(
42
+ start_process,
43
+ polars_serializable_object=polars_serializable_object,
44
+ task_id=polars_script.task_id,
45
+ operation=polars_script.operation_type,
46
+ file_ref=file_path,
47
+ flowfile_flow_id=polars_script.flowfile_flow_id,
48
+ flowfile_node_id=polars_script.flowfile_node_id,
49
+ kwargs={},
50
+ )
47
51
  logger.info(f"Started background task: {polars_script.task_id}")
48
52
  return status
49
53
 
@@ -52,7 +56,7 @@ def submit_query(polars_script: models.PolarsScript, background_tasks: Backgroun
52
56
  raise HTTPException(status_code=500, detail=str(e))
53
57
 
54
58
 
55
- @router.post('/store_sample/')
59
+ @router.post("/store_sample/")
56
60
  def store_sample(polars_script: models.PolarsScriptSample, background_tasks: BackgroundTasks) -> models.Status:
57
61
  logger.info(f"Processing sample storage with size: {polars_script.sample_size}")
58
62
 
@@ -63,15 +67,21 @@ def store_sample(polars_script: models.PolarsScriptSample, background_tasks: Bac
63
67
  polars_serializable_object = polars_script.polars_serializable_object()
64
68
 
65
69
  file_path = os.path.join(polars_script.cache_dir, f"{polars_script.task_id}.arrow")
66
- status = models.Status(background_task_id=polars_script.task_id, status="Starting", file_ref=file_path,
67
- result_type="other")
70
+ status = models.Status(
71
+ background_task_id=polars_script.task_id, status="Starting", file_ref=file_path, result_type="other"
72
+ )
68
73
  status_dict[polars_script.task_id] = status
69
74
 
70
- background_tasks.add_task(start_process, polars_serializable_object=polars_serializable_object,
71
- task_id=polars_script.task_id, operation=polars_script.operation_type,
72
- file_ref=file_path, flowfile_flow_id=polars_script.flowfile_flow_id,
73
- flowfile_node_id=polars_script.flowfile_node_id,
74
- kwargs={'sample_size': polars_script.sample_size})
75
+ background_tasks.add_task(
76
+ start_process,
77
+ polars_serializable_object=polars_serializable_object,
78
+ task_id=polars_script.task_id,
79
+ operation=polars_script.operation_type,
80
+ file_ref=file_path,
81
+ flowfile_flow_id=polars_script.flowfile_flow_id,
82
+ flowfile_node_id=polars_script.flowfile_node_id,
83
+ kwargs={"sample_size": polars_script.sample_size},
84
+ )
75
85
  logger.info(f"Started sample storage task: {polars_script.task_id}")
76
86
 
77
87
  return status
@@ -82,8 +92,9 @@ def store_sample(polars_script: models.PolarsScriptSample, background_tasks: Bac
82
92
 
83
93
 
84
94
  @router.post("/write_data_to_cloud/")
85
- def write_data_to_cloud(cloud_storage_script_write: models.CloudStorageScriptWrite,
86
- background_tasks: BackgroundTasks) -> models.Status:
95
+ def write_data_to_cloud(
96
+ cloud_storage_script_write: models.CloudStorageScriptWrite, background_tasks: BackgroundTasks
97
+ ) -> models.Status:
87
98
  """
88
99
  Write polars dataframe to a file in cloud storage.
89
100
  Args:
@@ -97,30 +108,29 @@ def write_data_to_cloud(cloud_storage_script_write: models.CloudStorageScriptWri
97
108
  logger.info("Starting write operation to: cloud storage")
98
109
  task_id = str(uuid.uuid4())
99
110
  polars_serializable_object = cloud_storage_script_write.polars_serializable_object()
100
- status = models.Status(background_task_id=task_id, status="Starting", file_ref='',
101
- result_type="other")
111
+ status = models.Status(background_task_id=task_id, status="Starting", file_ref="", result_type="other")
102
112
  status_dict[task_id] = status
103
113
  background_tasks.add_task(
104
114
  start_process,
105
115
  polars_serializable_object=polars_serializable_object,
106
116
  task_id=task_id,
107
117
  operation="write_to_cloud_storage",
108
- file_ref='',
118
+ file_ref="",
109
119
  flowfile_flow_id=cloud_storage_script_write.flowfile_flow_id,
110
120
  flowfile_node_id=cloud_storage_script_write.flowfile_node_id,
111
121
  kwargs=dict(cloud_write_settings=cloud_storage_script_write.get_cloud_storage_write_settings()),
112
122
  )
113
- logger.info(
114
- f"Started write task: {task_id} to database"
115
- )
123
+ logger.info(f"Started write task: {task_id} to database")
116
124
  return status
117
125
  except Exception as e:
118
126
  logger.error(f"Error in write operation: {str(e)}", exc_info=True)
119
127
  raise HTTPException(status_code=500, detail=str(e))
120
128
 
121
129
 
122
- @router.post('/store_database_write_result/')
123
- def store_in_database(database_script_write: models.DatabaseScriptWrite, background_tasks: BackgroundTasks) -> models.Status:
130
+ @router.post("/store_database_write_result/")
131
+ def store_in_database(
132
+ database_script_write: models.DatabaseScriptWrite, background_tasks: BackgroundTasks
133
+ ) -> models.Status:
124
134
  """
125
135
  Write polars dataframe to a file in specified format.
126
136
 
@@ -135,24 +145,21 @@ def store_in_database(database_script_write: models.DatabaseScriptWrite, backgro
135
145
  try:
136
146
  task_id = str(uuid.uuid4())
137
147
  polars_serializable_object = database_script_write.polars_serializable_object()
138
- status = models.Status(background_task_id=task_id, status="Starting", file_ref='',
139
- result_type="other")
148
+ status = models.Status(background_task_id=task_id, status="Starting", file_ref="", result_type="other")
140
149
  status_dict[task_id] = status
141
150
  background_tasks.add_task(
142
151
  start_process,
143
152
  polars_serializable_object=polars_serializable_object,
144
153
  task_id=task_id,
145
154
  operation="write_to_database",
146
- file_ref='',
155
+ file_ref="",
147
156
  flowfile_flow_id=database_script_write.flowfile_flow_id,
148
157
  flowfile_node_id=database_script_write.flowfile_node_id,
149
158
  kwargs=dict(database_write_settings=database_script_write.get_database_write_settings()),
150
- )
151
-
152
- logger.info(
153
- f"Started write task: {task_id} to database"
154
159
  )
155
160
 
161
+ logger.info(f"Started write task: {task_id} to database")
162
+
156
163
  return status
157
164
 
158
165
  except Exception as e:
@@ -160,7 +167,7 @@ def store_in_database(database_script_write: models.DatabaseScriptWrite, backgro
160
167
  raise HTTPException(status_code=500, detail=str(e))
161
168
 
162
169
 
163
- @router.post('/write_results/')
170
+ @router.post("/write_results/")
164
171
  def write_results(polars_script_write: models.PolarsScriptWrite, background_tasks: BackgroundTasks) -> models.Status:
165
172
  """
166
173
  Write polars dataframe to a file in specified format.
@@ -178,22 +185,26 @@ def write_results(polars_script_write: models.PolarsScriptWrite, background_task
178
185
  file_path = polars_script_write.path
179
186
  polars_serializable_object = polars_script_write.polars_serializable_object()
180
187
  result_type = "other"
181
- status = models.Status(background_task_id=task_id, status="Starting", file_ref=file_path,
182
- result_type=result_type)
188
+ status = models.Status(
189
+ background_task_id=task_id, status="Starting", file_ref=file_path, result_type=result_type
190
+ )
183
191
  status_dict[task_id] = status
184
- background_tasks.add_task(start_process,
185
- polars_serializable_object=polars_serializable_object, task_id=task_id,
186
- operation="write_output",
187
- file_ref=file_path,
188
- flowfile_flow_id=polars_script_write.flowfile_flow_id,
189
- flowfile_node_id=polars_script_write.flowfile_node_id,
190
- kwargs=dict(
191
- data_type=polars_script_write.data_type,
192
- path=polars_script_write.path,
193
- write_mode=polars_script_write.write_mode,
194
- sheet_name=polars_script_write.sheet_name,
195
- delimiter=polars_script_write.delimiter)
196
- )
192
+ background_tasks.add_task(
193
+ start_process,
194
+ polars_serializable_object=polars_serializable_object,
195
+ task_id=task_id,
196
+ operation="write_output",
197
+ file_ref=file_path,
198
+ flowfile_flow_id=polars_script_write.flowfile_flow_id,
199
+ flowfile_node_id=polars_script_write.flowfile_node_id,
200
+ kwargs=dict(
201
+ data_type=polars_script_write.data_type,
202
+ path=polars_script_write.path,
203
+ write_mode=polars_script_write.write_mode,
204
+ sheet_name=polars_script_write.sheet_name,
205
+ delimiter=polars_script_write.delimiter,
206
+ ),
207
+ )
197
208
  logger.info(f"Started write task: {task_id} with type: {polars_script_write.data_type}")
198
209
 
199
210
  return status
@@ -203,8 +214,10 @@ def write_results(polars_script_write: models.PolarsScriptWrite, background_task
203
214
  raise HTTPException(status_code=500, detail=str(e))
204
215
 
205
216
 
206
- @router.post('/store_database_read_result')
207
- def store_sql_db_result(database_read_settings: DatabaseReadSettings, background_tasks: BackgroundTasks) -> models.Status:
217
+ @router.post("/store_database_read_result")
218
+ def store_sql_db_result(
219
+ database_read_settings: DatabaseReadSettings, background_tasks: BackgroundTasks
220
+ ) -> models.Status:
208
221
  """
209
222
  Store the result of an sql source operation.
210
223
 
@@ -219,16 +232,21 @@ def store_sql_db_result(database_read_settings: DatabaseReadSettings, background
219
232
 
220
233
  try:
221
234
  task_id = str(uuid.uuid4())
222
- file_path = os.path.join(create_and_get_default_cache_dir(database_read_settings.flowfile_flow_id),
223
- f"{task_id}.arrow")
224
- status = models.Status(background_task_id=task_id, status="Starting", file_ref=file_path,
225
- result_type="polars")
235
+ file_path = os.path.join(
236
+ create_and_get_default_cache_dir(database_read_settings.flowfile_flow_id), f"{task_id}.arrow"
237
+ )
238
+ status = models.Status(background_task_id=task_id, status="Starting", file_ref=file_path, result_type="polars")
226
239
  status_dict[task_id] = status
227
240
  logger.info(f"Starting reading from database source task: {task_id}")
228
- background_tasks.add_task(start_generic_process, func_ref=read_sql_source, file_ref=file_path,
229
- flowfile_flow_id=database_read_settings.flowfile_flow_id,
230
- flowfile_node_id=database_read_settings.flowfile_node_id,
231
- task_id=task_id, kwargs=dict(database_read_settings=database_read_settings))
241
+ background_tasks.add_task(
242
+ start_generic_process,
243
+ func_ref=read_sql_source,
244
+ file_ref=file_path,
245
+ flowfile_flow_id=database_read_settings.flowfile_flow_id,
246
+ flowfile_node_id=database_read_settings.flowfile_node_id,
247
+ task_id=task_id,
248
+ kwargs=dict(database_read_settings=database_read_settings),
249
+ )
232
250
  return status
233
251
 
234
252
  except Exception as e:
@@ -236,9 +254,14 @@ def store_sql_db_result(database_read_settings: DatabaseReadSettings, background
236
254
  raise HTTPException(status_code=500, detail=str(e))
237
255
 
238
256
 
239
- @router.post('/create_table/{file_type}')
240
- def create_table(file_type: FileType, received_table: ReceivedTable, background_tasks: BackgroundTasks,
241
- flowfile_flow_id: int = 1, flowfile_node_id: int | str = -1) -> models.Status:
257
+ @router.post("/create_table/{file_type}")
258
+ def create_table(
259
+ file_type: FileType,
260
+ received_table: ReceivedTable,
261
+ background_tasks: BackgroundTasks,
262
+ flowfile_flow_id: int = 1,
263
+ flowfile_node_id: int | str = -1,
264
+ ) -> models.Status:
242
265
  """
243
266
  Create a Polars table from received dictionary data based on specified file type.
244
267
 
@@ -256,14 +279,18 @@ def create_table(file_type: FileType, received_table: ReceivedTable, background_
256
279
  try:
257
280
  task_id = str(uuid.uuid4())
258
281
  file_ref = os.path.join(create_and_get_default_cache_dir(flowfile_flow_id), f"{task_id}.arrow")
259
- status = models.Status(background_task_id=task_id, status="Starting", file_ref=file_ref,
260
- result_type="polars")
282
+ status = models.Status(background_task_id=task_id, status="Starting", file_ref=file_ref, result_type="polars")
261
283
  status_dict[task_id] = status
262
284
  func_ref = table_creator_factory_method(file_type)
263
- background_tasks.add_task(start_generic_process, func_ref=func_ref, file_ref=file_ref,
264
- task_id=task_id, kwargs={'received_table': received_table},
265
- flowfile_flow_id=flowfile_flow_id,
266
- flowfile_node_id=flowfile_node_id)
285
+ background_tasks.add_task(
286
+ start_generic_process,
287
+ func_ref=func_ref,
288
+ file_ref=file_ref,
289
+ task_id=task_id,
290
+ kwargs={"received_table": received_table},
291
+ flowfile_flow_id=flowfile_flow_id,
292
+ flowfile_node_id=flowfile_node_id,
293
+ )
267
294
  logger.info(f"Started table creation task: {task_id}")
268
295
 
269
296
  return status
@@ -285,7 +312,7 @@ def validate_result(task_id: str) -> bool | None:
285
312
  """
286
313
  logger.debug(f"Validating result for task: {task_id}")
287
314
  status = status_dict.get(task_id)
288
- if status.status == 'Completed' and status.result_type == 'polars':
315
+ if status.status == "Completed" and status.result_type == "polars":
289
316
  try:
290
317
  pl.scan_ipc(status.file_ref)
291
318
  logger.debug(f"Validation successful for task: {task_id}")
@@ -296,7 +323,7 @@ def validate_result(task_id: str) -> bool | None:
296
323
  return True
297
324
 
298
325
 
299
- @router.get('/status/{task_id}', response_model=models.Status)
326
+ @router.get("/status/{task_id}", response_model=models.Status)
300
327
  def get_status(task_id: str) -> models.Status:
301
328
  """Get status of a task by ID and validate its result if completed.
302
329
 
@@ -396,16 +423,20 @@ async def add_fuzzy_join(polars_script: models.FuzzyJoinInput, background_tasks:
396
423
  right_serializable_object = polars_script.right_df_operation.polars_serializable_object()
397
424
 
398
425
  file_path = os.path.join(polars_script.cache_dir, f"{polars_script.task_id}.arrow")
399
- status = models.Status(background_task_id=polars_script.task_id, status="Starting", file_ref=file_path,
400
- result_type="polars")
426
+ status = models.Status(
427
+ background_task_id=polars_script.task_id, status="Starting", file_ref=file_path, result_type="polars"
428
+ )
401
429
  status_dict[polars_script.task_id] = status
402
- background_tasks.add_task(start_fuzzy_process, left_serializable_object=left_serializable_object,
403
- right_serializable_object=right_serializable_object,
404
- file_ref=file_path,
405
- fuzzy_maps=polars_script.fuzzy_maps,
406
- task_id=polars_script.task_id,
407
- flowfile_flow_id=polars_script.flowfile_flow_id,
408
- flowfile_node_id=polars_script.flowfile_node_id)
430
+ background_tasks.add_task(
431
+ start_fuzzy_process,
432
+ left_serializable_object=left_serializable_object,
433
+ right_serializable_object=right_serializable_object,
434
+ file_ref=file_path,
435
+ fuzzy_maps=polars_script.fuzzy_maps,
436
+ task_id=polars_script.task_id,
437
+ flowfile_flow_id=polars_script.flowfile_flow_id,
438
+ flowfile_node_id=polars_script.flowfile_node_id,
439
+ )
409
440
  logger.info(f"Started fuzzy join task: {polars_script.task_id}")
410
441
  return status
411
442
  except Exception as e:
@@ -468,7 +499,7 @@ def cancel_task(task_id: str):
468
499
  return {"message": f"Task {task_id} has been cancelled."}
469
500
 
470
501
 
471
- @router.get('/ids')
502
+ @router.get("/ids")
472
503
  async def get_all_ids():
473
504
  """Get list of all task IDs in the system.
474
505