Flowfile 0.3.5__py3-none-any.whl → 0.3.7__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.

Potentially problematic release.


This version of Flowfile might be problematic. Click here for more details.

Files changed (145) hide show
  1. flowfile/__init__.py +27 -6
  2. flowfile/api.py +1 -0
  3. flowfile/web/__init__.py +2 -2
  4. flowfile/web/static/assets/CloudConnectionManager-2dfdce2f.css +86 -0
  5. flowfile/web/static/assets/CloudConnectionManager-c20a740f.js +783 -0
  6. flowfile/web/static/assets/CloudStorageReader-29d14fcc.css +143 -0
  7. flowfile/web/static/assets/CloudStorageReader-960b400a.js +437 -0
  8. flowfile/web/static/assets/CloudStorageWriter-49c9a4b2.css +138 -0
  9. flowfile/web/static/assets/CloudStorageWriter-e3decbdd.js +430 -0
  10. flowfile/web/static/assets/{CrossJoin-dfcf7351.js → CrossJoin-d67e2405.js} +8 -8
  11. flowfile/web/static/assets/{DatabaseConnectionSettings-b2afb1d7.js → DatabaseConnectionSettings-a81e0f7e.js} +2 -2
  12. flowfile/web/static/assets/{DatabaseManager-824a49b2.js → DatabaseManager-9ea35e84.js} +2 -2
  13. flowfile/web/static/assets/{DatabaseReader-a48124d8.js → DatabaseReader-9578bfa5.js} +9 -9
  14. flowfile/web/static/assets/{DatabaseWriter-b47cbae2.js → DatabaseWriter-19531098.js} +9 -9
  15. flowfile/web/static/assets/{ExploreData-fdfc45a4.js → ExploreData-40476474.js} +47141 -43697
  16. flowfile/web/static/assets/{ExternalSource-861b0e71.js → ExternalSource-2297ef96.js} +6 -6
  17. flowfile/web/static/assets/{Filter-f87bb897.js → Filter-f211c03a.js} +8 -8
  18. flowfile/web/static/assets/{Formula-b8cefc31.css → Formula-29f19d21.css} +10 -0
  19. flowfile/web/static/assets/{Formula-1e2ed720.js → Formula-4207ea31.js} +75 -9
  20. flowfile/web/static/assets/{FuzzyMatch-b6cc4fdd.js → FuzzyMatch-bf120df0.js} +9 -9
  21. flowfile/web/static/assets/{GraphSolver-6a371f4c.js → GraphSolver-5bb7497a.js} +5 -5
  22. flowfile/web/static/assets/{GroupBy-f7b7f472.js → GroupBy-92c81b65.js} +6 -6
  23. flowfile/web/static/assets/{Join-eec38203.js → Join-4e49a274.js} +23 -15
  24. flowfile/web/static/assets/{Join-41c0f331.css → Join-f45eff22.css} +20 -20
  25. flowfile/web/static/assets/{ManualInput-9aaa46fb.js → ManualInput-90998ae8.js} +106 -34
  26. flowfile/web/static/assets/{ManualInput-ac7b9972.css → ManualInput-a71b52c6.css} +29 -17
  27. flowfile/web/static/assets/{Output-3b2ca045.js → Output-81e3e917.js} +4 -4
  28. flowfile/web/static/assets/{Pivot-a4f5d88f.js → Pivot-a3419842.js} +6 -6
  29. flowfile/web/static/assets/{PolarsCode-49ce444f.js → PolarsCode-72710deb.js} +6 -6
  30. flowfile/web/static/assets/{Read-07acdc9a.js → Read-c4059daf.js} +6 -6
  31. flowfile/web/static/assets/{RecordCount-6a21da56.js → RecordCount-c2b5e095.js} +5 -5
  32. flowfile/web/static/assets/{RecordId-949bdc17.js → RecordId-10baf191.js} +6 -6
  33. flowfile/web/static/assets/{Sample-7afca6e1.js → Sample-3ed9a0ae.js} +5 -5
  34. flowfile/web/static/assets/{SecretManager-b41c029d.js → SecretManager-0d49c0e8.js} +2 -2
  35. flowfile/web/static/assets/{Select-32b28406.js → Select-8a02a0b3.js} +8 -8
  36. flowfile/web/static/assets/{SettingsSection-a0f15a05.js → SettingsSection-4c0f45f5.js} +1 -1
  37. flowfile/web/static/assets/{Sort-fc6ba0e2.js → Sort-f55c9f9d.js} +6 -6
  38. flowfile/web/static/assets/{TextToRows-23127596.js → TextToRows-5dbc2145.js} +8 -8
  39. flowfile/web/static/assets/{UnavailableFields-c42880a3.js → UnavailableFields-a1768e52.js} +2 -2
  40. flowfile/web/static/assets/{Union-39eecc6c.js → Union-f2aefdc9.js} +5 -5
  41. flowfile/web/static/assets/{Unique-a0e8fe61.js → Unique-46b250da.js} +8 -8
  42. flowfile/web/static/assets/{Unpivot-1e2d43f0.js → Unpivot-25ac84cc.js} +5 -5
  43. flowfile/web/static/assets/api-6ef0dcef.js +80 -0
  44. flowfile/web/static/assets/{api-44ca9e9c.js → api-a0abbdc7.js} +1 -1
  45. flowfile/web/static/assets/cloud_storage_reader-aa1415d6.png +0 -0
  46. flowfile/web/static/assets/{designer-267d44f1.js → designer-13eabd83.js} +36 -34
  47. flowfile/web/static/assets/{documentation-6c0810a2.js → documentation-b87e7f6f.js} +1 -1
  48. flowfile/web/static/assets/{dropDown-52790b15.js → dropDown-13564764.js} +1 -1
  49. flowfile/web/static/assets/{fullEditor-e272b506.js → fullEditor-fd2cd6f9.js} +2 -2
  50. flowfile/web/static/assets/{genericNodeSettings-4bdcf98e.js → genericNodeSettings-71e11604.js} +3 -3
  51. flowfile/web/static/assets/{index-e235a8bc.js → index-f6c15e76.js} +59 -22
  52. flowfile/web/static/assets/{nodeTitle-fc3fc4b7.js → nodeTitle-988d9efe.js} +3 -3
  53. flowfile/web/static/assets/{secretApi-cdc2a3fd.js → secretApi-dd636aa2.js} +1 -1
  54. flowfile/web/static/assets/{selectDynamic-96aa82cd.js → selectDynamic-af36165e.js} +3 -3
  55. flowfile/web/static/assets/{vue-codemirror.esm-25e75a08.js → vue-codemirror.esm-2847001e.js} +2 -1
  56. flowfile/web/static/assets/{vue-content-loader.es-6c4b1c24.js → vue-content-loader.es-0371da73.js} +1 -1
  57. flowfile/web/static/index.html +1 -1
  58. {flowfile-0.3.5.dist-info → flowfile-0.3.7.dist-info}/METADATA +9 -4
  59. {flowfile-0.3.5.dist-info → flowfile-0.3.7.dist-info}/RECORD +131 -124
  60. {flowfile-0.3.5.dist-info → flowfile-0.3.7.dist-info}/entry_points.txt +2 -0
  61. flowfile_core/__init__.py +3 -0
  62. flowfile_core/auth/jwt.py +39 -0
  63. flowfile_core/configs/node_store/nodes.py +9 -6
  64. flowfile_core/configs/settings.py +6 -5
  65. flowfile_core/database/connection.py +63 -15
  66. flowfile_core/database/init_db.py +0 -1
  67. flowfile_core/database/models.py +49 -2
  68. flowfile_core/flowfile/code_generator/code_generator.py +472 -17
  69. flowfile_core/flowfile/connection_manager/models.py +1 -1
  70. flowfile_core/flowfile/database_connection_manager/db_connections.py +216 -2
  71. flowfile_core/flowfile/extensions.py +1 -1
  72. flowfile_core/flowfile/flow_data_engine/cloud_storage_reader.py +259 -0
  73. flowfile_core/flowfile/flow_data_engine/create/funcs.py +19 -8
  74. flowfile_core/flowfile/flow_data_engine/flow_data_engine.py +1062 -311
  75. flowfile_core/flowfile/flow_data_engine/flow_file_column/main.py +12 -2
  76. flowfile_core/flowfile/flow_data_engine/fuzzy_matching/settings_validator.py +1 -1
  77. flowfile_core/flowfile/flow_data_engine/join/__init__.py +2 -1
  78. flowfile_core/flowfile/flow_data_engine/join/utils.py +25 -0
  79. flowfile_core/flowfile/flow_data_engine/polars_code_parser.py +3 -1
  80. flowfile_core/flowfile/flow_data_engine/subprocess_operations/subprocess_operations.py +29 -22
  81. flowfile_core/flowfile/flow_data_engine/utils.py +1 -40
  82. flowfile_core/flowfile/flow_graph.py +718 -253
  83. flowfile_core/flowfile/flow_graph_utils.py +2 -2
  84. flowfile_core/flowfile/flow_node/flow_node.py +563 -117
  85. flowfile_core/flowfile/flow_node/models.py +154 -20
  86. flowfile_core/flowfile/flow_node/schema_callback.py +3 -2
  87. flowfile_core/flowfile/handler.py +2 -33
  88. flowfile_core/flowfile/manage/open_flowfile.py +1 -2
  89. flowfile_core/flowfile/sources/external_sources/__init__.py +0 -2
  90. flowfile_core/flowfile/sources/external_sources/factory.py +4 -7
  91. flowfile_core/flowfile/util/calculate_layout.py +0 -2
  92. flowfile_core/flowfile/utils.py +35 -26
  93. flowfile_core/main.py +35 -15
  94. flowfile_core/routes/cloud_connections.py +77 -0
  95. flowfile_core/routes/logs.py +2 -7
  96. flowfile_core/routes/public.py +1 -0
  97. flowfile_core/routes/routes.py +130 -90
  98. flowfile_core/routes/secrets.py +72 -14
  99. flowfile_core/schemas/__init__.py +8 -0
  100. flowfile_core/schemas/cloud_storage_schemas.py +215 -0
  101. flowfile_core/schemas/input_schema.py +121 -71
  102. flowfile_core/schemas/output_model.py +19 -3
  103. flowfile_core/schemas/schemas.py +150 -12
  104. flowfile_core/schemas/transform_schema.py +175 -35
  105. flowfile_core/utils/utils.py +40 -1
  106. flowfile_core/utils/validate_setup.py +41 -0
  107. flowfile_frame/__init__.py +9 -1
  108. flowfile_frame/cloud_storage/frame_helpers.py +39 -0
  109. flowfile_frame/cloud_storage/secret_manager.py +73 -0
  110. flowfile_frame/expr.py +28 -1
  111. flowfile_frame/expr.pyi +76 -61
  112. flowfile_frame/flow_frame.py +481 -208
  113. flowfile_frame/flow_frame.pyi +140 -91
  114. flowfile_frame/flow_frame_methods.py +160 -22
  115. flowfile_frame/group_frame.py +3 -0
  116. flowfile_frame/utils.py +25 -3
  117. flowfile_worker/external_sources/s3_source/main.py +216 -0
  118. flowfile_worker/external_sources/s3_source/models.py +142 -0
  119. flowfile_worker/funcs.py +51 -6
  120. flowfile_worker/models.py +22 -2
  121. flowfile_worker/routes.py +40 -38
  122. flowfile_worker/utils.py +1 -1
  123. test_utils/s3/commands.py +46 -0
  124. test_utils/s3/data_generator.py +292 -0
  125. test_utils/s3/demo_data_generator.py +186 -0
  126. test_utils/s3/fixtures.py +214 -0
  127. flowfile/web/static/assets/AirbyteReader-1ac35765.css +0 -314
  128. flowfile/web/static/assets/AirbyteReader-e08044e5.js +0 -922
  129. flowfile/web/static/assets/dropDownGeneric-60f56a8a.js +0 -72
  130. flowfile/web/static/assets/dropDownGeneric-895680d6.css +0 -10
  131. flowfile_core/flowfile/sources/external_sources/airbyte_sources/airbyte.py +0 -159
  132. flowfile_core/flowfile/sources/external_sources/airbyte_sources/models.py +0 -172
  133. flowfile_core/flowfile/sources/external_sources/airbyte_sources/settings.py +0 -173
  134. flowfile_core/schemas/defaults.py +0 -9
  135. flowfile_core/schemas/external_sources/airbyte_schemas.py +0 -20
  136. flowfile_core/schemas/models.py +0 -193
  137. flowfile_worker/external_sources/airbyte_sources/cache_manager.py +0 -161
  138. flowfile_worker/external_sources/airbyte_sources/main.py +0 -89
  139. flowfile_worker/external_sources/airbyte_sources/models.py +0 -133
  140. flowfile_worker/external_sources/airbyte_sources/settings.py +0 -0
  141. {flowfile-0.3.5.dist-info → flowfile-0.3.7.dist-info}/LICENSE +0 -0
  142. {flowfile-0.3.5.dist-info → flowfile-0.3.7.dist-info}/WHEEL +0 -0
  143. {flowfile_core/flowfile/sources/external_sources/airbyte_sources → flowfile_frame/cloud_storage}/__init__.py +0 -0
  144. {flowfile_core/schemas/external_sources → flowfile_worker/external_sources/s3_source}/__init__.py +0 -0
  145. {flowfile_worker/external_sources/airbyte_sources → test_utils/s3}/__init__.py +0 -0
@@ -1,27 +1,70 @@
1
- from pydantic import BaseModel, field_validator, ConfigDict
2
- from typing import List, Dict, Tuple, Iterable, Optional, Any, Literal
3
-
4
-
1
+ from typing import Optional, List, Dict, Tuple, Any, Literal, Annotated
2
+ from pydantic import BaseModel, field_validator, ConfigDict, Field, StringConstraints
3
+ from flowfile_core.flowfile.utils import create_unique_id
5
4
  ExecutionModeLiteral = Literal['Development', 'Performance']
6
5
  ExecutionLocationsLiteral = Literal['auto', 'local', 'remote']
7
6
 
8
7
 
9
- class FlowSettings(BaseModel):
10
- flow_id: int
8
+ class FlowGraphConfig(BaseModel):
9
+ """
10
+ Configuration model for a flow graph's basic properties.
11
+
12
+ Attributes:
13
+ flow_id (int): Unique identifier for the flow.
14
+ description (Optional[str]): A description of the flow.
15
+ save_location (Optional[str]): The location where the flow is saved.
16
+ name (str): The name of the flow.
17
+ path (str): The file path associated with the flow.
18
+ execution_mode (ExecutionModeLiteral): The mode of execution ('Development' or 'Performance').
19
+ execution_location (ExecutionLocationsLiteral): The location for execution ('auto', 'local', 'remote').
20
+ """
21
+ flow_id: int = Field(default_factory=create_unique_id, description="Unique identifier for the flow.")
11
22
  description: Optional[str] = None
12
23
  save_location: Optional[str] = None
13
- auto_save: bool = False
14
24
  name: str = ''
15
- modified_on: Optional[float] = None
16
- path: str
25
+ path: str = ''
17
26
  execution_mode: ExecutionModeLiteral = 'Performance'
27
+ execution_location: ExecutionLocationsLiteral = "auto"
28
+
29
+
30
+ class FlowSettings(FlowGraphConfig):
31
+ """
32
+ Extends FlowGraphConfig with additional operational settings for a flow.
33
+
34
+ Attributes:
35
+ auto_save (bool): Flag to enable or disable automatic saving.
36
+ modified_on (Optional[float]): Timestamp of the last modification.
37
+ show_detailed_progress (bool): Flag to show detailed progress during execution.
38
+ is_running (bool): Indicates if the flow is currently running.
39
+ is_canceled (bool): Indicates if the flow execution has been canceled.
40
+ """
41
+ auto_save: bool = False
42
+ modified_on: Optional[float] = None
18
43
  show_detailed_progress: bool = True
19
44
  is_running: bool = False
20
45
  is_canceled: bool = False
21
- execution_location: ExecutionLocationsLiteral = "auto"
46
+
47
+ @classmethod
48
+ def from_flow_settings_input(cls, flow_graph_config: FlowGraphConfig):
49
+ """
50
+ Creates a FlowSettings instance from a FlowGraphConfig instance.
51
+
52
+ :param flow_graph_config: The base flow graph configuration.
53
+ :return: A new instance of FlowSettings with data from flow_graph_config.
54
+ """
55
+ return cls.model_validate(flow_graph_config.model_dump())
22
56
 
23
57
 
24
58
  class RawLogInput(BaseModel):
59
+ """
60
+ Schema for a raw log message.
61
+
62
+ Attributes:
63
+ flowfile_flow_id (int): The ID of the flow that generated the log.
64
+ log_message (str): The content of the log message.
65
+ log_type (Literal["INFO", "ERROR"]): The type of log.
66
+ extra (Optional[dict]): Extra context data for the log.
67
+ """
25
68
  flowfile_flow_id: int
26
69
  log_message: str
27
70
  log_type: Literal["INFO", "ERROR"]
@@ -29,6 +72,20 @@ class RawLogInput(BaseModel):
29
72
 
30
73
 
31
74
  class NodeTemplate(BaseModel):
75
+ """
76
+ Defines the template for a node type, specifying its UI and functional characteristics.
77
+
78
+ Attributes:
79
+ name (str): The display name of the node.
80
+ item (str): The unique identifier for the node type.
81
+ input (int): The number of required input connections.
82
+ output (int): The number of output connections.
83
+ image (str): The filename of the icon for the node.
84
+ multi (bool): Whether the node accepts multiple main input connections.
85
+ node_group (str): The category group the node belongs to (e.g., 'input', 'transform').
86
+ prod_ready (bool): Whether the node is considered production-ready.
87
+ can_be_start (bool): Whether the node can be a starting point in a flow.
88
+ """
32
89
  name: str
33
90
  item: str
34
91
  input: int
@@ -41,6 +98,22 @@ class NodeTemplate(BaseModel):
41
98
 
42
99
 
43
100
  class NodeInformation(BaseModel):
101
+ """
102
+ Stores the state and configuration of a specific node instance within a flow.
103
+
104
+ Attributes:
105
+ id (Optional[int]): The unique ID of the node instance.
106
+ type (Optional[str]): The type of the node (e.g., 'join', 'filter').
107
+ is_setup (Optional[bool]): Whether the node has been configured.
108
+ description (Optional[str]): A user-provided description.
109
+ x_position (Optional[int]): The x-coordinate on the canvas.
110
+ y_position (Optional[int]): The y-coordinate on the canvas.
111
+ left_input_id (Optional[int]): The ID of the node connected to the left input.
112
+ right_input_id (Optional[int]): The ID of the node connected to the right input.
113
+ input_ids (Optional[List[int]]): A list of IDs for main input nodes.
114
+ outputs (Optional[List[int]]): A list of IDs for nodes this node outputs to.
115
+ setting_input (Optional[Any]): The specific settings for this node instance.
116
+ """
44
117
  id: Optional[int] = None
45
118
  type: Optional[str] = None
46
119
  is_setup: Optional[bool] = None
@@ -54,15 +127,34 @@ class NodeInformation(BaseModel):
54
127
  setting_input: Optional[Any] = None
55
128
 
56
129
  @property
57
- def data(self):
130
+ def data(self) -> Any:
131
+ """
132
+ Property to access the node's specific settings.
133
+ :return: The settings of the node.
134
+ """
58
135
  return self.setting_input
59
136
 
60
137
  @property
61
- def main_input_ids(self):
138
+ def main_input_ids(self) -> Optional[List[int]]:
139
+ """
140
+ Property to access the main input node IDs.
141
+ :return: A list of main input node IDs.
142
+ """
62
143
  return self.input_ids
63
144
 
64
145
 
65
146
  class FlowInformation(BaseModel):
147
+ """
148
+ Represents the complete state of a flow, including settings, nodes, and connections.
149
+
150
+ Attributes:
151
+ flow_id (int): The unique ID of the flow.
152
+ flow_name (Optional[str]): The name of the flow.
153
+ flow_settings (FlowSettings): The settings for the flow.
154
+ data (Dict[int, NodeInformation]): A dictionary mapping node IDs to their information.
155
+ node_starts (List[int]): A list of starting node IDs.
156
+ node_connections (List[Tuple[int, int]]): A list of tuples representing connections between nodes.
157
+ """
66
158
  flow_id: int
67
159
  flow_name: Optional[str] = ''
68
160
  flow_settings: FlowSettings
@@ -72,16 +164,39 @@ class FlowInformation(BaseModel):
72
164
 
73
165
  @field_validator('flow_name', mode="before")
74
166
  def ensure_string(cls, v):
167
+ """
168
+ Validator to ensure the flow_name is always a string.
169
+ :param v: The value to validate.
170
+ :return: The value as a string, or an empty string if it's None.
171
+ """
75
172
  return str(v) if v is not None else ''
76
173
 
77
174
 
78
175
  class NodeInput(NodeTemplate):
176
+ """
177
+ Represents a node as it is received from the frontend, including position.
178
+
179
+ Attributes:
180
+ id (int): The unique ID of the node instance.
181
+ pos_x (float): The x-coordinate on the canvas.
182
+ pos_y (float): The y-coordinate on the canvas.
183
+ """
79
184
  id: int
80
185
  pos_x: float
81
186
  pos_y: float
82
187
 
83
188
 
84
189
  class NodeEdge(BaseModel):
190
+ """
191
+ Represents a connection (edge) between two nodes in the frontend.
192
+
193
+ Attributes:
194
+ id (str): A unique identifier for the edge.
195
+ source (str): The ID of the source node.
196
+ target (str): The ID of the target node.
197
+ targetHandle (str): The specific input handle on the target node.
198
+ sourceHandle (str): The specific output handle on the source node.
199
+ """
85
200
  model_config = ConfigDict(coerce_numbers_to_str=True)
86
201
  id: str
87
202
  source: str
@@ -91,16 +206,39 @@ class NodeEdge(BaseModel):
91
206
 
92
207
 
93
208
  class VueFlowInput(BaseModel):
209
+ """
210
+
211
+ Represents the complete graph structure from the Vue-based frontend.
212
+
213
+ Attributes:
214
+ node_edges (List[NodeEdge]): A list of all edges in the graph.
215
+ node_inputs (List[NodeInput]): A list of all nodes in the graph.
216
+ """
94
217
  node_edges: List[NodeEdge]
95
218
  node_inputs: List[NodeInput]
96
219
 
97
220
 
221
+ # Type literals for classifying nodes.
98
222
  NodeTypeLiteral = Literal['input', 'output', 'process']
99
223
  TransformTypeLiteral = Literal['narrow', 'wide', 'other']
100
224
 
101
225
 
102
226
  class NodeDefault(BaseModel):
227
+ """
228
+ Defines default properties for a node type.
229
+
230
+ Attributes:
231
+ node_name (str): The name of the node.
232
+ node_type (NodeTypeLiteral): The functional type of the node ('input', 'output', 'process').
233
+ transform_type (TransformTypeLiteral): The data transformation behavior ('narrow', 'wide', 'other').
234
+ has_default_settings (Optional[Any]): Indicates if the node has predefined default settings.
235
+ """
103
236
  node_name: str
104
237
  node_type: NodeTypeLiteral
105
238
  transform_type: TransformTypeLiteral
106
239
  has_default_settings: Optional[Any] = None
240
+
241
+
242
+ # Define SecretRef here if not in a common location
243
+ SecretRef = Annotated[str, StringConstraints(min_length=1, max_length=100),
244
+ Field(description="An ID referencing an encrypted secret.")]