Flowfile 0.3.9__py3-none-any.whl → 0.5.1__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 (201) hide show
  1. flowfile/__init__.py +8 -1
  2. flowfile/api.py +1 -3
  3. flowfile/web/static/assets/{CloudConnectionManager-c97c25f8.js → CloudConnectionManager-0dfba9f2.js} +2 -2
  4. flowfile/web/static/assets/{CloudStorageReader-f1ff509e.js → CloudStorageReader-d5b1b6c9.js} +11 -78
  5. flowfile/web/static/assets/{CloudStorageWriter-034f8b78.js → CloudStorageWriter-00d87aad.js} +12 -79
  6. flowfile/web/static/assets/{CloudStorageWriter-49c9a4b2.css → CloudStorageWriter-b0ee067f.css} +24 -24
  7. flowfile/web/static/assets/ColumnSelector-4685e75d.js +83 -0
  8. flowfile/web/static/assets/ColumnSelector-47996a16.css +10 -0
  9. flowfile/web/static/assets/ContextMenu-23e909da.js +41 -0
  10. flowfile/web/static/assets/{SettingsSection-9c836ecc.css → ContextMenu-4c74eef1.css} +0 -21
  11. flowfile/web/static/assets/ContextMenu-63cfa99b.css +26 -0
  12. flowfile/web/static/assets/ContextMenu-70ae0c79.js +41 -0
  13. flowfile/web/static/assets/ContextMenu-c13f91d0.css +26 -0
  14. flowfile/web/static/assets/ContextMenu-f149cf7c.js +41 -0
  15. flowfile/web/static/assets/{CrossJoin-41efa4cb.css → CrossJoin-1119d18e.css} +18 -18
  16. flowfile/web/static/assets/{CrossJoin-9e156ebe.js → CrossJoin-702a3edd.js} +14 -84
  17. flowfile/web/static/assets/CustomNode-74a37f74.css +32 -0
  18. flowfile/web/static/assets/CustomNode-b1519993.js +211 -0
  19. flowfile/web/static/assets/{DatabaseConnectionSettings-d5c625b3.js → DatabaseConnectionSettings-6f3e4ea5.js} +3 -3
  20. flowfile/web/static/assets/{DatabaseManager-265adc5e.js → DatabaseManager-cf5ef661.js} +2 -2
  21. flowfile/web/static/assets/{DatabaseReader-f50c6558.css → DatabaseReader-ae61773c.css} +0 -27
  22. flowfile/web/static/assets/{DatabaseReader-0b10551e.js → DatabaseReader-d38c7295.js} +14 -114
  23. flowfile/web/static/assets/{DatabaseWriter-c17c6916.js → DatabaseWriter-b04ef46a.js} +13 -74
  24. flowfile/web/static/assets/{ExploreData-5bdae813.css → ExploreData-2d0cf4db.css} +8 -14
  25. flowfile/web/static/assets/ExploreData-5fa10ed8.js +192 -0
  26. flowfile/web/static/assets/{ExternalSource-3a66556c.js → ExternalSource-d39af878.js} +8 -79
  27. flowfile/web/static/assets/{Filter-91ad87e7.js → Filter-9b6d08db.js} +12 -85
  28. flowfile/web/static/assets/{Filter-a9d08ba1.css → Filter-f62091b3.css} +3 -3
  29. flowfile/web/static/assets/{Formula-3c395ab1.js → Formula-6b04fb1d.js} +20 -87
  30. flowfile/web/static/assets/{Formula-29f19d21.css → Formula-bb96803d.css} +4 -4
  31. flowfile/web/static/assets/{FuzzyMatch-6857de82.css → FuzzyMatch-1010f966.css} +42 -42
  32. flowfile/web/static/assets/{FuzzyMatch-2df0d230.js → FuzzyMatch-999521f4.js} +16 -87
  33. flowfile/web/static/assets/{GraphSolver-d285877f.js → GraphSolver-17dd2198.js} +13 -159
  34. flowfile/web/static/assets/GraphSolver-f0cb7bfb.css +22 -0
  35. flowfile/web/static/assets/{GroupBy-0bd1cc6b.js → GroupBy-6b039e18.js} +12 -75
  36. flowfile/web/static/assets/{Unique-b5615727.css → GroupBy-b9505323.css} +8 -8
  37. flowfile/web/static/assets/{Join-5a78a203.js → Join-24d0f113.js} +15 -85
  38. flowfile/web/static/assets/{Join-f45eff22.css → Join-fd79b451.css} +20 -20
  39. flowfile/web/static/assets/{ManualInput-a71b52c6.css → ManualInput-3246a08d.css} +20 -20
  40. flowfile/web/static/assets/{ManualInput-93aef9d6.js → ManualInput-34639209.js} +11 -82
  41. flowfile/web/static/assets/MultiSelect-0e8724a3.js +5 -0
  42. flowfile/web/static/assets/MultiSelect.vue_vue_type_script_setup_true_lang-b0e538c2.js +63 -0
  43. flowfile/web/static/assets/NumericInput-3d63a470.js +5 -0
  44. flowfile/web/static/assets/NumericInput.vue_vue_type_script_setup_true_lang-e0edeccc.js +35 -0
  45. flowfile/web/static/assets/Output-283fe388.css +37 -0
  46. flowfile/web/static/assets/{Output-411ecaee.js → Output-edea9802.js} +62 -273
  47. flowfile/web/static/assets/{Pivot-89db4b04.js → Pivot-61d19301.js} +14 -138
  48. flowfile/web/static/assets/Pivot-cf333e3d.css +22 -0
  49. flowfile/web/static/assets/PivotValidation-891ddfb0.css +13 -0
  50. flowfile/web/static/assets/PivotValidation-c46cd420.css +13 -0
  51. flowfile/web/static/assets/PivotValidation-de9f43fe.js +61 -0
  52. flowfile/web/static/assets/PivotValidation-f97fec5b.js +61 -0
  53. flowfile/web/static/assets/{PolarsCode-a9f974f8.js → PolarsCode-bc3c9984.js} +13 -80
  54. flowfile/web/static/assets/Read-64a3f259.js +218 -0
  55. flowfile/web/static/assets/Read-e808b239.css +62 -0
  56. flowfile/web/static/assets/RecordCount-3d5039be.js +53 -0
  57. flowfile/web/static/assets/{RecordId-55ae7d36.js → RecordId-597510e0.js} +8 -80
  58. flowfile/web/static/assets/SQLQueryComponent-36cef432.css +27 -0
  59. flowfile/web/static/assets/SQLQueryComponent-df51adbe.js +38 -0
  60. flowfile/web/static/assets/{Sample-b4a18476.js → Sample-4be0a507.js} +8 -77
  61. flowfile/web/static/assets/{SecretManager-b066d13a.js → SecretManager-4839be57.js} +2 -2
  62. flowfile/web/static/assets/{Select-727688dc.js → Select-9b72f201.js} +11 -85
  63. flowfile/web/static/assets/SettingsSection-2e4d03c4.css +21 -0
  64. flowfile/web/static/assets/SettingsSection-5c696bee.css +20 -0
  65. flowfile/web/static/assets/SettingsSection-71e6b7e3.css +21 -0
  66. flowfile/web/static/assets/SettingsSection-7ded385d.js +45 -0
  67. flowfile/web/static/assets/{SettingsSection-695ac487.js → SettingsSection-e1e9c953.js} +2 -40
  68. flowfile/web/static/assets/SettingsSection-f0f75a42.js +53 -0
  69. flowfile/web/static/assets/SingleSelect-6c777aac.js +5 -0
  70. flowfile/web/static/assets/SingleSelect.vue_vue_type_script_setup_true_lang-33e3ff9b.js +62 -0
  71. flowfile/web/static/assets/SliderInput-7cb93e62.js +40 -0
  72. flowfile/web/static/assets/SliderInput-b8fb6a8c.css +4 -0
  73. flowfile/web/static/assets/{GroupBy-ab1ea74b.css → Sort-3643d625.css} +8 -8
  74. flowfile/web/static/assets/{Sort-be3339a8.js → Sort-6cbde21a.js} +12 -97
  75. flowfile/web/static/assets/TextInput-d9a40c11.js +5 -0
  76. flowfile/web/static/assets/TextInput.vue_vue_type_script_setup_true_lang-5896c375.js +32 -0
  77. flowfile/web/static/assets/{TextToRows-c92d1ec2.css → TextToRows-5d2c1190.css} +9 -9
  78. flowfile/web/static/assets/{TextToRows-7b8998da.js → TextToRows-c4fcbf4d.js} +14 -83
  79. flowfile/web/static/assets/ToggleSwitch-4ef91d19.js +5 -0
  80. flowfile/web/static/assets/ToggleSwitch.vue_vue_type_script_setup_true_lang-38478c20.js +31 -0
  81. flowfile/web/static/assets/{UnavailableFields-8b0cb48e.js → UnavailableFields-a03f512c.js} +2 -2
  82. flowfile/web/static/assets/{Union-8d9ac7f9.css → Union-af6c3d9b.css} +6 -6
  83. flowfile/web/static/assets/Union-bfe9b996.js +77 -0
  84. flowfile/web/static/assets/{Unique-af5a80b4.js → Unique-5d023a27.js} +23 -104
  85. flowfile/web/static/assets/{Sort-7ccfa0fe.css → Unique-f9fb0809.css} +8 -8
  86. flowfile/web/static/assets/Unpivot-1e422df3.css +30 -0
  87. flowfile/web/static/assets/{Unpivot-5195d411.js → Unpivot-91cc5354.js} +12 -166
  88. flowfile/web/static/assets/UnpivotValidation-0d240eeb.css +13 -0
  89. flowfile/web/static/assets/UnpivotValidation-7ee2de44.js +51 -0
  90. flowfile/web/static/assets/{ExploreData-18a4fe52.js → VueGraphicWalker-e51b9924.js} +4 -264
  91. flowfile/web/static/assets/VueGraphicWalker-ed5ab88b.css +6 -0
  92. flowfile/web/static/assets/{api-cb00cce6.js → api-c1bad5ca.js} +1 -1
  93. flowfile/web/static/assets/{api-023d1733.js → api-cf1221f0.js} +1 -1
  94. flowfile/web/static/assets/{designer-2197d782.css → designer-8da3ba3a.css} +859 -201
  95. flowfile/web/static/assets/{designer-6c322d8e.js → designer-9633482a.js} +2297 -733
  96. flowfile/web/static/assets/{documentation-4d1fafe1.js → documentation-ca400224.js} +1 -1
  97. flowfile/web/static/assets/{dropDown-0b46dd77.js → dropDown-614b998d.js} +1 -1
  98. flowfile/web/static/assets/{fullEditor-ec4e4f95.js → fullEditor-f7971590.js} +2 -2
  99. flowfile/web/static/assets/{genericNodeSettings-def5879b.js → genericNodeSettings-4fe5f36b.js} +3 -3
  100. flowfile/web/static/assets/{index-681a3ed0.css → index-50508d4d.css} +8 -0
  101. flowfile/web/static/assets/{index-683fc198.js → index-5429bbf8.js} +208 -31
  102. flowfile/web/static/assets/nodeInput-5d0d6b79.js +41 -0
  103. flowfile/web/static/assets/outputCsv-076b85ab.js +86 -0
  104. flowfile/web/static/assets/{Output-48f81019.css → outputCsv-9cc59e0b.css} +0 -143
  105. flowfile/web/static/assets/outputExcel-0fd17dbe.js +56 -0
  106. flowfile/web/static/assets/outputExcel-b41305c0.css +102 -0
  107. flowfile/web/static/assets/outputParquet-b61e0847.js +31 -0
  108. flowfile/web/static/assets/outputParquet-cf8cf3f2.css +4 -0
  109. flowfile/web/static/assets/readCsv-a8bb8b61.js +179 -0
  110. flowfile/web/static/assets/readCsv-c767cb37.css +52 -0
  111. flowfile/web/static/assets/readExcel-67b4aee0.js +201 -0
  112. flowfile/web/static/assets/readExcel-806d2826.css +64 -0
  113. flowfile/web/static/assets/readParquet-48c81530.css +19 -0
  114. flowfile/web/static/assets/readParquet-92ce1dbc.js +23 -0
  115. flowfile/web/static/assets/{secretApi-baceb6f9.js → secretApi-68435402.js} +1 -1
  116. flowfile/web/static/assets/{selectDynamic-de91449a.js → selectDynamic-92e25ee3.js} +7 -7
  117. flowfile/web/static/assets/{selectDynamic-b062bc9b.css → selectDynamic-aa913ff4.css} +16 -16
  118. flowfile/web/static/assets/user-defined-icon-0ae16c90.png +0 -0
  119. flowfile/web/static/assets/{vue-codemirror.esm-dc5e3348.js → vue-codemirror.esm-41b0e0d7.js} +65 -36
  120. flowfile/web/static/assets/{vue-content-loader.es-ba94b82f.js → vue-content-loader.es-2c8e608f.js} +1 -1
  121. flowfile/web/static/index.html +2 -2
  122. {flowfile-0.3.9.dist-info → flowfile-0.5.1.dist-info}/METADATA +5 -3
  123. {flowfile-0.3.9.dist-info → flowfile-0.5.1.dist-info}/RECORD +191 -121
  124. {flowfile-0.3.9.dist-info → flowfile-0.5.1.dist-info}/WHEEL +1 -1
  125. {flowfile-0.3.9.dist-info → flowfile-0.5.1.dist-info}/entry_points.txt +1 -0
  126. flowfile_core/__init__.py +3 -0
  127. flowfile_core/configs/flow_logger.py +5 -13
  128. flowfile_core/configs/node_store/__init__.py +30 -0
  129. flowfile_core/configs/node_store/nodes.py +383 -99
  130. flowfile_core/configs/node_store/user_defined_node_registry.py +193 -0
  131. flowfile_core/configs/settings.py +2 -1
  132. flowfile_core/database/connection.py +5 -21
  133. flowfile_core/fileExplorer/funcs.py +239 -121
  134. flowfile_core/flowfile/analytics/analytics_processor.py +1 -0
  135. flowfile_core/flowfile/code_generator/code_generator.py +62 -64
  136. flowfile_core/flowfile/flow_data_engine/create/funcs.py +73 -56
  137. flowfile_core/flowfile/flow_data_engine/flow_data_engine.py +77 -86
  138. flowfile_core/flowfile/flow_data_engine/flow_file_column/interface.py +4 -0
  139. flowfile_core/flowfile/flow_data_engine/flow_file_column/main.py +19 -34
  140. flowfile_core/flowfile/flow_data_engine/flow_file_column/type_registry.py +36 -0
  141. flowfile_core/flowfile/flow_data_engine/fuzzy_matching/prepare_for_fuzzy_match.py +23 -23
  142. flowfile_core/flowfile/flow_data_engine/join/utils.py +1 -1
  143. flowfile_core/flowfile/flow_data_engine/join/verify_integrity.py +9 -4
  144. flowfile_core/flowfile/flow_data_engine/subprocess_operations/subprocess_operations.py +212 -86
  145. flowfile_core/flowfile/flow_data_engine/utils.py +2 -0
  146. flowfile_core/flowfile/flow_graph.py +240 -54
  147. flowfile_core/flowfile/flow_node/flow_node.py +48 -13
  148. flowfile_core/flowfile/flow_node/models.py +2 -1
  149. flowfile_core/flowfile/handler.py +24 -5
  150. flowfile_core/flowfile/manage/compatibility_enhancements.py +404 -41
  151. flowfile_core/flowfile/manage/io_flowfile.py +394 -0
  152. flowfile_core/flowfile/node_designer/__init__.py +47 -0
  153. flowfile_core/flowfile/node_designer/_type_registry.py +197 -0
  154. flowfile_core/flowfile/node_designer/custom_node.py +371 -0
  155. flowfile_core/flowfile/node_designer/ui_components.py +277 -0
  156. flowfile_core/flowfile/schema_callbacks.py +17 -10
  157. flowfile_core/flowfile/setting_generator/settings.py +15 -10
  158. flowfile_core/main.py +5 -1
  159. flowfile_core/routes/routes.py +73 -30
  160. flowfile_core/routes/user_defined_components.py +55 -0
  161. flowfile_core/schemas/cloud_storage_schemas.py +0 -2
  162. flowfile_core/schemas/input_schema.py +228 -65
  163. flowfile_core/schemas/output_model.py +5 -2
  164. flowfile_core/schemas/schemas.py +153 -35
  165. flowfile_core/schemas/transform_schema.py +1083 -412
  166. flowfile_core/schemas/yaml_types.py +103 -0
  167. flowfile_core/types.py +156 -0
  168. flowfile_core/utils/validate_setup.py +3 -1
  169. flowfile_frame/__init__.py +3 -1
  170. flowfile_frame/flow_frame.py +31 -24
  171. flowfile_frame/flow_frame_methods.py +12 -9
  172. flowfile_worker/__init__.py +9 -35
  173. flowfile_worker/create/__init__.py +3 -21
  174. flowfile_worker/create/funcs.py +68 -56
  175. flowfile_worker/create/models.py +130 -62
  176. flowfile_worker/main.py +5 -2
  177. flowfile_worker/routes.py +52 -13
  178. shared/__init__.py +15 -0
  179. shared/storage_config.py +258 -0
  180. tools/migrate/README.md +56 -0
  181. tools/migrate/__init__.py +12 -0
  182. tools/migrate/__main__.py +131 -0
  183. tools/migrate/legacy_schemas.py +621 -0
  184. tools/migrate/migrate.py +598 -0
  185. tools/migrate/tests/__init__.py +0 -0
  186. tools/migrate/tests/conftest.py +23 -0
  187. tools/migrate/tests/test_migrate.py +627 -0
  188. tools/migrate/tests/test_migration_e2e.py +1010 -0
  189. tools/migrate/tests/test_node_migrations.py +813 -0
  190. flowfile/web/static/assets/GraphSolver-17fd26db.css +0 -68
  191. flowfile/web/static/assets/Pivot-f415e85f.css +0 -35
  192. flowfile/web/static/assets/Read-80dc1675.css +0 -197
  193. flowfile/web/static/assets/Read-c3b1929c.js +0 -701
  194. flowfile/web/static/assets/RecordCount-4e95f98e.js +0 -122
  195. flowfile/web/static/assets/Union-89fd73dc.js +0 -146
  196. flowfile/web/static/assets/Unpivot-246e9bbd.css +0 -77
  197. flowfile/web/static/assets/nodeTitle-a16db7c3.js +0 -227
  198. flowfile/web/static/assets/nodeTitle-f4b12bcb.css +0 -134
  199. flowfile_core/flowfile/manage/open_flowfile.py +0 -135
  200. {flowfile-0.3.9.dist-info → flowfile-0.5.1.dist-info/licenses}/LICENSE +0 -0
  201. /flowfile_core/flowfile/manage/manage_flowfile.py → /tools/__init__.py +0 -0
@@ -0,0 +1,30 @@
1
+ from flowfile_core.configs.node_store.user_defined_node_registry import get_all_nodes_from_standard_location
2
+ from flowfile_core.configs.node_store.nodes import get_all_standard_nodes
3
+ from flowfile_core.schemas.schemas import NodeTemplate
4
+ from flowfile_core.flowfile.node_designer.custom_node import CustomNodeBase
5
+
6
+
7
+ nodes_with_defaults = {'sample', 'sort', 'union', 'select', 'record_count'}
8
+
9
+
10
+ def register_custom_node(node: NodeTemplate):
11
+ nodes_list.append(node)
12
+ node_dict[node.item] = node
13
+
14
+
15
+ def add_to_custom_node_store(custom_node: type[CustomNodeBase]):
16
+ CUSTOM_NODE_STORE[custom_node().item] = custom_node
17
+ if custom_node().item not in node_dict:
18
+ register_custom_node(custom_node().to_node_template())
19
+
20
+
21
+ CUSTOM_NODE_STORE = get_all_nodes_from_standard_location()
22
+ nodes_list, node_dict, node_defaults = get_all_standard_nodes()
23
+
24
+ for custom_node in CUSTOM_NODE_STORE.values():
25
+ register_custom_node(custom_node().to_node_template())
26
+
27
+
28
+ def check_if_has_default_setting(node_item: str):
29
+
30
+ return node_item in nodes_with_defaults
@@ -1,99 +1,383 @@
1
- from typing import List
2
- from flowfile_core.schemas.schemas import NodeTemplate, NodeDefault, TransformTypeLiteral, NodeTypeLiteral
3
-
4
- nodes_list: List[NodeTemplate] = [
5
- NodeTemplate(name='External source', item='external_source', input=0, output=1,
6
- image='external_source.png', node_group='input', prod_ready=False),
7
- NodeTemplate(name='Manual input', item='manual_input', input=0, output=1,
8
- image='manual_input.png', node_group='input'),
9
- NodeTemplate(name='Read data', item='read', input=0, output=1, image='input_data.png', node_group='input'),
10
- NodeTemplate(name='Join', color='#49494970', item='join', input=2, output=1, image='join.png',
11
- node_group='combine'),
12
- NodeTemplate(name='Formula', color='blue', item='formula', input=1, output=1, image='formula.png',
13
- node_group='transform'),
14
- # NodeTemplate(name='Sql editor', color='blue', item='sql_editor', input=1, output=1, image='sql.png'),
15
- NodeTemplate(name='Write data', item='output', input=1, output=0, image='output.png', node_group='output'),
16
- NodeTemplate(name='Select data', item='select', input=1, output=1, image='select.png', node_group='transform'),
17
- NodeTemplate(name='Filter data', item='filter', input=1, output=1, image='filter.png', node_group='transform'),
18
- NodeTemplate(name='Group by', item='group_by', input=1, output=1, image='group_by.png', node_group='aggregate'),
19
- NodeTemplate(name='Fuzzy match', item='fuzzy_match', input=2, output=1, image='fuzzy_match.png',
20
- node_group='combine'),
21
- NodeTemplate(name='Sort data', item='sort', input=1, output=1, image='sort.png', node_group='transform'),
22
- NodeTemplate(name='Add record Id', item='record_id', input=1, output=1, image='record_id.png',
23
- node_group='transform'),
24
- NodeTemplate(name='Take Sample', item='sample', input=1, output=1, image='sample.png', node_group='transform'),
25
- NodeTemplate(name='Explore data', item='explore_data', input=1, output=0,
26
- image='explore_data.png', node_group='output'),
27
- NodeTemplate(name='Pivot data', item='pivot', input=1, output=1, image='pivot.png', node_group='aggregate'),
28
- NodeTemplate(name='Unpivot data', item='unpivot', input=1, output=1, image='unpivot.png', node_group='aggregate'),
29
- NodeTemplate(name='Union data', item='union', input=10, output=1, image='union.png', multi=True,
30
- node_group='combine'),
31
- NodeTemplate(name='Drop duplicates', item='unique', input=1, output=1, image='unique.png', node_group='transform'),
32
- NodeTemplate(name='Graph solver', item='graph_solver', input=1, output=1, image='graph_solver.png',
33
- node_group='combine'),
34
- NodeTemplate(name='Count records', item='record_count', input=1, output=1, image='record_count.png',
35
- node_group='aggregate'),
36
- NodeTemplate(name='Cross join', item='cross_join', input=2, output=1, image='cross_join.png', node_group='combine'),
37
- NodeTemplate(name='Text to rows', item='text_to_rows', input=1, output=1, image='text_to_rows.png',
38
- node_group='transform'),
39
- NodeTemplate(name="Polars code", item="polars_code", input=10, output=1, image='polars_code.png',
40
- node_group='transform', multi=True, can_be_start=True),
41
- NodeTemplate(name="Read from Database", item="database_reader", input=0, output=1, image='database_reader.svg',
42
- node_group='input'),
43
- NodeTemplate(name='Write to Database', item='database_writer', input=1, output=0, image='database_writer.svg',
44
- node_group='output'),
45
- NodeTemplate(name='Read from cloud provider', item='cloud_storage_reader', input=0, output=1,
46
- image='cloud_storage_reader.png', node_group='input'),
47
- NodeTemplate(name='Write to cloud provider', item='cloud_storage_writer', input=1, output=0,
48
- image='cloud_storage_writer.png', node_group='output'),
49
- ]
50
-
51
- nodes_list.sort(key=lambda x: x.name)
52
-
53
- output = ['Explore data', 'Write data', 'Write to Database', 'Write to cloud provider',]
54
- _input = [ 'Manual input', 'Read data', 'External source', 'Read from Database', "Read from cloud provider",]
55
- transform = ['Join', 'Formula', 'Select data', 'Filter data', 'Group by', 'Fuzzy match', 'Sort data', 'Add record Id',
56
- 'Take Sample', 'Pivot data', 'Unpivot data', 'Union data', 'Drop duplicates', 'Graph solver',
57
- 'Count records', 'Cross join', 'Text to rows', 'Polars code']
58
- narrow = ['Select data', 'Filter data', 'Take Sample', 'Formula', 'Read data', 'Union data', 'Polars code']
59
- wide = ['Join', 'Group by', 'Fuzzy match', 'Sort data', 'Pivot data', 'Unpivot data', 'Add record Id',
60
- 'Graph solver', 'Drop duplicates', 'Count records', 'Cross join', 'Text to rows']
61
- other = ['Explore data', 'Write data', 'Manual input', 'Read data', 'External source',
62
- 'Read from Database', 'Write to Database', "Read from cloud provider", 'Write to cloud provider',]
63
- nodes_with_defaults = {'sample', 'sort', 'union', 'select', 'record_count'}
64
-
65
-
66
- def get_node_type(node_name: str) -> NodeTypeLiteral:
67
- if node_name in output:
68
- return 'output'
69
- if node_name in _input:
70
- return 'input'
71
- if node_name in transform:
72
- return 'process'
73
- else:
74
- raise ValueError(f'Node name {node_name} not found in any of the node types')
75
-
76
-
77
- def check_if_has_default_setting(node_item: str):
78
- return node_item in nodes_with_defaults
79
-
80
-
81
- def get_transform_type(node_name: str) -> TransformTypeLiteral:
82
- if node_name in narrow:
83
- return 'narrow'
84
- if node_name in wide:
85
- return 'wide'
86
- if node_name in other:
87
- return 'other'
88
- else:
89
- raise ValueError(f'Node name {node_name} not found in any of the transform types')
90
-
91
-
92
- node_defaults = {node.item: NodeDefault(node_name=node.name,
93
- node_type=get_node_type(node.name),
94
- transform_type=get_transform_type(node.name),
95
- has_default_settings=check_if_has_default_setting(node.item)
96
- ) for node in nodes_list}
97
-
98
- node_dict = {n.item: n for n in nodes_list}
99
- node_dict["polars_lazy_frame"] = NodeTemplate(name='LazyFrame node', item='polars_lazy_frame', input=0, output=1, node_group="special", image="",)
1
+
2
+ from typing import List, Dict
3
+ from flowfile_core.schemas.schemas import NodeTemplate, NodeDefault
4
+
5
+
6
+ def get_all_standard_nodes() -> tuple[List[NodeTemplate], Dict[str, NodeTemplate], Dict[str, NodeDefault]]:
7
+ """
8
+ Initializes and returns the complete list, dict, and defaults for all nodes.
9
+ """
10
+ nodes_list: List[NodeTemplate] = [
11
+ NodeTemplate(
12
+ name='External source',
13
+ item='external_source',
14
+ input=0,
15
+ output=1,
16
+ image='external_source.png',
17
+ node_type="input",
18
+ transform_type="other",
19
+ node_group='input',
20
+ prod_ready=False,
21
+ drawer_title="External Source",
22
+ drawer_intro="Connect to external data sources and APIs"
23
+ ),
24
+
25
+ NodeTemplate(
26
+ name='Manual input',
27
+ item='manual_input',
28
+ input=0,
29
+ output=1,
30
+ transform_type="other",
31
+ node_type="input",
32
+ image='manual_input.png',
33
+ node_group='input',
34
+ drawer_title="Manual Input",
35
+ drawer_intro="Create data directly"
36
+ ),
37
+
38
+ NodeTemplate(
39
+ name='Read data',
40
+ item='read',
41
+ input=0,
42
+ output=1,
43
+ transform_type="other",
44
+ node_type="input",
45
+ image='input_data.png',
46
+ node_group='input',
47
+ drawer_title="Read Data",
48
+ drawer_intro="Load data from CSV, Excel, or Parquet files"
49
+ ),
50
+
51
+ NodeTemplate(
52
+ name='Join',
53
+ item='join',
54
+ input=2,
55
+ output=1,
56
+ transform_type="wide",
57
+ node_type="process",
58
+ image='join.png',
59
+ node_group='combine',
60
+ drawer_title="Join Datasets",
61
+ drawer_intro="Merge two datasets based on matching column values"
62
+ ),
63
+
64
+ NodeTemplate(
65
+ name='Formula',
66
+ item='formula',
67
+ input=1,
68
+ output=1,
69
+ transform_type="narrow",
70
+ node_type="process",
71
+ image='formula.png',
72
+ node_group='transform',
73
+ drawer_title="Formula Editor",
74
+ drawer_intro="Create or modify columns using custom expressions"
75
+ ),
76
+
77
+ NodeTemplate(
78
+ name='Write data',
79
+ item='output',
80
+ input=1,
81
+ output=0,
82
+ transform_type="other",
83
+ image='output.png',
84
+ node_type="output",
85
+ node_group='output',
86
+ drawer_title="Write Data",
87
+ drawer_intro="Save your data as CSV, Excel, or Parquet files"
88
+ ),
89
+
90
+ NodeTemplate(
91
+ name='Select data',
92
+ item='select',
93
+ input=1,
94
+ output=1,
95
+ transform_type="narrow",
96
+ node_type="process",
97
+ image='select.png',
98
+ node_group='transform',
99
+ drawer_title="Select Columns",
100
+ drawer_intro="Choose, rename, and reorder columns to keep"
101
+ ),
102
+
103
+ NodeTemplate(
104
+ name='Filter data',
105
+ item='filter',
106
+ input=1,
107
+ output=1,
108
+ transform_type="narrow",
109
+ node_type="process",
110
+ image='filter.png',
111
+ node_group='transform',
112
+ drawer_title="Filter Rows",
113
+ drawer_intro="Keep only rows that match your conditions"
114
+ ),
115
+
116
+ NodeTemplate(
117
+ name='Group by',
118
+ item='group_by',
119
+ input=1,
120
+ output=1,
121
+ transform_type="wide",
122
+ node_type="process",
123
+ image='group_by.png',
124
+ node_group='aggregate',
125
+ drawer_title="Group By",
126
+ drawer_intro="Aggregate data by grouping and calculating statistics"
127
+ ),
128
+
129
+ NodeTemplate(
130
+ name='Fuzzy match',
131
+ item='fuzzy_match',
132
+ input=2,
133
+ output=1,
134
+ transform_type="wide",
135
+ image='fuzzy_match.png',
136
+ node_type="process",
137
+ node_group='combine',
138
+ drawer_title="Fuzzy Match",
139
+ drawer_intro="Join datasets based on similar values instead of exact matches"
140
+ ),
141
+
142
+ NodeTemplate(
143
+ name='Sort data',
144
+ item='sort',
145
+ input=1,
146
+ output=1,
147
+ transform_type="wide",
148
+ node_type="process",
149
+ image='sort.png',
150
+ node_group='transform',
151
+ drawer_title="Sort Data",
152
+ drawer_intro="Order your data by one or more columns"
153
+ ),
154
+
155
+ NodeTemplate(
156
+ name='Add record Id',
157
+ item='record_id',
158
+ input=1,
159
+ output=1,
160
+ transform_type="wide",
161
+ node_type="process",
162
+ image='record_id.png',
163
+ node_group='transform',
164
+ drawer_title="Add Record ID",
165
+ drawer_intro="Generate unique identifiers for each row"
166
+ ),
167
+
168
+ NodeTemplate(
169
+ name='Take Sample',
170
+ item='sample',
171
+ input=1,
172
+ output=1,
173
+ transform_type="narrow",
174
+ node_type="process",
175
+ image='sample.png',
176
+ node_group='transform',
177
+ drawer_title="Take Sample",
178
+ drawer_intro="Work with a subset of your data"
179
+ ),
180
+
181
+ NodeTemplate(
182
+ name='Explore data',
183
+ item='explore_data',
184
+ input=1,
185
+ output=0,
186
+ transform_type="other",
187
+ node_type="output",
188
+ image='explore_data.png',
189
+ node_group='output',
190
+ drawer_title="Explore Data",
191
+ drawer_intro="Interactive data exploration and analysis"
192
+ ),
193
+
194
+ NodeTemplate(
195
+ name='Pivot data',
196
+ item='pivot',
197
+ input=1,
198
+ output=1,
199
+ transform_type="wide",
200
+ image='pivot.png',
201
+ node_type="process",
202
+ node_group='aggregate',
203
+ drawer_title="Pivot Data",
204
+ drawer_intro="Convert data from long format to wide format"
205
+ ),
206
+
207
+ NodeTemplate(
208
+ name='Unpivot data',
209
+ item='unpivot',
210
+ input=1,
211
+ output=1,
212
+ transform_type="wide",
213
+ node_type="process",
214
+ image='unpivot.png',
215
+ node_group='aggregate',
216
+ drawer_title="Unpivot Data",
217
+ drawer_intro="Transform data from wide format to long format"
218
+ ),
219
+
220
+ NodeTemplate(
221
+ name='Union data',
222
+ item='union',
223
+ input=10,
224
+ output=1,
225
+ transform_type="narrow",
226
+ node_type="process",
227
+ image='union.png',
228
+ multi=True,
229
+ node_group='combine',
230
+ drawer_title="Union Data",
231
+ drawer_intro="Stack multiple datasets by combining rows"
232
+ ),
233
+
234
+ NodeTemplate(
235
+ name='Drop duplicates',
236
+ item='unique',
237
+ input=1,
238
+ output=1,
239
+ transform_type="wide",
240
+ node_type="process",
241
+ image='unique.png',
242
+ node_group='transform',
243
+ drawer_title="Drop Duplicates",
244
+ drawer_intro="Remove duplicate rows based on selected columns"
245
+ ),
246
+
247
+ NodeTemplate(
248
+ name='Graph solver',
249
+ item='graph_solver',
250
+ input=1,
251
+ output=1,
252
+ transform_type="other",
253
+ node_type="process",
254
+ image='graph_solver.png',
255
+ node_group='combine',
256
+ drawer_title="Graph Solver",
257
+ drawer_intro="Group related records in graph-structured data"
258
+ ),
259
+
260
+ NodeTemplate(
261
+ name='Count records',
262
+ item='record_count',
263
+ input=1,
264
+ output=1,
265
+ transform_type="wide",
266
+ node_type="process",
267
+ image='record_count.png',
268
+ node_group='aggregate',
269
+ drawer_title="Count Records",
270
+ drawer_intro="Calculate the total number of rows"
271
+ ),
272
+
273
+ NodeTemplate(
274
+ name='Cross join',
275
+ item='cross_join',
276
+ input=2,
277
+ output=1,
278
+ transform_type="wide",
279
+ node_type="process",
280
+ image='cross_join.png',
281
+ node_group='combine',
282
+ drawer_title="Cross Join",
283
+ drawer_intro="Create all possible combinations between two datasets"
284
+ ),
285
+
286
+ NodeTemplate(
287
+ name='Text to rows',
288
+ item='text_to_rows',
289
+ input=1,
290
+ output=1,
291
+ transform_type="wide",
292
+ node_type="process",
293
+ image='text_to_rows.png',
294
+ node_group='transform',
295
+ drawer_title="Text to Rows",
296
+ drawer_intro="Split text into multiple rows based on a delimiter"
297
+ ),
298
+
299
+ NodeTemplate(
300
+ name="Polars code",
301
+ item="polars_code",
302
+ input=10,
303
+ output=1,
304
+ transform_type="narrow",
305
+ image='polars_code.png',
306
+ node_group='transform',
307
+ node_type="process",
308
+ multi=True,
309
+ can_be_start=True,
310
+ drawer_title="Polars Code",
311
+ drawer_intro="Write custom Polars DataFrame transformations"
312
+ ),
313
+
314
+ NodeTemplate(
315
+ name="Read from Database",
316
+ item="database_reader",
317
+ input=0,
318
+ output=1,
319
+ node_type="input",
320
+ transform_type="other",
321
+ image='database_reader.svg',
322
+ node_group='input',
323
+ drawer_title="Database Reader",
324
+ drawer_intro="Load data from database tables or queries"
325
+ ),
326
+
327
+ NodeTemplate(
328
+ name='Write to Database',
329
+ item='database_writer',
330
+ input=1,
331
+ output=0,
332
+ transform_type="other",
333
+ node_type="output",
334
+ image='database_writer.svg',
335
+ node_group='output',
336
+ drawer_title="Database Writer",
337
+ drawer_intro="Save data to database tables"
338
+ ),
339
+
340
+ NodeTemplate(
341
+ name='Read from cloud provider',
342
+ item='cloud_storage_reader',
343
+ input=0,
344
+ output=1,
345
+ transform_type="other",
346
+ node_type="input",
347
+ image='cloud_storage_reader.png',
348
+ node_group='input',
349
+ drawer_title="Cloud Storage Reader",
350
+ drawer_intro="Read data from AWS S3 and other cloud storage"
351
+ ),
352
+
353
+ NodeTemplate(
354
+ name='Write to cloud provider',
355
+ item='cloud_storage_writer',
356
+ input=1,
357
+ output=0,
358
+ transform_type="other",
359
+ node_type="output",
360
+ image='cloud_storage_writer.png',
361
+ node_group='output',
362
+ drawer_title="Cloud Storage Writer",
363
+ drawer_intro="Save data to AWS S3 and other cloud storage"
364
+ ),
365
+ ]
366
+ nodes_list.sort(key=lambda x: x.name)
367
+ nodes_with_defaults = {'sample', 'sort', 'union', 'select', 'record_count'}
368
+
369
+ def check_if_has_default_setting(node_item: str):
370
+
371
+ return node_item in nodes_with_defaults
372
+
373
+ node_defaults = {node.item: NodeDefault(node_name=node.name,
374
+ node_type=node.node_type,
375
+ transform_type=node.transform_type,
376
+ has_default_settings=check_if_has_default_setting(node.item)
377
+ ) for node in nodes_list}
378
+ node_dict = {n.item: n for n in nodes_list}
379
+
380
+ node_dict["polars_lazy_frame"] = NodeTemplate(name='LazyFrame node', item='polars_lazy_frame', input=0, output=1,
381
+ node_group="special", image="", node_type="input", transform_type="other",)
382
+
383
+ return nodes_list, node_dict, node_defaults