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,69 +1,135 @@
1
1
  # flowframe/__init__.py
2
2
  """A Polars-like API for building ETL graphs."""
3
3
 
4
- from importlib.metadata import version
4
+ from importlib.metadata import PackageNotFoundError, version
5
5
 
6
- # Core classes
7
- from flowfile_frame.flow_frame import FlowFrame # noqa: F401
8
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
+ )
9
49
 
10
- from flowfile_frame.utils import create_flow_graph # noqa: F401
11
-
12
- # Commonly used functions
13
- from flowfile_frame.expr import ( # noqa: F401
14
- col, lit, column,
15
- cum_count, len,
16
- sum, min, max, mean, count, when, implode, last, corr, cov, first
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,
17
55
  )
18
56
 
19
- from flowfile_frame.lazy import (fold)
57
+ # Database I/O
58
+ from flowfile_frame.database import (
59
+ create_database_connection,
60
+ create_database_connection_if_not_exists,
61
+ del_database_connection,
62
+ get_all_available_database_connections,
63
+ get_database_connection_by_name,
64
+ read_database,
65
+ write_database,
66
+ )
20
67
 
21
- # Selector utilities
22
- from flowfile_frame.selectors import ( # noqa: F401
23
- numeric, float_, integer, string, temporal,
24
- datetime, date, time, duration, boolean,
25
- categorical, object_, list_, struct, all_,
26
- by_dtype, contains, starts_with, ends_with, matches
68
+ # Commonly used functions
69
+ from flowfile_frame.expr import ( # noqa: F401
70
+ col,
71
+ column,
72
+ corr,
73
+ count,
74
+ cov,
75
+ cum_count,
76
+ first,
77
+ implode,
78
+ last,
79
+ len,
80
+ lit,
81
+ max,
82
+ mean,
83
+ min,
84
+ sum,
85
+ when,
27
86
  )
28
87
 
29
- from flowfile_frame.series import Series
88
+ # Core classes
89
+ from flowfile_frame.flow_frame import FlowFrame # noqa: F401
30
90
 
31
91
  # File I/O
32
92
  from flowfile_frame.flow_frame_methods import ( # noqa: F401
33
- read_csv, read_parquet, from_dict, concat, scan_csv, scan_parquet, scan_json_from_cloud_storage,
34
- scan_parquet_from_cloud_storage,
93
+ concat,
94
+ from_dict,
95
+ read_csv,
96
+ read_parquet,
97
+ scan_csv,
35
98
  scan_csv_from_cloud_storage,
36
- scan_delta)
37
-
38
- from flowfile_frame.cloud_storage.secret_manager import (del_cloud_storage_connection,
39
- create_cloud_storage_connection,
40
- get_all_available_cloud_storage_connections,
41
- create_cloud_storage_connection_if_not_exists)
42
-
43
- from polars.datatypes import ( # noqa: F401
44
- # Integer types
45
- Int8, Int16, Int32, Int64, Int128,
46
- UInt8, UInt16, UInt32, UInt64,
47
- IntegerType,
48
-
49
- # Float types
50
- Float32, Float64,
51
-
52
- # Other primitive types
53
- Boolean, String, Utf8, Binary, Null,
54
-
55
- # Complex types
56
- List, Array, Struct, Object,
57
-
58
- # Date/time types
59
- Date, Time, Datetime, Duration,
60
- TemporalType,
61
-
62
- # Special types
63
- Categorical, Decimal, Enum, Unknown,
99
+ scan_delta,
100
+ scan_json_from_cloud_storage,
101
+ scan_parquet,
102
+ scan_parquet_from_cloud_storage,
103
+ )
104
+ from flowfile_frame.lazy import fold
64
105
 
65
- # Type classes
66
- DataType, DataTypeClass, Field
106
+ # Selector utilities
107
+ from flowfile_frame.selectors import ( # noqa: F401
108
+ all_,
109
+ boolean,
110
+ by_dtype,
111
+ categorical,
112
+ contains,
113
+ date,
114
+ datetime,
115
+ duration,
116
+ ends_with,
117
+ float_,
118
+ integer,
119
+ list_,
120
+ matches,
121
+ numeric,
122
+ object_,
123
+ starts_with,
124
+ string,
125
+ struct,
126
+ temporal,
127
+ time,
67
128
  )
129
+ from flowfile_frame.series import Series
130
+ from flowfile_frame.utils import create_flow_graph # noqa: F401
68
131
 
69
- __version__ = version("Flowfile")
132
+ try:
133
+ __version__ = version("Flowfile")
134
+ except PackageNotFoundError:
135
+ __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"]
@@ -1,11 +1,14 @@
1
- import polars as pl
1
+ from collections.abc import Callable
2
2
  from functools import wraps
3
- from typing import Callable, TypeVar, Type
4
- from flowfile_frame.utils import _get_function_source
3
+ from typing import TypeVar
4
+
5
+ import polars as pl
6
+
5
7
  from flowfile_frame.config import logger
8
+ from flowfile_frame.utils import _get_function_source
6
9
 
7
- T = TypeVar('T')
8
- ExprT = TypeVar('ExprT', bound='Expr')
10
+ T = TypeVar("T")
11
+ ExprT = TypeVar("ExprT", bound="Expr")
9
12
  PASSTHROUGH_METHODS = {"map_elements", "map_batches"}
10
13
 
11
14
 
@@ -29,12 +32,9 @@ def create_expr_method_wrapper(method_name: str, original_method: Callable) -> C
29
32
 
30
33
  @wraps(original_method)
31
34
  def wrapper(self: Expr, *args, **kwargs):
32
- from flowfile_frame.expr import Expr
33
35
  # Check if we have a valid underlying expression
34
36
  if self.expr is None:
35
- raise ValueError(
36
- f"Cannot call '{method_name}' on Expr with no underlying polars expression."
37
- )
37
+ raise ValueError(f"Cannot call '{method_name}' on Expr with no underlying polars expression.")
38
38
 
39
39
  # Collect function sources and build representations
40
40
  function_sources = []
@@ -47,7 +47,7 @@ def create_expr_method_wrapper(method_name: str, original_method: Callable) -> C
47
47
  # Try to get function source
48
48
  try:
49
49
  source, is_module_level = _get_function_source(arg)
50
- if source and hasattr(arg, '__name__') and arg.__name__ != '<lambda>':
50
+ if source and hasattr(arg, "__name__") and arg.__name__ != "<lambda>":
51
51
  function_sources.append(source)
52
52
  # Use the function name in the representation
53
53
  args_representations.append(arg.__name__)
@@ -65,7 +65,7 @@ def create_expr_method_wrapper(method_name: str, original_method: Callable) -> C
65
65
  # Try to get function source
66
66
  try:
67
67
  source, is_module_level = _get_function_source(value)
68
- if source and hasattr(value, '__name__') and value.__name__ != '<lambda>':
68
+ if source and hasattr(value, "__name__") and value.__name__ != "<lambda>":
69
69
  function_sources.append(source)
70
70
  # Use the function name in the representation
71
71
  kwargs_representations.append(f"{key}={value.__name__}")
@@ -102,16 +102,56 @@ def create_expr_method_wrapper(method_name: str, original_method: Callable) -> C
102
102
 
103
103
  # Methods that typically change the aggregation status or complexity
104
104
  agg_methods = {
105
- "sum", "mean", "min", "max", "median", "first", "last", "std", "var",
106
- "count", "n_unique", "quantile", "implode", "explode"
105
+ "sum",
106
+ "mean",
107
+ "min",
108
+ "max",
109
+ "median",
110
+ "first",
111
+ "last",
112
+ "std",
113
+ "var",
114
+ "count",
115
+ "n_unique",
116
+ "quantile",
117
+ "implode",
118
+ "explode",
107
119
  }
108
120
  # Methods that typically make expressions complex
109
121
  complex_methods = {
110
- "filter", "map", "shift", "fill_null", "fill_nan", "round", "abs", "alias",
111
- "cast", "is_between", "over", "sort", "arg_sort", "arg_unique", "arg_min",
112
- "arg_max", "rolling", "interpolate", "ewm_mean", "ewm_std", "ewm_var",
113
- "backward_fill", "forward_fill", "rank", "diff", "clip", "dot", "mode",
114
- "drop_nulls", "drop_nans", "take", "gather", "filter", "shift_and_fill"
122
+ "filter",
123
+ "map",
124
+ "shift",
125
+ "fill_null",
126
+ "fill_nan",
127
+ "round",
128
+ "abs",
129
+ "alias",
130
+ "cast",
131
+ "is_between",
132
+ "over",
133
+ "sort",
134
+ "arg_sort",
135
+ "arg_unique",
136
+ "arg_min",
137
+ "arg_max",
138
+ "rolling",
139
+ "interpolate",
140
+ "ewm_mean",
141
+ "ewm_std",
142
+ "ewm_var",
143
+ "backward_fill",
144
+ "forward_fill",
145
+ "rank",
146
+ "diff",
147
+ "clip",
148
+ "dot",
149
+ "mode",
150
+ "drop_nulls",
151
+ "drop_nans",
152
+ "take",
153
+ "gather",
154
+ "shift_and_fill",
115
155
  }
116
156
 
117
157
  # Determine new agg_func status
@@ -127,7 +167,7 @@ def create_expr_method_wrapper(method_name: str, original_method: Callable) -> C
127
167
  result_expr=result_expr,
128
168
  is_complex=is_complex,
129
169
  method_name=method_name,
130
- _function_sources=function_sources # Pass function sources
170
+ _function_sources=function_sources, # Pass function sources
131
171
  )
132
172
 
133
173
  # Set the agg_func if needed
@@ -139,7 +179,7 @@ def create_expr_method_wrapper(method_name: str, original_method: Callable) -> C
139
179
  return wrapper
140
180
 
141
181
 
142
- def add_expr_methods(cls: Type[ExprT]) -> Type[ExprT]:
182
+ def add_expr_methods(cls: type[ExprT]) -> type[ExprT]:
143
183
  """
144
184
  Class decorator that adds all polars Expr methods to a custom Expr class.
145
185
 
@@ -160,8 +200,7 @@ def add_expr_methods(cls: Type[ExprT]) -> Type[ExprT]:
160
200
  existing_methods = set(dir(cls))
161
201
 
162
202
  skip_methods = {
163
- name for name in dir(pl.Expr)
164
- if name.startswith('_') or isinstance(getattr(pl.Expr, name, None), property)
203
+ name for name in dir(pl.Expr) if name.startswith("_") or isinstance(getattr(pl.Expr, name, None), property)
165
204
  }
166
205
 
167
206
  # Add all public Expr methods that don't already exist
@@ -193,20 +232,21 @@ def add_expr_methods(cls: Type[ExprT]) -> Type[ExprT]:
193
232
  # Try to get function source
194
233
  try:
195
234
  source, is_module_level = _get_function_source(arg)
196
- if source and hasattr(arg, '__name__') and arg.__name__ != '<lambda>':
197
-
235
+ if source and hasattr(arg, "__name__") and arg.__name__ != "<lambda>":
198
236
  function_sources.append(source)
199
237
  # Use the function name in the representation
200
238
  args_representations.append(arg.__name__)
201
239
  arg.__repr__ = lambda: arg.__name__
202
240
 
203
241
  else:
204
-
205
242
  # Lambda or unnamed function - not convertible
206
243
  logger.warning(
207
- f"Warning: Using anonymous functions in {method_name} is not convertable to UI code")
208
- logger.warning(f"Consider using defined functions (def abc(a, b, c): return ...), "
209
- f"In a separate script")
244
+ f"Warning: Using anonymous functions in {method_name} is not convertable to UI code"
245
+ )
246
+ logger.warning(
247
+ "Consider using defined functions (def abc(a, b, c): return ...), "
248
+ "In a separate script"
249
+ )
210
250
  convertable_to_code = False
211
251
  args_representations.append(repr(arg))
212
252
  except:
@@ -220,7 +260,7 @@ def add_expr_methods(cls: Type[ExprT]) -> Type[ExprT]:
220
260
  # Try to get function source
221
261
  try:
222
262
  source, is_module_level = _get_function_source(value)
223
- if source and hasattr(value, '__name__') and value.__name__ != '<lambda>':
263
+ if source and hasattr(value, "__name__") and value.__name__ != "<lambda>":
224
264
  function_sources.append(source)
225
265
  # Use the function name in the representation
226
266
  kwargs_representations.append(f"{key}={value.__name__}")
@@ -258,7 +298,7 @@ def add_expr_methods(cls: Type[ExprT]) -> Type[ExprT]:
258
298
  is_complex=True,
259
299
  convertable_to_code=convertable_to_code,
260
300
  _function_sources=function_sources, # Pass function sources
261
- **kwargs
301
+ **kwargs,
262
302
  )
263
303
  return result
264
304
 
@@ -271,8 +311,9 @@ def add_expr_methods(cls: Type[ExprT]) -> Type[ExprT]:
271
311
  setattr(cls, name, wrapped_method)
272
312
 
273
313
  overlap = {
274
- name for name in existing_methods
275
- if name in dir(pl.Expr) and not name.startswith('_') and callable(getattr(pl.Expr, name))
314
+ name
315
+ for name in existing_methods
316
+ if name in dir(pl.Expr) and not name.startswith("_") and callable(getattr(pl.Expr, name))
276
317
  }
277
318
  if overlap:
278
319
  logger.debug(f"Preserved existing methods in {cls.__name__}: {', '.join(sorted(overlap))}")
@@ -1,39 +1,43 @@
1
- from typing import Optional, Literal
1
+ from typing import Literal
2
2
 
3
- from polars._typing import (CsvEncoding)
3
+ from polars._typing import CsvEncoding
4
4
 
5
5
  from flowfile_core.flowfile.flow_graph import FlowGraph
6
- from flowfile_core.schemas import input_schema, cloud_storage_schemas
6
+ from flowfile_core.schemas import cloud_storage_schemas, input_schema
7
7
  from flowfile_frame.cloud_storage.secret_manager import get_current_user_id
8
8
  from flowfile_frame.utils import generate_node_id
9
9
 
10
10
 
11
- def add_write_ff_to_cloud_storage(path: str,
12
- flow_graph: Optional[FlowGraph],
13
- depends_on_node_id: int,
14
- *,
15
- connection_name: Optional[str] = None,
16
- write_mode: Literal["overwrite", "append"] = "overwrite",
17
- file_format: Literal["csv", "parquet", "json", "delta"] = "parquet",
18
- csv_delimiter: str = ";",
19
- csv_encoding: CsvEncoding = "utf8",
20
- parquet_compression: Literal["snappy", "gzip", "brotli", "lz4", "zstd"] = "snappy",
21
- description: Optional[str] = None
22
- ) -> int:
11
+ def add_write_ff_to_cloud_storage(
12
+ path: str,
13
+ flow_graph: FlowGraph | None,
14
+ depends_on_node_id: int,
15
+ *,
16
+ connection_name: str | None = None,
17
+ write_mode: Literal["overwrite", "append"] = "overwrite",
18
+ file_format: Literal["csv", "parquet", "json", "delta"] = "parquet",
19
+ csv_delimiter: str = ";",
20
+ csv_encoding: CsvEncoding = "utf8",
21
+ parquet_compression: Literal["snappy", "gzip", "brotli", "lz4", "zstd"] = "snappy",
22
+ description: str | None = None,
23
+ ) -> int:
23
24
  node_id = generate_node_id()
24
25
  flow_id = flow_graph.flow_id
25
26
  settings = input_schema.NodeCloudStorageWriter(
26
27
  flow_id=flow_id,
27
28
  node_id=node_id,
28
- cloud_storage_settings=cloud_storage_schemas.CloudStorageWriteSettings(resource_path=path,
29
- connection_name=connection_name,
30
- file_format=file_format,
31
- write_mode=write_mode,
32
- csv_delimiter=csv_delimiter,
33
- csv_encoding=csv_encoding,
34
- parquet_compression=parquet_compression),
29
+ cloud_storage_settings=cloud_storage_schemas.CloudStorageWriteSettings(
30
+ resource_path=path,
31
+ connection_name=connection_name,
32
+ file_format=file_format,
33
+ write_mode=write_mode,
34
+ csv_delimiter=csv_delimiter,
35
+ csv_encoding=csv_encoding,
36
+ parquet_compression=parquet_compression,
37
+ ),
35
38
  user_id=get_current_user_id(),
36
39
  depending_on_id=depends_on_node_id,
37
- description=description)
40
+ description=description,
41
+ )
38
42
  flow_graph.add_cloud_storage_writer(settings)
39
43
  return node_id
@@ -1,21 +1,17 @@
1
- from typing import List
2
-
3
- from flowfile_core.schemas.cloud_storage_schemas import FullCloudStorageConnection, FullCloudStorageConnectionInterface
4
- from flowfile_core.flowfile.database_connection_manager.db_connections import (store_cloud_connection,
5
- get_all_cloud_connections_interface,
6
- delete_cloud_connection)
1
+ from flowfile_core.auth.jwt import create_access_token, get_current_user_sync
7
2
  from flowfile_core.database.connection import get_db_context
8
- from flowfile_core.auth.jwt import get_current_user_sync, create_access_token
9
- from asyncio import run
3
+ from flowfile_core.flowfile.database_connection_manager.db_connections import (
4
+ delete_cloud_connection,
5
+ get_all_cloud_connections_interface,
6
+ store_cloud_connection,
7
+ )
8
+ from flowfile_core.schemas.cloud_storage_schemas import FullCloudStorageConnection, FullCloudStorageConnectionInterface
10
9
 
11
10
 
12
11
  def get_current_user_id() -> int | None:
13
12
  access_token = create_access_token(data={"sub": "local_user"})
14
13
  with get_db_context() as db:
15
- current_user_id = get_current_user_sync(
16
- access_token,
17
- db
18
- ).id
14
+ current_user_id = get_current_user_sync(access_token, db).id
19
15
  return current_user_id
20
16
 
21
17
 
@@ -32,15 +28,8 @@ def create_cloud_storage_connection(connection: FullCloudStorageConnection) -> N
32
28
  access_token = create_access_token(data={"sub": "local_user"})
33
29
 
34
30
  with get_db_context() as db:
35
- current_user_id = get_current_user_sync(
36
- access_token,
37
- db
38
- ).id
39
- store_cloud_connection(
40
- db,
41
- connection,
42
- current_user_id
43
- )
31
+ current_user_id = get_current_user_sync(access_token, db).id
32
+ store_cloud_connection(db, connection, current_user_id)
44
33
 
45
34
 
46
35
  def create_cloud_storage_connection_if_not_exists(connection: FullCloudStorageConnection) -> None:
@@ -58,12 +47,9 @@ def create_cloud_storage_connection_if_not_exists(connection: FullCloudStorageCo
58
47
  create_cloud_storage_connection(connection)
59
48
 
60
49
 
61
- def get_all_available_cloud_storage_connections() -> List[FullCloudStorageConnectionInterface]:
50
+ def get_all_available_cloud_storage_connections() -> list[FullCloudStorageConnectionInterface]:
62
51
  with get_db_context() as db:
63
- all_connections = get_all_cloud_connections_interface(
64
- db,
65
- get_current_user_id()
66
- )
52
+ all_connections = get_all_cloud_connections_interface(db, get_current_user_id())
67
53
  return all_connections
68
54
 
69
55
 
flowfile_frame/config.py CHANGED
@@ -1,9 +1,6 @@
1
1
  import logging
2
2
 
3
- logging.basicConfig(
4
- level=logging.INFO,
5
- format='[%(levelname)s] %(message)s'
6
- )
3
+ logging.basicConfig(level=logging.INFO, format="[%(levelname)s] %(message)s")
7
4
 
8
5
  # Create and export the logger
9
- logger = logging.getLogger('flow_frame')
6
+ logger = logging.getLogger("flow_frame")
@@ -0,0 +1,36 @@
1
+ """Database module for flowfile_frame.
2
+
3
+ This module provides functions for:
4
+ - Managing database connections (create, list, delete)
5
+ - Reading from databases
6
+ - Writing to databases
7
+ """
8
+
9
+ from flowfile_frame.database.connection_manager import (
10
+ create_database_connection,
11
+ create_database_connection_if_not_exists,
12
+ del_database_connection,
13
+ get_all_available_database_connections,
14
+ get_database_connection_by_name,
15
+ )
16
+ from flowfile_frame.database.frame_helpers import (
17
+ add_read_from_database,
18
+ add_write_to_database,
19
+ read_database,
20
+ write_database,
21
+ )
22
+
23
+ __all__ = [
24
+ # Connection management
25
+ "create_database_connection",
26
+ "create_database_connection_if_not_exists",
27
+ "del_database_connection",
28
+ "get_all_available_database_connections",
29
+ "get_database_connection_by_name",
30
+ # FlowGraph helpers
31
+ "add_read_from_database",
32
+ "add_write_to_database",
33
+ # Direct read/write
34
+ "read_database",
35
+ "write_database",
36
+ ]