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
@@ -1,47 +1,52 @@
1
- from typing import List, Dict, Optional, Any, Literal
2
- from pydantic import BaseModel, Field
3
- from datetime import datetime
4
1
  import time
2
+ from datetime import datetime
3
+ from typing import Any, Literal
4
+
5
+ from pydantic import BaseModel, Field
5
6
 
6
7
 
7
8
  class NodeResult(BaseModel):
8
9
  """Represents the execution result of a single node in a FlowGraph run."""
10
+
9
11
  node_id: int
10
- node_name: Optional[str] = None
12
+ node_name: str | None = None
11
13
  start_timestamp: float = Field(default_factory=time.time)
12
14
  end_timestamp: float = 0
13
- success: Optional[bool] = None
14
- error: str = ''
15
+ success: bool | None = None
16
+ error: str = ""
15
17
  run_time: int = -1
16
18
  is_running: bool = True
17
19
 
18
20
 
19
21
  class RunInformation(BaseModel):
20
22
  """Contains summary information about a complete FlowGraph execution."""
23
+
21
24
  flow_id: int
22
- start_time: Optional[datetime] = Field(default_factory=datetime.now)
23
- end_time: Optional[datetime] = None
24
- success: Optional[bool] = None
25
+ start_time: datetime | None = Field(default_factory=datetime.now)
26
+ end_time: datetime | None = None
27
+ success: bool | None = None
25
28
  nodes_completed: int = 0
26
29
  number_of_nodes: int = 0
27
- node_step_result: List[NodeResult]
30
+ node_step_result: list[NodeResult]
28
31
  run_type: Literal["fetch_one", "full_run", "init"]
29
32
 
30
33
 
31
34
  class BaseItem(BaseModel):
32
35
  """A base model for any item in a file system, like a file or directory."""
36
+
33
37
  name: str
34
38
  path: str
35
- size: Optional[int] = None
36
- creation_date: Optional[datetime] = None
37
- access_date: Optional[datetime] = None
38
- modification_date: Optional[datetime] = None
39
- source_path: Optional[str] = None
39
+ size: int | None = None
40
+ creation_date: datetime | None = None
41
+ access_date: datetime | None = None
42
+ modification_date: datetime | None = None
43
+ source_path: str | None = None
40
44
  number_of_items: int = -1
41
45
 
42
46
 
43
47
  class FileColumn(BaseModel):
44
48
  """Represents detailed schema and statistics for a single column (field)."""
49
+
45
50
  name: str
46
51
  data_type: str
47
52
  is_unique: bool
@@ -55,13 +60,14 @@ class FileColumn(BaseModel):
55
60
 
56
61
  class TableExample(BaseModel):
57
62
  """Represents a preview of a table, including schema and sample data."""
63
+
58
64
  node_id: int
59
65
  number_of_records: int
60
66
  number_of_columns: int
61
67
  name: str
62
- table_schema: List[FileColumn]
63
- columns: List[str]
64
- data: Optional[List[Dict]] = {}
68
+ table_schema: list[FileColumn]
69
+ columns: list[str]
70
+ data: list[dict] | None = {}
65
71
  has_example_data: bool = False
66
72
  has_run_with_current_setup: bool = False
67
73
 
@@ -71,15 +77,16 @@ class NodeData(BaseModel):
71
77
 
72
78
  This includes its input/output data previews, settings, and run status.
73
79
  """
80
+
74
81
  flow_id: int
75
82
  node_id: int
76
83
  flow_type: str
77
- left_input: Optional[TableExample] = None
78
- right_input: Optional[TableExample] = None
79
- main_input: Optional[TableExample] = None
80
- main_output: Optional[TableExample] = None
81
- left_output: Optional[TableExample] = None
82
- right_output: Optional[TableExample] = None
84
+ left_input: TableExample | None = None
85
+ right_input: TableExample | None = None
86
+ main_input: TableExample | None = None
87
+ main_output: TableExample | None = None
88
+ left_output: TableExample | None = None
89
+ right_output: TableExample | None = None
83
90
  has_run: bool = False
84
91
  is_cached: bool = False
85
92
  setting_input: Any = None
@@ -87,22 +94,26 @@ class NodeData(BaseModel):
87
94
 
88
95
  class OutputFile(BaseItem):
89
96
  """Represents a single file in an output directory, extending BaseItem."""
90
- ext: Optional[str] = None
91
- mimetype: Optional[str] = None
97
+
98
+ ext: str | None = None
99
+ mimetype: str | None = None
92
100
 
93
101
 
94
102
  class OutputFiles(BaseItem):
95
103
  """Represents a collection of files, typically within a directory."""
96
- files: List[OutputFile] = Field(default_factory=list)
104
+
105
+ files: list[OutputFile] = Field(default_factory=list)
97
106
 
98
107
 
99
108
  class OutputTree(OutputFiles):
100
109
  """Represents a directory tree, including subdirectories."""
101
- directories: List[OutputFiles] = Field(default_factory=list)
110
+
111
+ directories: list[OutputFiles] = Field(default_factory=list)
102
112
 
103
113
 
104
114
  class ItemInfo(OutputFile):
105
115
  """Provides detailed information about a single item in an output directory."""
116
+
106
117
  id: int = -1
107
118
  type: str
108
119
  analysis_file_available: bool = False
@@ -112,23 +123,27 @@ class ItemInfo(OutputFile):
112
123
 
113
124
  class OutputDir(BaseItem):
114
125
  """Represents the contents of a single output directory."""
115
- all_items: List[str]
116
- items: List[ItemInfo]
126
+
127
+ all_items: list[str]
128
+ items: list[ItemInfo]
117
129
 
118
130
 
119
131
  class ExpressionRef(BaseModel):
120
132
  """A reference to a single Polars expression, including its name and docstring."""
133
+
121
134
  name: str
122
- doc: Optional[str]
135
+ doc: str | None
123
136
 
124
137
 
125
138
  class ExpressionsOverview(BaseModel):
126
139
  """Represents a categorized list of available Polars expressions."""
140
+
127
141
  expression_type: str
128
- expressions: List[ExpressionRef]
142
+ expressions: list[ExpressionRef]
129
143
 
130
144
 
131
145
  class InstantFuncResult(BaseModel):
132
146
  """Represents the result of a function that is expected to execute instantly."""
133
- success: Optional[bool] = None
134
- result: str
147
+
148
+ success: bool | None = None
149
+ result: str
@@ -1,46 +1,49 @@
1
- from typing import Optional, List, Dict, Tuple, Any, Literal, ClassVar
2
- from pydantic import BaseModel, field_validator, ConfigDict, Field, ValidationInfo, field_serializer
3
- from flowfile_core.flowfile.utils import create_unique_id
1
+ from typing import Any, ClassVar, Literal
2
+
3
+ from pydantic import BaseModel, ConfigDict, Field, ValidationInfo, field_serializer, field_validator
4
+
4
5
  from flowfile_core.configs.settings import OFFLOAD_TO_WORKER
6
+ from flowfile_core.flowfile.utils import create_unique_id
5
7
  from flowfile_core.schemas import input_schema
6
- ExecutionModeLiteral = Literal['Development', 'Performance']
7
- ExecutionLocationsLiteral = Literal['local', 'remote']
8
+
9
+ ExecutionModeLiteral = Literal["Development", "Performance"]
10
+ ExecutionLocationsLiteral = Literal["local", "remote"]
8
11
 
9
12
  # Type literals for classifying nodes.
10
- NodeTypeLiteral = Literal['input', 'output', 'process']
11
- TransformTypeLiteral = Literal['narrow', 'wide', 'other']
13
+ NodeTypeLiteral = Literal["input", "output", "process"]
14
+ TransformTypeLiteral = Literal["narrow", "wide", "other"]
12
15
  _custom_node_store_cache = None
13
16
 
14
17
  NODE_TYPE_TO_SETTINGS_CLASS = {
15
- 'manual_input': input_schema.NodeManualInput,
16
- 'filter': input_schema.NodeFilter,
17
- 'formula': input_schema.NodeFormula,
18
- 'select': input_schema.NodeSelect,
19
- 'sort': input_schema.NodeSort,
20
- 'record_id': input_schema.NodeRecordId,
21
- 'sample': input_schema.NodeSample,
22
- 'unique': input_schema.NodeUnique,
23
- 'group_by': input_schema.NodeGroupBy,
24
- 'pivot': input_schema.NodePivot,
25
- 'unpivot': input_schema.NodeUnpivot,
26
- 'text_to_rows': input_schema.NodeTextToRows,
27
- 'graph_solver': input_schema.NodeGraphSolver,
28
- 'polars_code': input_schema.NodePolarsCode,
29
- 'join': input_schema.NodeJoin,
30
- 'cross_join': input_schema.NodeCrossJoin,
31
- 'fuzzy_match': input_schema.NodeFuzzyMatch,
32
- 'record_count': input_schema.NodeRecordCount,
33
- 'explore_data': input_schema.NodeExploreData,
34
- 'union': input_schema.NodeUnion,
35
- 'output': input_schema.NodeOutput,
36
- 'read': input_schema.NodeRead,
37
- 'database_reader': input_schema.NodeDatabaseReader,
38
- 'database_writer': input_schema.NodeDatabaseWriter,
39
- 'cloud_storage_reader': input_schema.NodeCloudStorageReader,
40
- 'cloud_storage_writer': input_schema.NodeCloudStorageWriter,
41
- 'external_source': input_schema.NodeExternalSource,
42
- 'promise': input_schema.NodePromise,
43
- 'user_defined': input_schema.UserDefinedNode,
18
+ "manual_input": input_schema.NodeManualInput,
19
+ "filter": input_schema.NodeFilter,
20
+ "formula": input_schema.NodeFormula,
21
+ "select": input_schema.NodeSelect,
22
+ "sort": input_schema.NodeSort,
23
+ "record_id": input_schema.NodeRecordId,
24
+ "sample": input_schema.NodeSample,
25
+ "unique": input_schema.NodeUnique,
26
+ "group_by": input_schema.NodeGroupBy,
27
+ "pivot": input_schema.NodePivot,
28
+ "unpivot": input_schema.NodeUnpivot,
29
+ "text_to_rows": input_schema.NodeTextToRows,
30
+ "graph_solver": input_schema.NodeGraphSolver,
31
+ "polars_code": input_schema.NodePolarsCode,
32
+ "join": input_schema.NodeJoin,
33
+ "cross_join": input_schema.NodeCrossJoin,
34
+ "fuzzy_match": input_schema.NodeFuzzyMatch,
35
+ "record_count": input_schema.NodeRecordCount,
36
+ "explore_data": input_schema.NodeExploreData,
37
+ "union": input_schema.NodeUnion,
38
+ "output": input_schema.NodeOutput,
39
+ "read": input_schema.NodeRead,
40
+ "database_reader": input_schema.NodeDatabaseReader,
41
+ "database_writer": input_schema.NodeDatabaseWriter,
42
+ "cloud_storage_reader": input_schema.NodeCloudStorageReader,
43
+ "cloud_storage_writer": input_schema.NodeCloudStorageWriter,
44
+ "external_source": input_schema.NodeExternalSource,
45
+ "promise": input_schema.NodePromise,
46
+ "user_defined": input_schema.UserDefinedNode,
44
47
  }
45
48
 
46
49
 
@@ -61,6 +64,7 @@ def _get_custom_node_store():
61
64
  global _custom_node_store_cache
62
65
  if _custom_node_store_cache is None:
63
66
  from flowfile_core.configs.node_store import CUSTOM_NODE_STORE
67
+
64
68
  _custom_node_store_cache = CUSTOM_NODE_STORE
65
69
  return _custom_node_store_cache
66
70
 
@@ -79,8 +83,9 @@ def is_valid_execution_location_in_current_global_settings(execution_location: E
79
83
  return not (get_global_execution_location() == "local" and execution_location == "remote")
80
84
 
81
85
 
82
- def get_prio_execution_location(local_execution_location: ExecutionLocationsLiteral,
83
- global_execution_location: ExecutionLocationsLiteral) -> ExecutionLocationsLiteral:
86
+ def get_prio_execution_location(
87
+ local_execution_location: ExecutionLocationsLiteral, global_execution_location: ExecutionLocationsLiteral
88
+ ) -> ExecutionLocationsLiteral:
84
89
  if local_execution_location == global_execution_location:
85
90
  return local_execution_location
86
91
  elif global_execution_location == "local" and local_execution_location == "remote":
@@ -102,16 +107,17 @@ class FlowGraphConfig(BaseModel):
102
107
  execution_mode (ExecutionModeLiteral): The mode of execution ('Development' or 'Performance').
103
108
  execution_location (ExecutionLocationsLiteral): The location for execution ('local', 'remote').
104
109
  """
110
+
105
111
  flow_id: int = Field(default_factory=create_unique_id, description="Unique identifier for the flow.")
106
- description: Optional[str] = None
107
- save_location: Optional[str] = None
108
- name: str = ''
109
- path: str = ''
110
- execution_mode: ExecutionModeLiteral = 'Performance'
112
+ description: str | None = None
113
+ save_location: str | None = None
114
+ name: str = ""
115
+ path: str = ""
116
+ execution_mode: ExecutionModeLiteral = "Performance"
111
117
  execution_location: ExecutionLocationsLiteral = Field(default_factory=get_global_execution_location)
112
118
 
113
- @field_validator('execution_location', mode='before')
114
- def validate_and_set_execution_location(cls, v: Optional[ExecutionLocationsLiteral]) -> ExecutionLocationsLiteral:
119
+ @field_validator("execution_location", mode="before")
120
+ def validate_and_set_execution_location(cls, v: ExecutionLocationsLiteral | None) -> ExecutionLocationsLiteral:
115
121
  """
116
122
  Validates and sets the execution location.
117
123
  1. **If `None` is provided**: It defaults to the location determined by global settings.
@@ -138,8 +144,9 @@ class FlowSettings(FlowGraphConfig):
138
144
  is_running (bool): Indicates if the flow is currently running.
139
145
  is_canceled (bool): Indicates if the flow execution has been canceled.
140
146
  """
147
+
141
148
  auto_save: bool = False
142
- modified_on: Optional[float] = None
149
+ modified_on: float | None = None
143
150
  show_detailed_progress: bool = True
144
151
  is_running: bool = False
145
152
  is_canceled: bool = False
@@ -165,10 +172,11 @@ class RawLogInput(BaseModel):
165
172
  log_type (Literal["INFO", "ERROR"]): The type of log.
166
173
  extra (Optional[dict]): Extra context data for the log.
167
174
  """
175
+
168
176
  flowfile_flow_id: int
169
177
  log_message: str
170
178
  log_type: Literal["INFO", "ERROR"]
171
- extra: Optional[dict] = None
179
+ extra: dict | None = None
172
180
 
173
181
 
174
182
  class FlowfileSettings(BaseModel):
@@ -176,53 +184,64 @@ class FlowfileSettings(BaseModel):
176
184
 
177
185
  Excludes runtime state fields like is_running, is_canceled, modified_on.
178
186
  """
179
- description: Optional[str] = None
180
- execution_mode: ExecutionModeLiteral = 'Performance'
181
- execution_location: ExecutionLocationsLiteral = 'local'
187
+
188
+ description: str | None = None
189
+ execution_mode: ExecutionModeLiteral = "Performance"
190
+ execution_location: ExecutionLocationsLiteral = "local"
182
191
  auto_save: bool = False
183
192
  show_detailed_progress: bool = True
184
193
 
185
194
 
186
195
  class FlowfileNode(BaseModel):
187
196
  """Node representation for flowfile serialization (YAML/JSON)."""
197
+
188
198
  id: int
189
199
  type: str
190
200
  is_start_node: bool = False
191
- description: Optional[str] = ''
192
- x_position: Optional[int] = 0
193
- y_position: Optional[int] = 0
194
- left_input_id: Optional[int] = None
195
- right_input_id: Optional[int] = None
196
- input_ids: Optional[List[int]] = Field(default_factory=list)
197
- outputs: Optional[List[int]] = Field(default_factory=list)
198
- setting_input: Optional[Any] = None
201
+ description: str | None = ""
202
+ x_position: int | None = 0
203
+ y_position: int | None = 0
204
+ left_input_id: int | None = None
205
+ right_input_id: int | None = None
206
+ input_ids: list[int] | None = Field(default_factory=list)
207
+ outputs: list[int] | None = Field(default_factory=list)
208
+ setting_input: Any | None = None
199
209
 
200
210
  _setting_input_exclude: ClassVar[set] = {
201
- 'flow_id', 'node_id', 'pos_x', 'pos_y', 'is_setup',
202
- 'description', 'user_id', 'is_flow_output', 'is_user_defined',
203
- 'depending_on_id', 'depending_on_ids'
211
+ "flow_id",
212
+ "node_id",
213
+ "pos_x",
214
+ "pos_y",
215
+ "is_setup",
216
+ "description",
217
+ "user_id",
218
+ "is_flow_output",
219
+ "is_user_defined",
220
+ "depending_on_id",
221
+ "depending_on_ids",
204
222
  }
205
223
 
206
- @field_serializer('setting_input')
224
+ @field_serializer("setting_input")
207
225
  def serialize_setting_input(self, value, _info):
208
226
  if value is None:
209
227
  return None
210
228
  if isinstance(value, input_schema.NodePromise):
211
229
  return None
212
- if hasattr(value, 'to_yaml_dict'):
230
+ if hasattr(value, "to_yaml_dict"):
213
231
  return value.to_yaml_dict()
214
- if hasattr(value, 'to_yaml_dict'):
232
+ if hasattr(value, "to_yaml_dict"):
215
233
  return value.to_yaml_dict()
216
234
  return value.model_dump(exclude=self._setting_input_exclude)
217
235
 
218
236
 
219
237
  class FlowfileData(BaseModel):
220
238
  """Root model for flowfile serialization (YAML/JSON)."""
239
+
221
240
  flowfile_version: str
222
241
  flowfile_id: int
223
242
  flowfile_name: str
224
243
  flowfile_settings: FlowfileSettings
225
- nodes: List[FlowfileNode]
244
+ nodes: list[FlowfileNode]
226
245
 
227
246
 
228
247
  class NodeTemplate(BaseModel):
@@ -240,6 +259,7 @@ class NodeTemplate(BaseModel):
240
259
  prod_ready (bool): Whether the node is considered production-ready.
241
260
  can_be_start (bool): Whether the node can be a starting point in a flow.
242
261
  """
262
+
243
263
  name: str
244
264
  item: str
245
265
  input: int
@@ -253,35 +273,36 @@ class NodeTemplate(BaseModel):
253
273
  can_be_start: bool = False
254
274
  drawer_title: str = "Node title"
255
275
  drawer_intro: str = "Drawer into"
256
- custom_node: Optional[bool] = False
276
+ custom_node: bool | None = False
257
277
 
258
278
 
259
279
  class NodeInformation(BaseModel):
260
280
  """
261
281
  Stores the state and configuration of a specific node instance within a flow.
262
282
  """
263
- id: Optional[int] = None
264
- type: Optional[str] = None
265
- is_setup: Optional[bool] = None
283
+
284
+ id: int | None = None
285
+ type: str | None = None
286
+ is_setup: bool | None = None
266
287
  is_start_node: bool = False
267
- description: Optional[str] = ''
268
- x_position: Optional[int] = 0
269
- y_position: Optional[int] = 0
270
- left_input_id: Optional[int] = None
271
- right_input_id: Optional[int] = None
272
- input_ids: Optional[List[int]] = Field(default_factory=list)
273
- outputs: Optional[List[int]] = Field(default_factory=list)
274
- setting_input: Optional[Any] = None
288
+ description: str | None = ""
289
+ x_position: int | None = 0
290
+ y_position: int | None = 0
291
+ left_input_id: int | None = None
292
+ right_input_id: int | None = None
293
+ input_ids: list[int] | None = Field(default_factory=list)
294
+ outputs: list[int] | None = Field(default_factory=list)
295
+ setting_input: Any | None = None
275
296
 
276
297
  @property
277
298
  def data(self) -> Any:
278
299
  return self.setting_input
279
300
 
280
301
  @property
281
- def main_input_ids(self) -> Optional[List[int]]:
302
+ def main_input_ids(self) -> list[int] | None:
282
303
  return self.input_ids
283
304
 
284
- @field_validator('setting_input', mode='before')
305
+ @field_validator("setting_input", mode="before")
285
306
  @classmethod
286
307
  def validate_setting_input(cls, v, info: ValidationInfo):
287
308
  if v is None:
@@ -289,7 +310,7 @@ class NodeInformation(BaseModel):
289
310
  if isinstance(v, BaseModel):
290
311
  return v
291
312
 
292
- node_type = info.data.get('type')
313
+ node_type = info.data.get("type")
293
314
  model_class = get_settings_class_for_node_type(node_type)
294
315
 
295
316
  if model_class is None:
@@ -313,21 +334,22 @@ class FlowInformation(BaseModel):
313
334
  node_starts (List[int]): A list of starting node IDs.
314
335
  node_connections (List[Tuple[int, int]]): A list of tuples representing connections between nodes.
315
336
  """
337
+
316
338
  flow_id: int
317
- flow_name: Optional[str] = ''
339
+ flow_name: str | None = ""
318
340
  flow_settings: FlowSettings
319
- data: Dict[int, NodeInformation] = {}
320
- node_starts: List[int]
321
- node_connections: List[Tuple[int, int]] = []
341
+ data: dict[int, NodeInformation] = {}
342
+ node_starts: list[int]
343
+ node_connections: list[tuple[int, int]] = []
322
344
 
323
- @field_validator('flow_name', mode="before")
345
+ @field_validator("flow_name", mode="before")
324
346
  def ensure_string(cls, v):
325
347
  """
326
348
  Validator to ensure the flow_name is always a string.
327
349
  :param v: The value to validate.
328
350
  :return: The value as a string, or an empty string if it's None.
329
351
  """
330
- return str(v) if v is not None else ''
352
+ return str(v) if v is not None else ""
331
353
 
332
354
 
333
355
  class NodeConnection(BaseModel):
@@ -338,6 +360,7 @@ class NodeConnection(BaseModel):
338
360
  from_node_id (int): The ID of the source node.
339
361
  to_node_id (int): The ID of the target node.
340
362
  """
363
+
341
364
  model_config = ConfigDict(frozen=True)
342
365
  from_node_id: int
343
366
  to_node_id: int
@@ -352,6 +375,7 @@ class NodeInput(NodeTemplate):
352
375
  pos_x (float): The x-coordinate on the canvas.
353
376
  pos_y (float): The y-coordinate on the canvas.
354
377
  """
378
+
355
379
  id: int
356
380
  pos_x: float
357
381
  pos_y: float
@@ -368,6 +392,7 @@ class NodeEdge(BaseModel):
368
392
  targetHandle (str): The specific input handle on the target node.
369
393
  sourceHandle (str): The specific output handle on the source node.
370
394
  """
395
+
371
396
  model_config = ConfigDict(coerce_numbers_to_str=True)
372
397
  id: str
373
398
  source: str
@@ -385,8 +410,9 @@ class VueFlowInput(BaseModel):
385
410
  node_edges (List[NodeEdge]): A list of all edges in the graph.
386
411
  node_inputs (List[NodeInput]): A list of all nodes in the graph.
387
412
  """
388
- node_edges: List[NodeEdge]
389
- node_inputs: List[NodeInput]
413
+
414
+ node_edges: list[NodeEdge]
415
+ node_inputs: list[NodeInput]
390
416
 
391
417
 
392
418
  class NodeDefault(BaseModel):
@@ -399,7 +425,8 @@ class NodeDefault(BaseModel):
399
425
  transform_type (TransformTypeLiteral): The data transformation behavior ('narrow', 'wide', 'other').
400
426
  has_default_settings (Optional[Any]): Indicates if the node has predefined default settings.
401
427
  """
428
+
402
429
  node_name: str
403
430
  node_type: NodeTypeLiteral
404
431
  transform_type: TransformTypeLiteral
405
- has_default_settings: Optional[Any] = None
432
+ has_default_settings: Any | None = None