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,117 @@
1
+ from typing import TypedDict
2
+
3
+ # === Transform Schema YAML Types ===
4
+
5
+
6
+ class BasicFilterYaml(TypedDict, total=False):
7
+ field: str
8
+ operator: str
9
+ value: str
10
+ value2: str # For BETWEEN operator
11
+
12
+
13
+ class FilterInputYaml(TypedDict, total=False):
14
+ mode: str # "basic" or "advanced"
15
+ basic_filter: BasicFilterYaml
16
+ advanced_filter: str
17
+
18
+
19
+ class SelectInputYaml(TypedDict, total=False):
20
+ old_name: str
21
+ new_name: str
22
+ keep: bool
23
+ data_type: str
24
+
25
+
26
+ class JoinInputsYaml(TypedDict):
27
+ select: list[SelectInputYaml]
28
+
29
+
30
+ class JoinMapYaml(TypedDict):
31
+ left_col: str
32
+ right_col: str
33
+
34
+
35
+ class JoinInputYaml(TypedDict):
36
+ join_mapping: list[JoinMapYaml]
37
+ left_select: JoinInputsYaml
38
+ right_select: JoinInputsYaml
39
+ how: str
40
+
41
+
42
+ class CrossJoinInputYaml(TypedDict):
43
+ left_select: JoinInputsYaml
44
+ right_select: JoinInputsYaml
45
+
46
+
47
+ class FuzzyMappingYaml(TypedDict, total=False):
48
+ left_col: str
49
+ right_col: str
50
+ threshold_score: float
51
+ fuzzy_type: str
52
+ perc_unique: float
53
+ output_column_name: str
54
+ valid: bool
55
+
56
+
57
+ class FuzzyMatchInputYaml(TypedDict):
58
+ join_mapping: list[FuzzyMappingYaml]
59
+ left_select: JoinInputsYaml
60
+ right_select: JoinInputsYaml
61
+ how: str
62
+ aggregate_output: bool
63
+
64
+
65
+ # === Input Schema YAML Types ===
66
+
67
+
68
+ class OutputSettingsYaml(TypedDict, total=False):
69
+ name: str
70
+ directory: str
71
+ file_type: str
72
+ write_mode: str
73
+ abs_file_path: str
74
+ fields: list[str]
75
+ table_settings: dict
76
+
77
+
78
+ class NodeSelectYaml(TypedDict):
79
+ cache_results: bool
80
+ keep_missing: bool
81
+ select_input: list[SelectInputYaml]
82
+ sorted_by: str
83
+
84
+
85
+ class NodeJoinYaml(TypedDict):
86
+ cache_results: bool
87
+ auto_generate_selection: bool
88
+ verify_integrity: bool
89
+ join_input: JoinInputYaml
90
+ auto_keep_all: bool
91
+ auto_keep_right: bool
92
+ auto_keep_left: bool
93
+
94
+
95
+ class NodeCrossJoinYaml(TypedDict):
96
+ cache_results: bool
97
+ auto_generate_selection: bool
98
+ verify_integrity: bool
99
+ cross_join_input: CrossJoinInputYaml
100
+ auto_keep_all: bool
101
+ auto_keep_right: bool
102
+ auto_keep_left: bool
103
+
104
+
105
+ class NodeFuzzyMatchYaml(TypedDict):
106
+ cache_results: bool
107
+ auto_generate_selection: bool
108
+ verify_integrity: bool
109
+ join_input: FuzzyMatchInputYaml
110
+ auto_keep_all: bool
111
+ auto_keep_right: bool
112
+ auto_keep_left: bool
113
+
114
+
115
+ class NodeOutputYaml(TypedDict):
116
+ cache_results: bool
117
+ output_settings: OutputSettingsYaml
@@ -1,13 +1,13 @@
1
-
2
1
  from cryptography.fernet import Fernet
2
+ from fastapi.exceptions import HTTPException
3
+ from pydantic import SecretStr
3
4
  from sqlalchemy import and_
4
5
  from sqlalchemy.orm import Session
6
+
7
+ from flowfile_core.auth.models import SecretInput
8
+ from flowfile_core.auth.secrets import get_master_key
5
9
  from flowfile_core.database import models as db_models
6
10
  from flowfile_core.database.connection import get_db_context
7
- from flowfile_core.auth.secrets import get_master_key
8
- from pydantic import SecretStr
9
- from flowfile_core.auth.models import SecretInput
10
- from fastapi.exceptions import HTTPException
11
11
 
12
12
 
13
13
  def encrypt_secret(secret_value):
@@ -24,11 +24,14 @@ def decrypt_secret(encrypted_value) -> SecretStr:
24
24
  return SecretStr(f.decrypt(encrypted_value.encode()).decode())
25
25
 
26
26
 
27
- def get_encrypted_secret(current_user_id: int, secret_name: str) -> str|None:
27
+ def get_encrypted_secret(current_user_id: int, secret_name: str) -> str | None:
28
28
  with get_db_context() as db:
29
29
  user_id = current_user_id
30
- db_secret = db.query(db_models.Secret).filter(and_(db_models.Secret.user_id == user_id,
31
- db_models.Secret.name == secret_name)).first()
30
+ db_secret = (
31
+ db.query(db_models.Secret)
32
+ .filter(and_(db_models.Secret.user_id == user_id, db_models.Secret.name == secret_name))
33
+ .first()
34
+ )
32
35
  if db_secret:
33
36
  return db_secret.encrypted_value
34
37
  else:
@@ -43,7 +46,7 @@ def store_secret(db: Session, secret: SecretInput, user_id: int) -> db_models.Se
43
46
  name=secret.name,
44
47
  encrypted_value=encrypted_value,
45
48
  iv="", # Not used with Fernet
46
- user_id=user_id
49
+ user_id=user_id,
47
50
  )
48
51
  db.add(db_secret)
49
52
  db.commit()
@@ -52,10 +55,11 @@ def store_secret(db: Session, secret: SecretInput, user_id: int) -> db_models.Se
52
55
 
53
56
 
54
57
  def delete_secret(db: Session, secret_name: str, user_id: int) -> None:
55
- db_secret = db.query(db_models.Secret).filter(
56
- db_models.Secret.user_id == user_id,
57
- db_models.Secret.name == secret_name
58
- ).first()
58
+ db_secret = (
59
+ db.query(db_models.Secret)
60
+ .filter(db_models.Secret.user_id == user_id, db_models.Secret.name == secret_name)
61
+ .first()
62
+ )
59
63
 
60
64
  if not db_secret:
61
65
  raise HTTPException(status_code=404, detail="Secret not found")
@@ -18,12 +18,41 @@ Usage:
18
18
  """
19
19
 
20
20
  from enum import Enum
21
- from typing import List, Union
21
+ from typing import Literal, Union
22
+
22
23
  import polars as pl
23
24
 
25
+ DataTypeStr = Literal[
26
+ "Int8",
27
+ "Int16",
28
+ "Int32",
29
+ "Int64",
30
+ "UInt8",
31
+ "UInt16",
32
+ "UInt32",
33
+ "UInt64",
34
+ "Float32",
35
+ "Float64",
36
+ "Decimal",
37
+ "String",
38
+ "Date",
39
+ "Datetime",
40
+ "Time",
41
+ "Duration",
42
+ "Boolean",
43
+ "Binary",
44
+ "List",
45
+ "Struct",
46
+ "Array",
47
+ "Integer",
48
+ "Double",
49
+ "Utf8",
50
+ ]
51
+
24
52
 
25
53
  class TypeGroup(str, Enum):
26
54
  """High-level type groups for column selection."""
55
+
27
56
  Numeric = "Numeric"
28
57
  String = "String"
29
58
  Date = "Date"
@@ -41,6 +70,7 @@ class TypeGroup(str, Enum):
41
70
 
42
71
  class DataType(str, Enum):
43
72
  """Specific data types for fine-grained control."""
73
+
44
74
  # Numeric types
45
75
  Int8 = "Int8"
46
76
  Int16 = "Int16"
@@ -140,7 +170,7 @@ TypeSpec = Union[
140
170
  TypeGroup,
141
171
  DataType,
142
172
  str,
143
- List[Union[TypeGroup, DataType, str, type[pl.DataType], pl.DataType]],
173
+ list[TypeGroup | DataType | str | type[pl.DataType] | pl.DataType],
144
174
  type[pl.DataType],
145
- pl.DataType
175
+ pl.DataType,
146
176
  ]
@@ -1,5 +1,7 @@
1
+ from collections.abc import Callable, Iterator
2
+
1
3
  import pyarrow as pa
2
- from typing import List, Iterator, Tuple, Callable
4
+
3
5
  from flowfile_core.configs import logger
4
6
 
5
7
 
@@ -36,7 +38,7 @@ def open_validated_file(file_path: str, n: int) -> pa.OSFile:
36
38
  logger.error(f"Invalid file_path type: {type(file_path)}")
37
39
  raise TypeError("file_path must be a string")
38
40
  try:
39
- file = pa.OSFile(file_path, 'rb')
41
+ file = pa.OSFile(file_path, "rb")
40
42
  logger.info(f"Successfully opened file: {file_path}")
41
43
  return file
42
44
  except FileNotFoundError:
@@ -112,7 +114,7 @@ def iter_batches(reader: pa.ipc.RecordBatchFileReader, n: int, rows_collected: i
112
114
  break
113
115
 
114
116
 
115
- def collect_batches(reader: pa.ipc.RecordBatchFileReader, n: int) -> Tuple[List[pa.RecordBatch], int]:
117
+ def collect_batches(reader: pa.ipc.RecordBatchFileReader, n: int) -> tuple[list[pa.RecordBatch], int]:
116
118
  """
117
119
  Collect record batches from a reader up to a specified number of rows.
118
120
 
@@ -134,11 +136,10 @@ def collect_batches(reader: pa.ipc.RecordBatchFileReader, n: int) -> Tuple[List[
134
136
  >>> print(f"Collected {row_count} rows in {len(batches)} batches")
135
137
  """
136
138
  logger.debug(f"Collecting batches up to {n} rows")
137
- batches: List[pa.RecordBatch] = []
139
+ batches: list[pa.RecordBatch] = []
138
140
  rows_collected = 0
139
141
 
140
142
  for batch in iter_batches(reader, n, rows_collected):
141
-
142
143
  rows_collected += batch.num_rows
143
144
  logger.debug(f"Collected batch: total rows now {rows_collected}")
144
145
  if rows_collected >= n:
@@ -178,7 +179,7 @@ def read(file_path: str) -> pa.Table:
178
179
  logger.info(f"Reading entire file: {file_path}")
179
180
  with open_validated_file(file_path, 0) as source:
180
181
  reader = create_reader(source)
181
- batches, total_rows = collect_batches(reader, float('inf'))
182
+ batches, total_rows = collect_batches(reader, float("inf"))
182
183
  table = pa.Table.from_batches(batches) # type: ignore
183
184
  logger.info(f"Successfully read {total_rows} rows from {file_path}")
184
185
  return table
@@ -1,13 +1,13 @@
1
1
  import os
2
- import fastexcel
3
- from typing import List
4
2
  from functools import lru_cache
5
3
 
4
+ import fastexcel
5
+
6
6
  from flowfile_core.configs import logger
7
7
 
8
8
 
9
9
  @lru_cache(maxsize=32)
10
- def get_sheet_names(file_path: str) -> List[str] | None:
10
+ def get_sheet_names(file_path: str) -> list[str] | None:
11
11
  if not os.path.exists(file_path):
12
12
  logger.error(f"File does not exist: {file_path}")
13
13
  return
@@ -1,13 +1,13 @@
1
1
  import os
2
- from flowfile_core.schemas.input_schema import NewDirectory, RemoveItem, RemoveItemsInput
3
- from typing import Tuple, Optional
2
+
4
3
  from flowfile_core.configs import logger
4
+ from flowfile_core.schemas.input_schema import NewDirectory, RemoveItem, RemoveItemsInput
5
5
 
6
6
  local_database_connection = None
7
7
 
8
8
 
9
- def create_dir(new_directory: NewDirectory) -> Tuple[bool, Optional[Exception]]:
10
- full_path: str = os.path.join(new_directory.source_path,new_directory.dir_name)
9
+ def create_dir(new_directory: NewDirectory) -> tuple[bool, Exception | None]:
10
+ full_path: str = os.path.join(new_directory.source_path, new_directory.dir_name)
11
11
  try:
12
12
  os.mkdir(full_path)
13
13
  logger.info("Successfully created a new folder")
@@ -16,7 +16,7 @@ def create_dir(new_directory: NewDirectory) -> Tuple[bool, Optional[Exception]]:
16
16
  return False, e
17
17
 
18
18
 
19
- def remove_path(path: str) -> Tuple[bool, Optional[Exception]]:
19
+ def remove_path(path: str) -> tuple[bool, Exception | None]:
20
20
  try:
21
21
  os.remove(path)
22
22
  logger.info(f"Succesfully removed {path}")
@@ -35,11 +35,11 @@ def remove_item(item_to_remove: RemoveItem):
35
35
  os.rmdir(item_to_remove.path)
36
36
 
37
37
 
38
- def remove_paths(remove_items: RemoveItemsInput) -> Tuple[bool, Optional[Exception]]:
38
+ def remove_paths(remove_items: RemoveItemsInput) -> tuple[bool, Exception | None]:
39
39
  try:
40
40
  for path in remove_items.paths:
41
41
  remove_item(path)
42
- logger.info(f'Successfully removed {remove_items.paths}')
42
+ logger.info(f"Successfully removed {remove_items.paths}")
43
43
  return True, None
44
44
  except Exception as e:
45
45
  return False, e
@@ -1,9 +1,9 @@
1
- from flowfile_core.configs import logger
1
+ from functools import wraps
2
2
  from inspect import isfunction
3
+
3
4
  from loky import get_reusable_executor
4
- from functools import wraps
5
- from concurrent.futures import ThreadPoolExecutor
6
- import atexit
5
+
6
+ from flowfile_core.configs import logger
7
7
 
8
8
 
9
9
  # process_executor: Uses loky for process-based parallelism
@@ -13,18 +13,18 @@ def process_executor(wait_on_completion: bool = False, max_workers: int = 12):
13
13
  def executor(f):
14
14
  @wraps(f)
15
15
  def inner(*args, **kwargs):
16
- logger.debug(f'Added task {f.__name__} to a process executor')
17
- logger.debug(f'max_workers: {max_workers}')
16
+ logger.debug(f"Added task {f.__name__} to a process executor")
17
+ logger.debug(f"max_workers: {max_workers}")
18
18
 
19
19
  # Create a new executor with the required number of workers
20
20
  func_executor = get_reusable_executor(max_workers=max_workers, timeout=2, kill_workers=False, reuse=True)
21
21
  r = func_executor.submit(f, *args, **kwargs)
22
22
  if wait_on_completion:
23
23
  result = r.result()
24
- logger.info(f'done executing {f.__name__}')
24
+ logger.info(f"done executing {f.__name__}")
25
25
  return result
26
26
 
27
- logger.info(f'done submitting {f.__name__} to a process executor')
27
+ logger.info(f"done submitting {f.__name__} to a process executor")
28
28
  return r
29
29
 
30
30
  return inner
@@ -34,5 +34,3 @@ def process_executor(wait_on_completion: bool = False, max_workers: int = 12):
34
34
  wait_on_completion = False
35
35
  return executor(f)
36
36
  return executor
37
-
38
-
@@ -1,14 +1,14 @@
1
1
  import re
2
2
  from itertools import chain
3
- from typing import List, Dict
3
+
4
4
 
5
5
  def camel_case_to_snake_case(text: str) -> str:
6
6
  # Use a regular expression to find capital letters and replace them with _ followed by the lowercase letter
7
- transformed_text = re.sub(r'(?<!^)(?=[A-Z])', '_', text).lower()
7
+ transformed_text = re.sub(r"(?<!^)(?=[A-Z])", "_", text).lower()
8
8
  return transformed_text
9
9
 
10
10
 
11
- def ensure_similarity_dicts(datas: List[Dict], respect_order: bool = True):
11
+ def ensure_similarity_dicts(datas: list[dict], respect_order: bool = True):
12
12
  all_cols = (data.keys() for data in datas)
13
13
  if not respect_order:
14
14
  unique_cols = set(chain(*all_cols))
@@ -44,4 +44,4 @@ def standardize_col_dtype(vals):
44
44
  elif int in types and float in types:
45
45
  return vals
46
46
  else:
47
- return [convert_to_string(v) for v in vals]
47
+ return [convert_to_string(v) for v in vals]
@@ -1,11 +1,12 @@
1
1
  """This script runs on run time and checks if all the nodes that are created have a function in the flow_graph as well
2
2
  as have a component in flowfile_frontend"""
3
3
 
4
- from flowfile_core.schemas import input_schema
5
- from flowfile_core.flowfile.flow_graph import FlowGraph
6
- from flowfile_core.configs.node_store import nodes_list, NodeTemplate
7
4
  import inspect
8
5
 
6
+ from flowfile_core.configs.node_store import NodeTemplate, nodes_list
7
+ from flowfile_core.flowfile.flow_graph import FlowGraph
8
+ from flowfile_core.schemas import input_schema
9
+
9
10
 
10
11
  def check_if_node_has_add_function_in_flow_graph(node: NodeTemplate):
11
12
  func_name = "add_" + node.item
@@ -17,7 +18,7 @@ def check_if_node_has_add_function_in_flow_graph(node: NodeTemplate):
17
18
 
18
19
 
19
20
  def check_if_node_has_input_schema_definition(node: NodeTemplate):
20
- if "node"+node.item.replace("_","") not in {k.lower() for k in inspect.getmodule(input_schema).__dict__.keys()}:
21
+ if "node" + node.item.replace("_", "") not in {k.lower() for k in inspect.getmodule(input_schema).__dict__.keys()}:
21
22
  raise ValueError(
22
23
  f"Node {node.name} ({node.item}) does not have a corresponding input schema definition in input_schema.py."
23
24
  "Check if the schema is implemented or if the node item is correct."
@@ -1,67 +1,124 @@
1
1
  # flowframe/__init__.py
2
2
  """A Polars-like API for building ETL graphs."""
3
3
 
4
- # Core classes
5
- from flowfile_frame.flow_frame import FlowFrame # noqa: F401
4
+ from importlib.metadata import PackageNotFoundError, version
5
+
6
6
  from pl_fuzzy_frame_match.models import FuzzyMapping # noqa: F401
7
+ from polars.datatypes import ( # noqa: F401
8
+ Array,
9
+ Binary,
10
+ # Other primitive types
11
+ Boolean,
12
+ # Special types
13
+ Categorical,
14
+ # Type classes
15
+ DataType,
16
+ DataTypeClass,
17
+ # Date/time types
18
+ Date,
19
+ Datetime,
20
+ Decimal,
21
+ Duration,
22
+ Enum,
23
+ Field,
24
+ # Float types
25
+ Float32,
26
+ Float64,
27
+ # Integer types
28
+ Int8,
29
+ Int16,
30
+ Int32,
31
+ Int64,
32
+ Int128,
33
+ IntegerType,
34
+ # Complex types
35
+ List,
36
+ Null,
37
+ Object,
38
+ String,
39
+ Struct,
40
+ TemporalType,
41
+ Time,
42
+ UInt8,
43
+ UInt16,
44
+ UInt32,
45
+ UInt64,
46
+ Unknown,
47
+ Utf8,
48
+ )
7
49
 
8
- from flowfile_frame.utils import create_flow_graph # noqa: F401
50
+ from flowfile_frame.cloud_storage.secret_manager import (
51
+ create_cloud_storage_connection,
52
+ create_cloud_storage_connection_if_not_exists,
53
+ del_cloud_storage_connection,
54
+ get_all_available_cloud_storage_connections,
55
+ )
9
56
 
10
57
  # Commonly used functions
11
58
  from flowfile_frame.expr import ( # noqa: F401
12
- col, lit, column,
13
- cum_count, len,
14
- sum, min, max, mean, count, when, implode, last, corr, cov, first
59
+ col,
60
+ column,
61
+ corr,
62
+ count,
63
+ cov,
64
+ cum_count,
65
+ first,
66
+ implode,
67
+ last,
68
+ len,
69
+ lit,
70
+ max,
71
+ mean,
72
+ min,
73
+ sum,
74
+ when,
15
75
  )
16
76
 
17
- from flowfile_frame.lazy import (fold)
18
-
19
- # Selector utilities
20
- from flowfile_frame.selectors import ( # noqa: F401
21
- numeric, float_, integer, string, temporal,
22
- datetime, date, time, duration, boolean,
23
- categorical, object_, list_, struct, all_,
24
- by_dtype, contains, starts_with, ends_with, matches
25
- )
26
-
27
- from flowfile_frame.series import Series
77
+ # Core classes
78
+ from flowfile_frame.flow_frame import FlowFrame # noqa: F401
28
79
 
29
80
  # File I/O
30
81
  from flowfile_frame.flow_frame_methods import ( # noqa: F401
31
- read_csv, read_parquet, from_dict, concat, scan_csv, scan_parquet, scan_json_from_cloud_storage,
32
- scan_parquet_from_cloud_storage,
82
+ concat,
83
+ from_dict,
84
+ read_csv,
85
+ read_parquet,
86
+ scan_csv,
33
87
  scan_csv_from_cloud_storage,
34
- scan_delta)
35
-
36
- from flowfile_frame.cloud_storage.secret_manager import (del_cloud_storage_connection,
37
- create_cloud_storage_connection,
38
- get_all_available_cloud_storage_connections,
39
- create_cloud_storage_connection_if_not_exists)
40
-
41
- from polars.datatypes import ( # noqa: F401
42
- # Integer types
43
- Int8, Int16, Int32, Int64, Int128,
44
- UInt8, UInt16, UInt32, UInt64,
45
- IntegerType,
46
-
47
- # Float types
48
- Float32, Float64,
49
-
50
- # Other primitive types
51
- Boolean, String, Utf8, Binary, Null,
52
-
53
- # Complex types
54
- List, Array, Struct, Object,
55
-
56
- # Date/time types
57
- Date, Time, Datetime, Duration,
58
- TemporalType,
59
-
60
- # Special types
61
- Categorical, Decimal, Enum, Unknown,
88
+ scan_delta,
89
+ scan_json_from_cloud_storage,
90
+ scan_parquet,
91
+ scan_parquet_from_cloud_storage,
92
+ )
93
+ from flowfile_frame.lazy import fold
62
94
 
63
- # Type classes
64
- DataType, DataTypeClass, Field
95
+ # Selector utilities
96
+ from flowfile_frame.selectors import ( # noqa: F401
97
+ all_,
98
+ boolean,
99
+ by_dtype,
100
+ categorical,
101
+ contains,
102
+ date,
103
+ datetime,
104
+ duration,
105
+ ends_with,
106
+ float_,
107
+ integer,
108
+ list_,
109
+ matches,
110
+ numeric,
111
+ object_,
112
+ starts_with,
113
+ string,
114
+ struct,
115
+ temporal,
116
+ time,
65
117
  )
118
+ from flowfile_frame.series import Series
119
+ from flowfile_frame.utils import create_flow_graph # noqa: F401
66
120
 
67
- __version__ = "0.1.0"
121
+ try:
122
+ __version__ = version("Flowfile")
123
+ except PackageNotFoundError:
124
+ __version__ = "0.5.0"
@@ -2,16 +2,9 @@
2
2
  """Adapters to connect FlowFrame with the flowfile-core library."""
3
3
 
4
4
  # Import from your existing project
5
- from flowfile_core.flowfile.flow_graph import FlowGraph, add_connection
6
5
  from flowfile_core.flowfile.flow_data_engine.flow_data_engine import FlowDataEngine
6
+ from flowfile_core.flowfile.flow_graph import FlowGraph, add_connection
7
7
  from flowfile_core.schemas import input_schema, schemas, transform_schema
8
8
 
9
9
  # Export these for use in FlowFrame
10
- __all__ = [
11
- 'FlowGraph',
12
- 'add_connection',
13
- 'FlowDataEngine',
14
- 'input_schema',
15
- 'schemas',
16
- 'transform_schema'
17
- ]
10
+ __all__ = ["FlowGraph", "add_connection", "FlowDataEngine", "input_schema", "schemas", "transform_schema"]