Flowfile 0.4.1__py3-none-any.whl → 0.5.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (332) hide show
  1. build_backends/main.py +25 -22
  2. build_backends/main_prd.py +10 -19
  3. flowfile/__init__.py +179 -73
  4. flowfile/__main__.py +10 -7
  5. flowfile/api.py +52 -59
  6. flowfile/web/__init__.py +14 -9
  7. flowfile/web/static/assets/AdminView-49392a9a.js +713 -0
  8. flowfile/web/static/assets/AdminView-f53bad23.css +129 -0
  9. flowfile/web/static/assets/CloudConnectionView-36bcd6df.css +72 -0
  10. flowfile/web/static/assets/{CloudConnectionManager-d3248f8d.js → CloudConnectionView-f13f202b.js} +11 -11
  11. flowfile/web/static/assets/{CloudStorageReader-d65bf041.js → CloudStorageReader-0023d4a5.js} +10 -8
  12. flowfile/web/static/assets/{CloudStorageReader-29d14fcc.css → CloudStorageReader-24c54524.css} +27 -27
  13. flowfile/web/static/assets/{CloudStorageWriter-b0ee067f.css → CloudStorageWriter-60547855.css} +26 -26
  14. flowfile/web/static/assets/{CloudStorageWriter-e83be3ed.js → CloudStorageWriter-8e781e11.js} +10 -8
  15. flowfile/web/static/assets/{ColumnSelector-47996a16.css → ColumnSelector-371637fb.css} +2 -2
  16. flowfile/web/static/assets/{ColumnSelector-cce661cf.js → ColumnSelector-8ad68ea9.js} +3 -5
  17. flowfile/web/static/assets/{ContextMenu-c13f91d0.css → ContextMenu-26d4dd27.css} +6 -6
  18. flowfile/web/static/assets/{ContextMenu-11a4652a.js → ContextMenu-31ee57f0.js} +3 -3
  19. flowfile/web/static/assets/{ContextMenu-160afb08.js → ContextMenu-69a74055.js} +3 -3
  20. flowfile/web/static/assets/{ContextMenu-cf18d2cc.js → ContextMenu-8e2051c6.js} +3 -3
  21. flowfile/web/static/assets/{ContextMenu-4c74eef1.css → ContextMenu-8ec1729e.css} +6 -6
  22. flowfile/web/static/assets/{ContextMenu-63cfa99b.css → ContextMenu-9b310c60.css} +6 -6
  23. flowfile/web/static/assets/{CrossJoin-d395d38c.js → CrossJoin-03df6938.js} +12 -10
  24. flowfile/web/static/assets/{CrossJoin-1119d18e.css → CrossJoin-71b4cc10.css} +20 -20
  25. flowfile/web/static/assets/CustomNode-59e99a86.css +32 -0
  26. flowfile/web/static/assets/{CustomNode-b812dc0b.js → CustomNode-8479239b.js} +36 -24
  27. flowfile/web/static/assets/{DatabaseConnectionSettings-7000bf2c.js → DatabaseConnectionSettings-869e3efd.js} +5 -4
  28. flowfile/web/static/assets/{DatabaseConnectionSettings-0c04b2e5.css → DatabaseConnectionSettings-e91df89a.css} +13 -13
  29. flowfile/web/static/assets/{DatabaseReader-ae61773c.css → DatabaseReader-36898a00.css} +24 -24
  30. flowfile/web/static/assets/{DatabaseReader-4f035d0c.js → DatabaseReader-c58b9552.js} +25 -15
  31. flowfile/web/static/assets/DatabaseView-6655afd6.css +57 -0
  32. flowfile/web/static/assets/{DatabaseManager-9662ec5b.js → DatabaseView-d26a9140.js} +11 -11
  33. flowfile/web/static/assets/{DatabaseWriter-2f570e53.css → DatabaseWriter-217a99f1.css} +19 -19
  34. flowfile/web/static/assets/{DatabaseWriter-f65dcd54.js → DatabaseWriter-4d05ddc7.js} +17 -10
  35. flowfile/web/static/assets/{designer-e3c150ec.css → DesignerView-a6d0ee84.css} +629 -538
  36. flowfile/web/static/assets/{designer-f3656d8c.js → DesignerView-e6f5c0e8.js} +1214 -3209
  37. flowfile/web/static/assets/{documentation-52b241e7.js → DocumentationView-2e78ef1b.js} +5 -5
  38. flowfile/web/static/assets/{documentation-12216a74.css → DocumentationView-fd46c656.css} +7 -7
  39. flowfile/web/static/assets/{ExploreData-2d0cf4db.css → ExploreData-10c5acc8.css} +13 -12
  40. flowfile/web/static/assets/{ExploreData-94c43dfc.js → ExploreData-7b54caca.js} +18 -9
  41. flowfile/web/static/assets/{ExternalSource-ac04b3cc.js → ExternalSource-3fa399b2.js} +9 -7
  42. flowfile/web/static/assets/{ExternalSource-e37b6275.css → ExternalSource-47ab05a3.css} +17 -17
  43. flowfile/web/static/assets/Filter-7494ea97.css +48 -0
  44. flowfile/web/static/assets/Filter-8cbbdbf3.js +287 -0
  45. flowfile/web/static/assets/{Formula-bb96803d.css → Formula-53d58c43.css} +7 -7
  46. flowfile/web/static/assets/{Formula-71472193.js → Formula-aac42b1e.js} +13 -11
  47. flowfile/web/static/assets/{FuzzyMatch-1010f966.css → FuzzyMatch-ad6361d6.css} +68 -69
  48. flowfile/web/static/assets/{FuzzyMatch-b317f631.js → FuzzyMatch-cd9bbfca.js} +12 -10
  49. flowfile/web/static/assets/{Pivot-cf333e3d.css → GraphSolver-c24dec17.css} +5 -5
  50. flowfile/web/static/assets/{GraphSolver-754a234f.js → GraphSolver-c7e6780e.js} +13 -11
  51. flowfile/web/static/assets/{GroupBy-6c6f9802.js → GroupBy-93c5d22b.js} +9 -7
  52. flowfile/web/static/assets/{GroupBy-b9505323.css → GroupBy-be7ac0bf.css} +10 -10
  53. flowfile/web/static/assets/{Join-fd79b451.css → Join-28b5e18f.css} +22 -22
  54. flowfile/web/static/assets/{Join-a1b800be.js → Join-a19b2de2.js} +13 -11
  55. flowfile/web/static/assets/LoginView-0df4ed0a.js +134 -0
  56. flowfile/web/static/assets/LoginView-d325d632.css +172 -0
  57. flowfile/web/static/assets/ManualInput-3702e677.css +293 -0
  58. flowfile/web/static/assets/{ManualInput-a9640276.js → ManualInput-8d3374b2.js} +170 -116
  59. flowfile/web/static/assets/{MultiSelect-97213888.js → MultiSelect-ad1b6243.js} +2 -2
  60. flowfile/web/static/assets/{MultiSelect.vue_vue_type_script_setup_true_lang-6ffe088a.js → MultiSelect.vue_vue_type_script_setup_true_lang-e278950d.js} +1 -1
  61. flowfile/web/static/assets/NodeDesigner-40b647c9.js +2610 -0
  62. flowfile/web/static/assets/NodeDesigner-5f53be3f.css +1429 -0
  63. flowfile/web/static/assets/{NumericInput-e638088a.js → NumericInput-7100234c.js} +2 -2
  64. flowfile/web/static/assets/{NumericInput.vue_vue_type_script_setup_true_lang-90eb2cba.js → NumericInput.vue_vue_type_script_setup_true_lang-5130219f.js} +5 -2
  65. flowfile/web/static/assets/{Output-ddc9079f.css → Output-35e97000.css} +6 -6
  66. flowfile/web/static/assets/{Output-76750610.js → Output-f5efd2aa.js} +60 -38
  67. flowfile/web/static/assets/{GraphSolver-f0cb7bfb.css → Pivot-0eda81b4.css} +5 -5
  68. flowfile/web/static/assets/{Pivot-7814803f.js → Pivot-d981d23c.js} +11 -9
  69. flowfile/web/static/assets/PivotValidation-0e905b1a.css +13 -0
  70. flowfile/web/static/assets/{PivotValidation-f92137d2.js → PivotValidation-39386e95.js} +3 -3
  71. flowfile/web/static/assets/PivotValidation-41b57ad6.css +13 -0
  72. flowfile/web/static/assets/{PivotValidation-76dd431a.js → PivotValidation-63de1f73.js} +3 -3
  73. flowfile/web/static/assets/{PolarsCode-650322d1.css → PolarsCode-2b1f1f23.css} +4 -4
  74. flowfile/web/static/assets/{PolarsCode-889c3008.js → PolarsCode-f9d69217.js} +18 -9
  75. flowfile/web/static/assets/PopOver-b22f049e.js +939 -0
  76. flowfile/web/static/assets/PopOver-d96599db.css +33 -0
  77. flowfile/web/static/assets/{Read-6b17491f.css → Read-36e7bd51.css} +12 -12
  78. flowfile/web/static/assets/{Read-637b72a7.js → Read-aec2e377.js} +83 -105
  79. flowfile/web/static/assets/{RecordCount-2b050c41.js → RecordCount-78ed6845.js} +6 -4
  80. flowfile/web/static/assets/{RecordId-81df7784.js → RecordId-2156e890.js} +8 -6
  81. flowfile/web/static/assets/{SQLQueryComponent-36cef432.css → SQLQueryComponent-1c2f26b4.css} +5 -5
  82. flowfile/web/static/assets/{SQLQueryComponent-88dcfe53.js → SQLQueryComponent-48c72f5b.js} +3 -3
  83. flowfile/web/static/assets/{Sample-258ad2a9.js → Sample-1352ca74.js} +6 -4
  84. flowfile/web/static/assets/SecretSelector-22b5ff89.js +113 -0
  85. flowfile/web/static/assets/SecretSelector-6329f743.css +43 -0
  86. flowfile/web/static/assets/{SecretManager-2a2cb7e2.js → SecretsView-17df66ee.js} +35 -36
  87. flowfile/web/static/assets/SecretsView-aa291340.css +38 -0
  88. flowfile/web/static/assets/{Select-850215fd.js → Select-0aee4c54.js} +9 -7
  89. flowfile/web/static/assets/{SettingsSection-55bae608.js → SettingsSection-0784e157.js} +3 -3
  90. flowfile/web/static/assets/{SettingsSection-71e6b7e3.css → SettingsSection-07fbbc39.css} +4 -4
  91. flowfile/web/static/assets/{SettingsSection-5c696bee.css → SettingsSection-26fe48d4.css} +4 -4
  92. flowfile/web/static/assets/{SettingsSection-2e4d03c4.css → SettingsSection-8f980839.css} +4 -4
  93. flowfile/web/static/assets/{SettingsSection-0e8d9123.js → SettingsSection-cd341bb6.js} +3 -3
  94. flowfile/web/static/assets/{SettingsSection-29b4fa6b.js → SettingsSection-f2002a6d.js} +3 -3
  95. flowfile/web/static/assets/{SingleSelect-bebd408b.js → SingleSelect-460cc0ea.js} +2 -2
  96. flowfile/web/static/assets/{SingleSelect.vue_vue_type_script_setup_true_lang-6093741c.js → SingleSelect.vue_vue_type_script_setup_true_lang-30741bb2.js} +1 -1
  97. flowfile/web/static/assets/{SliderInput-6a05ab61.js → SliderInput-5d926864.js} +7 -4
  98. flowfile/web/static/assets/SliderInput-f2e4f23c.css +4 -0
  99. flowfile/web/static/assets/{Sort-10ab48ed.js → Sort-3cdc971b.js} +9 -7
  100. flowfile/web/static/assets/{Unique-f9fb0809.css → Sort-8a871341.css} +10 -10
  101. flowfile/web/static/assets/{TextInput-df9d6259.js → TextInput-a2d0bfbd.js} +2 -2
  102. flowfile/web/static/assets/{TextInput.vue_vue_type_script_setup_true_lang-000e1178.js → TextInput.vue_vue_type_script_setup_true_lang-abad1ca2.js} +5 -2
  103. flowfile/web/static/assets/{TextToRows-5d2c1190.css → TextToRows-12afb4f4.css} +10 -10
  104. flowfile/web/static/assets/{TextToRows-6c2d93d8.js → TextToRows-918945f7.js} +11 -10
  105. flowfile/web/static/assets/{ToggleSwitch-0ff7ac52.js → ToggleSwitch-f0ef5196.js} +2 -2
  106. flowfile/web/static/assets/{ToggleSwitch.vue_vue_type_script_setup_true_lang-c6dc3029.js → ToggleSwitch.vue_vue_type_script_setup_true_lang-5605c793.js} +1 -1
  107. flowfile/web/static/assets/{UnavailableFields-5edd5322.css → UnavailableFields-54d2f518.css} +6 -6
  108. flowfile/web/static/assets/{UnavailableFields-1bab97cb.js → UnavailableFields-bdad6144.js} +4 -4
  109. flowfile/web/static/assets/{Union-af6c3d9b.css → Union-d6a8d7d5.css} +7 -7
  110. flowfile/web/static/assets/{Union-b563478a.js → Union-e8ab8c86.js} +8 -6
  111. flowfile/web/static/assets/{Unique-f90db5db.js → Unique-8cd4f976.js} +13 -22
  112. flowfile/web/static/assets/{Sort-3643d625.css → Unique-9fb2f567.css} +10 -10
  113. flowfile/web/static/assets/{Unpivot-1e422df3.css → Unpivot-710a2948.css} +7 -7
  114. flowfile/web/static/assets/{Unpivot-bcb0025f.js → Unpivot-8da14095.js} +10 -8
  115. flowfile/web/static/assets/{UnpivotValidation-c4e73b04.js → UnpivotValidation-6f7d89ff.js} +3 -3
  116. flowfile/web/static/assets/UnpivotValidation-d5ca3b7b.css +13 -0
  117. flowfile/web/static/assets/{VueGraphicWalker-bb8535e2.js → VueGraphicWalker-3fb312e1.js} +4 -4
  118. flowfile/web/static/assets/{VueGraphicWalker-ed5ab88b.css → VueGraphicWalker-430f0b86.css} +1 -1
  119. flowfile/web/static/assets/{api-4c8e3822.js → api-24483f0d.js} +1 -1
  120. flowfile/web/static/assets/{api-2d6adc4f.js → api-8b81fa73.js} +1 -1
  121. flowfile/web/static/assets/{dropDown-35135ba8.css → dropDown-3d8dc5fa.css} +40 -40
  122. flowfile/web/static/assets/{dropDown-1bca8a74.js → dropDown-ac0fda9d.js} +3 -3
  123. flowfile/web/static/assets/{fullEditor-2985687e.js → fullEditor-5497a84a.js} +11 -10
  124. flowfile/web/static/assets/{fullEditor-178376bb.css → fullEditor-a0be62b3.css} +74 -62
  125. flowfile/web/static/assets/{genericNodeSettings-924759c7.css → genericNodeSettings-3b2507ea.css} +10 -10
  126. flowfile/web/static/assets/{genericNodeSettings-0476ba4e.js → genericNodeSettings-99014e1d.js} +5 -5
  127. flowfile/web/static/assets/index-07dda503.js +38 -0
  128. flowfile/web/static/assets/index-3ba44389.js +2696 -0
  129. flowfile/web/static/assets/{index-50508d4d.css → index-e6289dd0.css} +1945 -569
  130. flowfile/web/static/assets/{index-246f201c.js → index-fb6493ae.js} +41626 -40869
  131. flowfile/web/static/assets/node.types-2c15bb7e.js +82 -0
  132. flowfile/web/static/assets/nodeInput-0eb13f1a.js +2 -0
  133. flowfile/web/static/assets/{outputCsv-d686eeaf.js → outputCsv-8f8ba42d.js} +3 -3
  134. flowfile/web/static/assets/outputCsv-b9a072af.css +2499 -0
  135. flowfile/web/static/assets/{outputExcel-8809ea2f.js → outputExcel-393f4fef.js} +3 -3
  136. flowfile/web/static/assets/{outputExcel-b41305c0.css → outputExcel-f5d272b2.css} +26 -26
  137. flowfile/web/static/assets/{outputParquet-53ba645a.js → outputParquet-07c81f65.js} +4 -4
  138. flowfile/web/static/assets/outputParquet-54597c3c.css +4 -0
  139. flowfile/web/static/assets/{readCsv-053bf97b.js → readCsv-07f6d9ad.js} +21 -20
  140. flowfile/web/static/assets/{readCsv-bca3ed53.css → readCsv-3bfac4c3.css} +15 -15
  141. flowfile/web/static/assets/{readExcel-e1b381ea.css → readExcel-3db6b763.css} +13 -13
  142. flowfile/web/static/assets/{readExcel-ad531eab.js → readExcel-ed69bc8f.js} +10 -12
  143. flowfile/web/static/assets/{readParquet-cee068e2.css → readParquet-c5244ad5.css} +4 -4
  144. flowfile/web/static/assets/{readParquet-58e899a1.js → readParquet-e3ed4528.js} +4 -7
  145. flowfile/web/static/assets/secrets.api-002e7d7e.js +65 -0
  146. flowfile/web/static/assets/{selectDynamic-b38de2ba.js → selectDynamic-80b92899.js} +5 -5
  147. flowfile/web/static/assets/{selectDynamic-aa913ff4.css → selectDynamic-f2fb394f.css} +21 -20
  148. flowfile/web/static/assets/{vue-codemirror.esm-db9b8936.js → vue-codemirror.esm-0965f39f.js} +31 -637
  149. flowfile/web/static/assets/{vue-content-loader.es-b5f3ac30.js → vue-content-loader.es-c506ad97.js} +1 -1
  150. flowfile/web/static/index.html +2 -2
  151. {flowfile-0.4.1.dist-info → flowfile-0.5.3.dist-info}/METADATA +4 -4
  152. flowfile-0.5.3.dist-info/RECORD +402 -0
  153. {flowfile-0.4.1.dist-info → flowfile-0.5.3.dist-info}/WHEEL +1 -1
  154. {flowfile-0.4.1.dist-info → flowfile-0.5.3.dist-info}/entry_points.txt +1 -0
  155. flowfile_core/__init__.py +13 -3
  156. flowfile_core/auth/jwt.py +51 -16
  157. flowfile_core/auth/models.py +32 -7
  158. flowfile_core/auth/password.py +89 -0
  159. flowfile_core/auth/secrets.py +8 -6
  160. flowfile_core/configs/__init__.py +9 -7
  161. flowfile_core/configs/flow_logger.py +15 -14
  162. flowfile_core/configs/node_store/__init__.py +72 -4
  163. flowfile_core/configs/node_store/nodes.py +155 -172
  164. flowfile_core/configs/node_store/user_defined_node_registry.py +108 -27
  165. flowfile_core/configs/settings.py +28 -15
  166. flowfile_core/database/connection.py +7 -6
  167. flowfile_core/database/init_db.py +96 -2
  168. flowfile_core/database/models.py +3 -1
  169. flowfile_core/fileExplorer/__init__.py +17 -0
  170. flowfile_core/fileExplorer/funcs.py +123 -57
  171. flowfile_core/fileExplorer/utils.py +10 -11
  172. flowfile_core/flowfile/_extensions/real_time_interface.py +10 -8
  173. flowfile_core/flowfile/analytics/analytics_processor.py +27 -24
  174. flowfile_core/flowfile/analytics/graphic_walker.py +11 -12
  175. flowfile_core/flowfile/analytics/utils.py +1 -1
  176. flowfile_core/flowfile/code_generator/code_generator.py +391 -279
  177. flowfile_core/flowfile/connection_manager/_connection_manager.py +6 -5
  178. flowfile_core/flowfile/connection_manager/models.py +1 -1
  179. flowfile_core/flowfile/database_connection_manager/db_connections.py +60 -44
  180. flowfile_core/flowfile/database_connection_manager/models.py +1 -1
  181. flowfile_core/flowfile/extensions.py +17 -12
  182. flowfile_core/flowfile/flow_data_engine/cloud_storage_reader.py +34 -32
  183. flowfile_core/flowfile/flow_data_engine/create/funcs.py +152 -103
  184. flowfile_core/flowfile/flow_data_engine/flow_data_engine.py +526 -477
  185. flowfile_core/flowfile/flow_data_engine/flow_file_column/interface.py +2 -2
  186. flowfile_core/flowfile/flow_data_engine/flow_file_column/main.py +92 -52
  187. flowfile_core/flowfile/flow_data_engine/flow_file_column/polars_type.py +12 -11
  188. flowfile_core/flowfile/flow_data_engine/flow_file_column/type_registry.py +6 -6
  189. flowfile_core/flowfile/flow_data_engine/flow_file_column/utils.py +26 -30
  190. flowfile_core/flowfile/flow_data_engine/fuzzy_matching/prepare_for_fuzzy_match.py +43 -32
  191. flowfile_core/flowfile/flow_data_engine/join/__init__.py +1 -1
  192. flowfile_core/flowfile/flow_data_engine/join/utils.py +11 -9
  193. flowfile_core/flowfile/flow_data_engine/join/verify_integrity.py +15 -11
  194. flowfile_core/flowfile/flow_data_engine/pivot_table.py +5 -7
  195. flowfile_core/flowfile/flow_data_engine/polars_code_parser.py +95 -82
  196. flowfile_core/flowfile/flow_data_engine/read_excel_tables.py +66 -65
  197. flowfile_core/flowfile/flow_data_engine/sample_data.py +27 -21
  198. flowfile_core/flowfile/flow_data_engine/subprocess_operations/__init__.py +1 -1
  199. flowfile_core/flowfile/flow_data_engine/subprocess_operations/models.py +13 -11
  200. flowfile_core/flowfile/flow_data_engine/subprocess_operations/subprocess_operations.py +360 -191
  201. flowfile_core/flowfile/flow_data_engine/threaded_processes.py +8 -8
  202. flowfile_core/flowfile/flow_data_engine/utils.py +101 -67
  203. flowfile_core/flowfile/flow_graph.py +1011 -561
  204. flowfile_core/flowfile/flow_graph_utils.py +31 -49
  205. flowfile_core/flowfile/flow_node/flow_node.py +332 -232
  206. flowfile_core/flowfile/flow_node/models.py +54 -41
  207. flowfile_core/flowfile/flow_node/schema_callback.py +14 -19
  208. flowfile_core/flowfile/graph_tree/graph_tree.py +41 -41
  209. flowfile_core/flowfile/handler.py +82 -32
  210. flowfile_core/flowfile/manage/compatibility_enhancements.py +493 -47
  211. flowfile_core/flowfile/manage/io_flowfile.py +391 -0
  212. flowfile_core/flowfile/node_designer/__init__.py +15 -13
  213. flowfile_core/flowfile/node_designer/_type_registry.py +34 -37
  214. flowfile_core/flowfile/node_designer/custom_node.py +162 -36
  215. flowfile_core/flowfile/node_designer/ui_components.py +136 -35
  216. flowfile_core/flowfile/schema_callbacks.py +77 -54
  217. flowfile_core/flowfile/setting_generator/__init__.py +0 -1
  218. flowfile_core/flowfile/setting_generator/setting_generator.py +6 -5
  219. flowfile_core/flowfile/setting_generator/settings.py +72 -55
  220. flowfile_core/flowfile/sources/external_sources/base_class.py +12 -10
  221. flowfile_core/flowfile/sources/external_sources/custom_external_sources/external_source.py +27 -17
  222. flowfile_core/flowfile/sources/external_sources/custom_external_sources/sample_users.py +9 -9
  223. flowfile_core/flowfile/sources/external_sources/factory.py +0 -1
  224. flowfile_core/flowfile/sources/external_sources/sql_source/models.py +45 -31
  225. flowfile_core/flowfile/sources/external_sources/sql_source/sql_source.py +198 -73
  226. flowfile_core/flowfile/sources/external_sources/sql_source/utils.py +250 -196
  227. flowfile_core/flowfile/util/calculate_layout.py +9 -13
  228. flowfile_core/flowfile/util/execution_orderer.py +25 -17
  229. flowfile_core/flowfile/util/node_skipper.py +4 -4
  230. flowfile_core/flowfile/utils.py +19 -21
  231. flowfile_core/main.py +26 -19
  232. flowfile_core/routes/auth.py +284 -11
  233. flowfile_core/routes/cloud_connections.py +25 -25
  234. flowfile_core/routes/logs.py +21 -29
  235. flowfile_core/routes/public.py +3 -3
  236. flowfile_core/routes/routes.py +77 -43
  237. flowfile_core/routes/secrets.py +25 -27
  238. flowfile_core/routes/user_defined_components.py +483 -4
  239. flowfile_core/run_lock.py +0 -1
  240. flowfile_core/schemas/__init__.py +4 -6
  241. flowfile_core/schemas/analysis_schemas/graphic_walker_schemas.py +55 -55
  242. flowfile_core/schemas/cloud_storage_schemas.py +59 -55
  243. flowfile_core/schemas/input_schema.py +398 -154
  244. flowfile_core/schemas/output_model.py +50 -35
  245. flowfile_core/schemas/schemas.py +207 -67
  246. flowfile_core/schemas/transform_schema.py +1360 -435
  247. flowfile_core/schemas/yaml_types.py +117 -0
  248. flowfile_core/secret_manager/secret_manager.py +17 -13
  249. flowfile_core/{flowfile/node_designer/data_types.py → types.py} +33 -3
  250. flowfile_core/utils/arrow_reader.py +7 -6
  251. flowfile_core/utils/excel_file_manager.py +3 -3
  252. flowfile_core/utils/fileManager.py +7 -7
  253. flowfile_core/utils/fl_executor.py +8 -10
  254. flowfile_core/utils/utils.py +4 -4
  255. flowfile_core/utils/validate_setup.py +5 -4
  256. flowfile_frame/__init__.py +107 -50
  257. flowfile_frame/adapters.py +2 -9
  258. flowfile_frame/adding_expr.py +73 -32
  259. flowfile_frame/cloud_storage/frame_helpers.py +27 -23
  260. flowfile_frame/cloud_storage/secret_manager.py +12 -26
  261. flowfile_frame/config.py +2 -5
  262. flowfile_frame/expr.py +311 -218
  263. flowfile_frame/expr.pyi +160 -159
  264. flowfile_frame/expr_name.py +23 -23
  265. flowfile_frame/flow_frame.py +581 -489
  266. flowfile_frame/flow_frame.pyi +123 -104
  267. flowfile_frame/flow_frame_methods.py +236 -252
  268. flowfile_frame/group_frame.py +50 -20
  269. flowfile_frame/join.py +2 -2
  270. flowfile_frame/lazy.py +129 -87
  271. flowfile_frame/lazy_methods.py +83 -30
  272. flowfile_frame/list_name_space.py +55 -50
  273. flowfile_frame/selectors.py +148 -68
  274. flowfile_frame/series.py +9 -7
  275. flowfile_frame/utils.py +19 -21
  276. flowfile_worker/__init__.py +12 -4
  277. flowfile_worker/configs.py +11 -19
  278. flowfile_worker/create/__init__.py +14 -27
  279. flowfile_worker/create/funcs.py +143 -94
  280. flowfile_worker/create/models.py +139 -68
  281. flowfile_worker/create/pl_types.py +14 -15
  282. flowfile_worker/create/read_excel_tables.py +34 -41
  283. flowfile_worker/create/utils.py +22 -19
  284. flowfile_worker/external_sources/s3_source/main.py +18 -51
  285. flowfile_worker/external_sources/s3_source/models.py +34 -27
  286. flowfile_worker/external_sources/sql_source/main.py +8 -5
  287. flowfile_worker/external_sources/sql_source/models.py +13 -9
  288. flowfile_worker/flow_logger.py +10 -8
  289. flowfile_worker/funcs.py +214 -155
  290. flowfile_worker/main.py +11 -17
  291. flowfile_worker/models.py +35 -28
  292. flowfile_worker/process_manager.py +2 -3
  293. flowfile_worker/routes.py +121 -93
  294. flowfile_worker/secrets.py +9 -6
  295. flowfile_worker/spawner.py +80 -49
  296. flowfile_worker/utils.py +3 -2
  297. shared/__init__.py +2 -7
  298. shared/storage_config.py +25 -13
  299. test_utils/postgres/commands.py +3 -2
  300. test_utils/postgres/fixtures.py +9 -9
  301. test_utils/s3/commands.py +1 -1
  302. test_utils/s3/data_generator.py +3 -4
  303. test_utils/s3/demo_data_generator.py +4 -7
  304. test_utils/s3/fixtures.py +7 -5
  305. tools/migrate/README.md +56 -0
  306. tools/migrate/__init__.py +12 -0
  307. tools/migrate/__main__.py +118 -0
  308. tools/migrate/legacy_schemas.py +682 -0
  309. tools/migrate/migrate.py +610 -0
  310. tools/migrate/tests/__init__.py +0 -0
  311. tools/migrate/tests/conftest.py +21 -0
  312. tools/migrate/tests/test_migrate.py +622 -0
  313. tools/migrate/tests/test_migration_e2e.py +1009 -0
  314. tools/migrate/tests/test_node_migrations.py +843 -0
  315. flowfile/web/static/assets/CloudConnectionManager-2dfdce2f.css +0 -86
  316. flowfile/web/static/assets/CustomNode-74a37f74.css +0 -32
  317. flowfile/web/static/assets/DatabaseManager-30fa27e5.css +0 -64
  318. flowfile/web/static/assets/Filter-812dcbca.js +0 -164
  319. flowfile/web/static/assets/Filter-f62091b3.css +0 -20
  320. flowfile/web/static/assets/ManualInput-3246a08d.css +0 -96
  321. flowfile/web/static/assets/PivotValidation-891ddfb0.css +0 -13
  322. flowfile/web/static/assets/PivotValidation-c46cd420.css +0 -13
  323. flowfile/web/static/assets/SliderInput-b8fb6a8c.css +0 -4
  324. flowfile/web/static/assets/UnpivotValidation-0d240eeb.css +0 -13
  325. flowfile/web/static/assets/outputCsv-9cc59e0b.css +0 -2499
  326. flowfile/web/static/assets/outputParquet-cf8cf3f2.css +0 -4
  327. flowfile/web/static/assets/secretApi-538058f3.js +0 -46
  328. flowfile/web/static/assets/vue-codemirror-bccfde04.css +0 -32
  329. flowfile-0.4.1.dist-info/RECORD +0 -376
  330. flowfile_core/flowfile/manage/open_flowfile.py +0 -143
  331. {flowfile-0.4.1.dist-info → flowfile-0.5.3.dist-info}/licenses/LICENSE +0 -0
  332. /flowfile_core/flowfile/manage/manage_flowfile.py → /tools/__init__.py +0 -0
@@ -0,0 +1,682 @@
1
+ """
2
+ Legacy schema definitions for loading old flowfile pickles.
3
+
4
+ These definitions mirror the OLD schema structure BEFORE the migration to the new
5
+ discriminated union table_settings format.
6
+
7
+ OLD structure:
8
+ - ReceivedTable: All fields flat (delimiter, encoding, sheet_name all at top level)
9
+ - OutputSettings: Separate output_csv_table, output_parquet_table, output_excel_table fields
10
+
11
+ NEW structure:
12
+ - ReceivedTable: Has nested table_settings with discriminated union
13
+ - OutputSettings: Has single table_settings field with discriminated union
14
+
15
+ DO NOT USE THESE IN PRODUCTION CODE - use the actual schemas from flowfile_core.
16
+ """
17
+
18
+ from dataclasses import dataclass, field
19
+ from typing import Any, Literal
20
+
21
+ from pydantic import BaseModel, Field
22
+
23
+ # =============================================================================
24
+ # OLD INPUT/OUTPUT SCHEMAS (before table_settings migration)
25
+ # These mirror the structure that exists in old pickle files
26
+ # =============================================================================
27
+
28
+
29
+ class MinimalFieldInfo(BaseModel):
30
+ """Represents the most basic information about a data field (column)."""
31
+
32
+ name: str
33
+ data_type: str = "String"
34
+
35
+
36
+ class OutputCsvTable(BaseModel):
37
+ """OLD: Settings for writing a CSV file."""
38
+
39
+ file_type: str = "csv"
40
+ delimiter: str = ","
41
+ encoding: str = "utf-8"
42
+
43
+
44
+ class OutputParquetTable(BaseModel):
45
+ """OLD: Settings for writing a Parquet file."""
46
+
47
+ file_type: str = "parquet"
48
+
49
+
50
+ class OutputExcelTable(BaseModel):
51
+ """OLD: Settings for writing an Excel file."""
52
+
53
+ file_type: str = "excel"
54
+ sheet_name: str = "Sheet1"
55
+
56
+
57
+ class OutputSettings(BaseModel):
58
+ """OLD OutputSettings structure with SEPARATE table fields.
59
+
60
+ This is the OLD format where CSV, Parquet, and Excel settings
61
+ were stored in separate fields rather than a unified table_settings.
62
+ """
63
+
64
+ name: str
65
+ directory: str
66
+ file_type: str
67
+ fields: list[str] | None = Field(default_factory=list)
68
+ write_mode: str = "overwrite"
69
+ # OLD: Separate fields for each output type
70
+ output_csv_table: OutputCsvTable | None = Field(default_factory=OutputCsvTable)
71
+ output_parquet_table: OutputParquetTable = Field(default_factory=OutputParquetTable)
72
+ output_excel_table: OutputExcelTable = Field(default_factory=OutputExcelTable)
73
+ abs_file_path: str | None = None
74
+
75
+
76
+ class ReceivedTable(BaseModel):
77
+ """OLD ReceivedTable structure with FLAT fields.
78
+
79
+ This is the OLD format where all settings (CSV, Excel, Parquet)
80
+ were stored as flat fields on the model rather than nested in table_settings.
81
+ """
82
+
83
+ # Metadata fields
84
+ id: int | None = None
85
+ name: str | None = None
86
+ path: str = ""
87
+ directory: str | None = None
88
+ analysis_file_available: bool = False
89
+ status: str | None = None
90
+ file_type: str | None = None
91
+ fields: list[MinimalFieldInfo] = Field(default_factory=list)
92
+ abs_file_path: str | None = None
93
+
94
+ # OLD: CSV/JSON fields at top level (not nested)
95
+ reference: str = ""
96
+ starting_from_line: int = 0
97
+ delimiter: str = ","
98
+ has_headers: bool = True
99
+ encoding: str | None = "utf-8"
100
+ parquet_ref: str | None = None
101
+ row_delimiter: str = "\n"
102
+ quote_char: str = '"'
103
+ infer_schema_length: int = 10_000
104
+ truncate_ragged_lines: bool = False
105
+ ignore_errors: bool = False
106
+
107
+ # OLD: Excel fields at top level (not nested)
108
+ sheet_name: str | None = None
109
+ start_row: int = 0
110
+ start_column: int = 0
111
+ end_row: int = 0
112
+ end_column: int = 0
113
+ type_inference: bool = False
114
+
115
+
116
+ # =============================================================================
117
+ # FLOW AND NODE SCHEMAS (Pydantic - structure unchanged, just re-exported)
118
+ # =============================================================================
119
+
120
+
121
+ class FlowGraphConfig(BaseModel):
122
+ """Configuration model for a flow graph's basic properties."""
123
+
124
+ flow_id: int = 1
125
+ description: str | None = None
126
+ save_location: str | None = None
127
+ name: str = ""
128
+ path: str = ""
129
+ execution_mode: str = "Performance"
130
+ execution_location: str = "local"
131
+
132
+
133
+ class FlowSettings(FlowGraphConfig):
134
+ """Extends FlowGraphConfig with additional operational settings."""
135
+
136
+ auto_save: bool = False
137
+ modified_on: float | None = None
138
+ show_detailed_progress: bool = True
139
+ is_running: bool = False
140
+ is_canceled: bool = False
141
+
142
+
143
+ class NodeBase(BaseModel):
144
+ """Base model for all nodes in a FlowGraph."""
145
+
146
+ flow_id: int
147
+ node_id: int
148
+ cache_results: bool | None = False
149
+ pos_x: float | None = 0
150
+ pos_y: float | None = 0
151
+ is_setup: bool | None = True
152
+ description: str | None = ""
153
+ user_id: int | None = None
154
+ is_flow_output: bool | None = False
155
+ is_user_defined: bool | None = False
156
+
157
+
158
+ class NodeSingleInput(NodeBase):
159
+ """A base model for any node that takes a single data input."""
160
+
161
+ depending_on_id: int | None = -1
162
+
163
+
164
+ class NodeMultiInput(NodeBase):
165
+ """A base model for any node that takes multiple data inputs."""
166
+
167
+ depending_on_ids: list[int] | None = Field(default_factory=lambda: [-1])
168
+
169
+
170
+ class NodeRead(NodeBase):
171
+ """Settings for a node that reads data from a file."""
172
+
173
+ received_file: ReceivedTable
174
+
175
+
176
+ class NodeSelect(NodeSingleInput):
177
+ """Settings for a node that selects, renames, and reorders columns."""
178
+
179
+ keep_missing: bool = True
180
+ select_input: list[Any] = Field(default_factory=list)
181
+ sorted_by: str | None = "none"
182
+
183
+
184
+ class NodeFilter(NodeSingleInput):
185
+ """Settings for a node that filters rows based on a condition."""
186
+
187
+ filter_input: Any = None
188
+
189
+
190
+ class NodeFormula(NodeSingleInput):
191
+ """Settings for a node that applies a formula to create/modify a column."""
192
+
193
+ function: Any = None
194
+
195
+
196
+ class NodeJoin(NodeMultiInput):
197
+ """Settings for a node that performs a standard SQL-style join."""
198
+
199
+ auto_generate_selection: bool = True
200
+ verify_integrity: bool = True
201
+ join_input: Any = None
202
+ auto_keep_all: bool = True
203
+ auto_keep_right: bool = True
204
+ auto_keep_left: bool = True
205
+
206
+
207
+ class NodeCrossJoin(NodeMultiInput):
208
+ """Settings for a node that performs a cross join."""
209
+
210
+ auto_generate_selection: bool = True
211
+ verify_integrity: bool = True
212
+ cross_join_input: Any = None
213
+ auto_keep_all: bool = True
214
+ auto_keep_right: bool = True
215
+ auto_keep_left: bool = True
216
+
217
+
218
+ class NodeFuzzyMatch(NodeMultiInput):
219
+ """Settings for a node that performs a fuzzy join."""
220
+
221
+ auto_generate_selection: bool = True
222
+ verify_integrity: bool = True
223
+ join_input: Any = None # FuzzyMatchInput
224
+ auto_keep_all: bool = True
225
+ auto_keep_right: bool = True
226
+ auto_keep_left: bool = True
227
+
228
+
229
+ class NodePolarsCode(NodeMultiInput):
230
+ """Settings for a node that executes arbitrary Polars code."""
231
+
232
+ polars_code_input: Any = None
233
+
234
+
235
+ class NodeOutput(NodeSingleInput):
236
+ """Settings for a node that writes its input to a file."""
237
+
238
+ output_settings: OutputSettings
239
+
240
+
241
+ class NodeGroupBy(NodeSingleInput):
242
+ """Settings for a node that performs a group-by and aggregation."""
243
+
244
+ groupby_input: Any = None
245
+
246
+
247
+ class NodeSort(NodeSingleInput):
248
+ """Settings for a node that sorts the data."""
249
+
250
+ sort_input: list[Any] = Field(default_factory=list)
251
+
252
+
253
+ class NodeUnion(NodeMultiInput):
254
+ """Settings for a node that concatenates multiple inputs."""
255
+
256
+ union_input: Any = None
257
+
258
+
259
+ class NodeUnique(NodeSingleInput):
260
+ """Settings for a node that returns unique rows."""
261
+
262
+ unique_input: Any = None
263
+
264
+
265
+ class NodePivot(NodeSingleInput):
266
+ """Settings for a node that pivots data."""
267
+
268
+ pivot_input: Any = None
269
+ output_fields: list[MinimalFieldInfo] | None = None
270
+
271
+
272
+ class NodeUnpivot(NodeSingleInput):
273
+ """Settings for a node that unpivots data."""
274
+
275
+ unpivot_input: Any = None
276
+
277
+
278
+ class NodeRecordId(NodeSingleInput):
279
+ """Settings for adding a record ID column."""
280
+
281
+ record_id_input: Any = None
282
+
283
+
284
+ class NodeTextToRows(NodeSingleInput):
285
+ """Settings for splitting text into rows."""
286
+
287
+ text_to_rows_input: Any = None
288
+
289
+
290
+ class NodeGraphSolver(NodeSingleInput):
291
+ """Settings for graph-solving operations."""
292
+
293
+ graph_solver_input: Any = None
294
+
295
+
296
+ class NodeSample(NodeSingleInput):
297
+ """Settings for sampling data."""
298
+
299
+ sample_size: int = 1000
300
+
301
+
302
+ class NodePromise(NodeBase):
303
+ """A placeholder node not yet configured."""
304
+
305
+ is_setup: bool = False
306
+ node_type: str = ""
307
+
308
+
309
+ class DatabaseConnection(BaseModel):
310
+ """Defines database connection parameters."""
311
+
312
+ database_type: str = "postgresql"
313
+ username: str | None = None
314
+ password_ref: str | None = None
315
+ host: str | None = None
316
+ port: int | None = None
317
+ database: str | None = None
318
+ url: str | None = None
319
+
320
+
321
+ class DatabaseSettings(BaseModel):
322
+ """Defines settings for reading from a database."""
323
+
324
+ connection_mode: str | None = "inline"
325
+ database_connection: DatabaseConnection | None = None
326
+ database_connection_name: str | None = None
327
+ schema_name: str | None = None
328
+ table_name: str | None = None
329
+ query: str | None = None
330
+ query_mode: str = "table"
331
+
332
+
333
+ class NodeDatabaseReader(NodeBase):
334
+ """Settings for reading from a database."""
335
+
336
+ database_settings: DatabaseSettings
337
+ fields: list[MinimalFieldInfo] | None = None
338
+
339
+
340
+ class NodeInformation(BaseModel):
341
+ """Stores the state and configuration of a node instance."""
342
+
343
+ id: int | None = None
344
+ type: str | None = None
345
+ is_setup: bool | None = None
346
+ description: str | None = ""
347
+ x_position: int | None = 0
348
+ y_position: int | None = 0
349
+ left_input_id: int | None = None
350
+ right_input_id: int | None = None
351
+ input_ids: list[int] | None = Field(default_factory=lambda: [-1])
352
+ outputs: list[int] | None = Field(default_factory=lambda: [-1])
353
+ setting_input: Any | None = None
354
+
355
+
356
+ class FlowInformation(BaseModel):
357
+ """Represents the complete state of a flow."""
358
+
359
+ flow_id: int
360
+ flow_name: str | None = ""
361
+ flow_settings: FlowSettings | None = None
362
+ data: dict[int, NodeInformation] = Field(default_factory=dict)
363
+ node_starts: list[int] = Field(default_factory=list)
364
+ node_connections: list[tuple[int, int]] = Field(default_factory=list)
365
+
366
+
367
+ # =============================================================================
368
+ # TRANSFORM SCHEMAS (dataclasses - these changed from @dataclass to BaseModel)
369
+ # =============================================================================
370
+
371
+
372
+ @dataclass
373
+ class SelectInput:
374
+ """Defines how a single column should be selected, renamed, or type-cast."""
375
+
376
+ old_name: str
377
+ original_position: int | None = None
378
+ new_name: str | None = None
379
+ data_type: str | None = None
380
+ data_type_change: bool | None = False
381
+ join_key: bool | None = False
382
+ is_altered: bool | None = False
383
+ position: int | None = None
384
+ is_available: bool | None = True
385
+ keep: bool | None = True
386
+
387
+ def __post_init__(self):
388
+ if self.new_name is None:
389
+ self.new_name = self.old_name
390
+
391
+
392
+ @dataclass
393
+ class FieldInput:
394
+ """Represents a single field with its name and data type."""
395
+
396
+ name: str
397
+ data_type: str | None = None
398
+
399
+
400
+ @dataclass
401
+ class FunctionInput:
402
+ """Defines a formula to be applied."""
403
+
404
+ field: FieldInput = None
405
+ function: str = ""
406
+
407
+
408
+ @dataclass
409
+ class BasicFilter:
410
+ """Defines a simple, single-condition filter."""
411
+
412
+ field: str = ""
413
+ filter_type: str = ""
414
+ filter_value: str = ""
415
+
416
+
417
+ @dataclass
418
+ class FilterInput:
419
+ """Defines the settings for a filter operation."""
420
+
421
+ advanced_filter: str = ""
422
+ basic_filter: BasicFilter = None
423
+ filter_type: str = "basic"
424
+
425
+
426
+ @dataclass
427
+ class SelectInputs:
428
+ """A container for a list of SelectInput objects."""
429
+
430
+ renames: list[SelectInput] = field(default_factory=list)
431
+
432
+ @property
433
+ def old_cols(self) -> set:
434
+ return set(v.old_name for v in self.renames if v.keep)
435
+
436
+ @property
437
+ def new_cols(self) -> set:
438
+ return set(v.new_name for v in self.renames if v.keep)
439
+
440
+
441
+ @dataclass
442
+ class JoinInputs:
443
+ """Extends SelectInputs with functionality specific to join operations."""
444
+
445
+ renames: list[SelectInput] = field(default_factory=list)
446
+
447
+
448
+ @dataclass
449
+ class JoinMap:
450
+ """Defines a single mapping between a left and right column for a join key."""
451
+
452
+ left_col: str = None
453
+ right_col: str = None
454
+
455
+
456
+ @dataclass
457
+ class CrossJoinInput:
458
+ """Defines the settings for a cross join operation."""
459
+
460
+ left_select: Any = None
461
+ right_select: Any = None
462
+
463
+
464
+ @dataclass
465
+ class JoinInput:
466
+ """Defines the settings for a standard SQL-style join."""
467
+
468
+ join_mapping: list[JoinMap] = field(default_factory=list)
469
+ left_select: Any = None
470
+ right_select: Any = None
471
+ how: str = "inner"
472
+
473
+
474
+ @dataclass
475
+ class FuzzyMapping:
476
+ """Defines a fuzzy match column mapping with threshold."""
477
+
478
+ left_col: str = None
479
+ right_col: str = None
480
+ threshold_score: int = 80
481
+ fuzzy_type: str = "levenshtein"
482
+
483
+
484
+ @dataclass
485
+ class FuzzyMatchInput:
486
+ """Extends JoinInput with settings specific to fuzzy matching."""
487
+
488
+ join_mapping: list[FuzzyMapping] = field(default_factory=list)
489
+ left_select: Any = None
490
+ right_select: Any = None
491
+ how: str = "inner"
492
+ aggregate_output: bool = False
493
+
494
+
495
+ @dataclass
496
+ class AggColl:
497
+ """Represents a single aggregation operation."""
498
+
499
+ old_name: str = None
500
+ agg: str = None
501
+ new_name: str | None = None
502
+ output_type: str | None = None
503
+
504
+
505
+ @dataclass
506
+ class GroupByInput:
507
+ """Represents the input for a group by operation."""
508
+
509
+ agg_cols: list[AggColl] = field(default_factory=list)
510
+
511
+
512
+ @dataclass
513
+ class PivotInput:
514
+ """Defines the settings for a pivot operation."""
515
+
516
+ index_columns: list[str] = field(default_factory=list)
517
+ pivot_column: str = None
518
+ value_col: str = None
519
+ aggregations: list[str] = field(default_factory=list)
520
+
521
+
522
+ @dataclass
523
+ class SortByInput:
524
+ """Defines a single sort condition on a column."""
525
+
526
+ column: str = None
527
+ how: str = "asc"
528
+
529
+
530
+ @dataclass
531
+ class RecordIdInput:
532
+ """Defines settings for adding a record ID column."""
533
+
534
+ output_column_name: str = "record_id"
535
+ offset: int = 1
536
+ group_by: bool | None = False
537
+ group_by_columns: list[str] | None = field(default_factory=list)
538
+
539
+
540
+ @dataclass
541
+ class TextToRowsInput:
542
+ """Defines settings for splitting a text column into multiple rows."""
543
+
544
+ column_to_split: str = None
545
+ output_column_name: str | None = None
546
+ split_by_fixed_value: bool | None = True
547
+ split_fixed_value: str | None = ","
548
+ split_by_column: str | None = None
549
+
550
+
551
+ @dataclass
552
+ class UnpivotInput:
553
+ """Defines settings for an unpivot operation."""
554
+
555
+ index_columns: list[str] | None = field(default_factory=list)
556
+ value_columns: list[str] | None = field(default_factory=list)
557
+ data_type_selector: Literal["float", "all", "date", "numeric", "string"] | None = None
558
+ data_type_selector_mode: Literal["data_type", "column"] | None = "column"
559
+
560
+ def __post_init__(self):
561
+ if self.index_columns is None:
562
+ self.index_columns = []
563
+ if self.value_columns is None:
564
+ self.value_columns = []
565
+
566
+
567
+ @dataclass
568
+ class UnionInput:
569
+ """Defines settings for a union operation."""
570
+
571
+ mode: Literal["selective", "relaxed"] = "relaxed"
572
+
573
+
574
+ @dataclass
575
+ class UniqueInput:
576
+ """Defines settings for a uniqueness operation."""
577
+
578
+ columns: list[str] | None = None
579
+ strategy: str = "any"
580
+
581
+
582
+ @dataclass
583
+ class GraphSolverInput:
584
+ """Defines settings for a graph-solving operation."""
585
+
586
+ col_from: str = None
587
+ col_to: str = None
588
+ output_column_name: str | None = "graph_group"
589
+
590
+
591
+ @dataclass
592
+ class PolarsCodeInput:
593
+ """A simple container for user-provided Polars code."""
594
+
595
+ polars_code: str = ""
596
+
597
+
598
+ @dataclass
599
+ class SampleInput:
600
+ """Defines settings for sampling rows."""
601
+
602
+ n: int | None = None
603
+ fraction: float | None = None
604
+ with_replacement: bool = False
605
+ shuffle: bool = False
606
+ seed: int | None = None
607
+
608
+
609
+ # =============================================================================
610
+ # CLASS NAME MAPPING for pickle.Unpickler.find_class
611
+ # Maps class names to their legacy implementations for unpickling
612
+ # =============================================================================
613
+
614
+ LEGACY_CLASS_MAP = {
615
+ # Transform schema dataclasses
616
+ "SelectInput": SelectInput,
617
+ "FieldInput": FieldInput,
618
+ "FunctionInput": FunctionInput,
619
+ "BasicFilter": BasicFilter,
620
+ "FilterInput": FilterInput,
621
+ "SelectInputs": SelectInputs,
622
+ "JoinInputs": JoinInputs,
623
+ "JoinMap": JoinMap,
624
+ "CrossJoinInput": CrossJoinInput,
625
+ "JoinInput": JoinInput,
626
+ "FuzzyMapping": FuzzyMapping,
627
+ "FuzzyMatchInput": FuzzyMatchInput,
628
+ "AggColl": AggColl,
629
+ "GroupByInput": GroupByInput,
630
+ "PivotInput": PivotInput,
631
+ "SortByInput": SortByInput,
632
+ "RecordIdInput": RecordIdInput,
633
+ "TextToRowsInput": TextToRowsInput,
634
+ "UnpivotInput": UnpivotInput,
635
+ "UnionInput": UnionInput,
636
+ "UniqueInput": UniqueInput,
637
+ "GraphSolverInput": GraphSolverInput,
638
+ "PolarsCodeInput": PolarsCodeInput,
639
+ "SampleInput": SampleInput,
640
+ # OLD Input/Output schemas (before table_settings)
641
+ "ReceivedTable": ReceivedTable,
642
+ "OutputSettings": OutputSettings,
643
+ "OutputCsvTable": OutputCsvTable,
644
+ "OutputParquetTable": OutputParquetTable,
645
+ "OutputExcelTable": OutputExcelTable,
646
+ "MinimalFieldInfo": MinimalFieldInfo,
647
+ # Flow and Node schemas
648
+ "FlowSettings": FlowSettings,
649
+ "FlowGraphConfig": FlowGraphConfig,
650
+ "FlowInformation": FlowInformation,
651
+ "NodeInformation": NodeInformation,
652
+ "NodeBase": NodeBase,
653
+ "NodeSingleInput": NodeSingleInput,
654
+ "NodeMultiInput": NodeMultiInput,
655
+ "NodeRead": NodeRead,
656
+ "NodeSelect": NodeSelect,
657
+ "NodeFilter": NodeFilter,
658
+ "NodeFormula": NodeFormula,
659
+ "NodeJoin": NodeJoin,
660
+ "NodeCrossJoin": NodeCrossJoin,
661
+ "NodeFuzzyMatch": NodeFuzzyMatch,
662
+ "NodePolarsCode": NodePolarsCode,
663
+ "NodeOutput": NodeOutput,
664
+ "NodeGroupBy": NodeGroupBy,
665
+ "NodeSort": NodeSort,
666
+ "NodeUnion": NodeUnion,
667
+ "NodeUnique": NodeUnique,
668
+ "NodePivot": NodePivot,
669
+ "NodeUnpivot": NodeUnpivot,
670
+ "NodeRecordId": NodeRecordId,
671
+ "NodeTextToRows": NodeTextToRows,
672
+ "NodeGraphSolver": NodeGraphSolver,
673
+ "NodeSample": NodeSample,
674
+ "NodePromise": NodePromise,
675
+ "DatabaseConnection": DatabaseConnection,
676
+ "DatabaseSettings": DatabaseSettings,
677
+ "NodeDatabaseReader": NodeDatabaseReader,
678
+ }
679
+
680
+
681
+ # Export all classes
682
+ __all__ = list(LEGACY_CLASS_MAP.keys()) + ["LEGACY_CLASS_MAP"]