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

flowfile/api.py CHANGED
@@ -147,9 +147,6 @@ def build_server_command(module_name: str) -> List[str]:
147
147
  Build the appropriate command to start the server based on environment detection.
148
148
  Tries Poetry first if in a Poetry environment, falls back to direct module execution.
149
149
  """
150
- command: List[str] = []
151
-
152
- # Case 1: Check if we're in a Poetry environment
153
150
  if is_poetry_environment():
154
151
  logger.info("Poetry environment detected.")
155
152
  if is_command_available(POETRY_PATH):
@@ -166,17 +163,42 @@ def build_server_command(module_name: str) -> List[str]:
166
163
  else:
167
164
  logger.warning(f"Poetry command not found at '{POETRY_PATH}'. Falling back to Python module.")
168
165
 
169
- # Case 2: Try direct module execution
170
- logger.info(f"Using Python module approach with {module_name}")
171
- command = [
172
- sys.executable,
173
- "-m",
174
- module_name,
175
- "run",
176
- "ui",
177
- "--no-browser",
178
- ]
166
+ # Case 2: Fallback to direct script execution
167
+ logger.info("Falling back to direct script execution.")
168
+ python_parent_dir = Path(sys.executable).parent
169
+ command: List[str]
170
+ scripts_dir = Path(sys.executable).parent
171
+
172
+ if platform.system() == "Windows":
173
+ exe_path = scripts_dir / f"{module_name}.exe"
174
+ script_py_path = scripts_dir / f"{module_name}-script.py"
175
+ plain_script_path = scripts_dir / module_name
176
+
177
+ if exe_path.exists():
178
+ logger.info(f"Using .exe wrapper: {exe_path}")
179
+ command = [str(exe_path), "run", "ui", "--no-browser"]
180
+ elif script_py_path.exists():
181
+ logger.info(f"Using '-script.py' with interpreter: {script_py_path}")
182
+ command = [sys.executable, str(script_py_path), "run", "ui", "--no-browser"]
183
+ elif plain_script_path.exists():
184
+ logger.info(f"Using plain script with interpreter: {plain_script_path}")
185
+ command = [sys.executable, str(plain_script_path), "run", "ui", "--no-browser"]
186
+ else:
187
+ raise FileNotFoundError(
188
+ f"Could not find an executable script for '{module_name}' in '{scripts_dir}'. "
189
+ f"Checked for '{exe_path.name}', '{script_py_path.name}', and '{plain_script_path.name}'. "
190
+ "Ensure the package is installed correctly."
191
+ )
192
+ else:
193
+ # On Unix-like systems, the script in 'bin' is directly executable
194
+ script_path = python_parent_dir / "bin" / module_name
195
+ if not script_path.exists():
196
+ script_path = python_parent_dir / module_name # Fallback for different venv structures
197
+
198
+ logger.info(f"Using direct script execution path: {script_path}")
199
+ command = [str(script_path), "run", "ui", "--no-browser"]
179
200
 
201
+ logger.info(f"Built server command: {command}")
180
202
  return command
181
203
 
182
204
 
@@ -210,7 +232,6 @@ def start_flowfile_server_process(module_name: str = DEFAULT_MODULE_NAME) -> Tup
210
232
  # Build command automatically based on environment detection
211
233
  command = build_server_command(module_name)
212
234
  logger.info(f"Starting server with command: {' '.join(command)}")
213
-
214
235
  try:
215
236
  # Windows-specific subprocess creation
216
237
  if platform.system() == "Windows":
@@ -244,7 +265,7 @@ def start_flowfile_server_process(module_name: str = DEFAULT_MODULE_NAME) -> Tup
244
265
  time.sleep(1)
245
266
  else:
246
267
  logger.error("Failed to start server: API did not become responsive within 60 seconds. "
247
- "Try again or try start service by running\n"
268
+ "Try again or start service by running\n"
248
269
  "flowfile run ui")
249
270
  if _server_process and _server_process.stderr:
250
271
  try:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: Flowfile
3
- Version: 0.3.4
3
+ Version: 0.3.5
4
4
  Summary: Project combining flowfile core (backend) and flowfile_worker (compute offloader) and flowfile_frame (api)
5
5
  Author: Edward van Eechoud
6
6
  Author-email: evaneechoud@gmail.com
@@ -218,7 +218,7 @@ ff.open_graph_in_editor(joined.flow_graph) # opens the graph in the UI!
218
218
 
219
219
  Export your visual flows as standalone Python/Polars code for production use:
220
220
 
221
- ![Code Generation](.github/images/generated_code.png)
221
+ ![Code Generation](https://raw.githubusercontent.com/Edwardvaneechoud/Flowfile/refs/heads/main/.github/images/generated_code.png)
222
222
 
223
223
  Simply click the "Generate code" button in the visual editor to:
224
224
  - Generate clean, readable Python/Polars code
@@ -3,7 +3,7 @@ build_backends/main.py,sha256=hLmfqTeHLSTiwwZ5mUuoLQgtO40Igvl1_4NbnvzWSgI,9912
3
3
  build_backends/main_prd.py,sha256=JR2tYCMWM5ThooQjv5pw6nwVKMQjgsiHgKMhYn9NXWI,6927
4
4
  flowfile/__init__.py,sha256=XitnMG5qDMFiS3Y0iQ-yj1ODlNa59uT2y4IJCcDn0tU,2449
5
5
  flowfile/__main__.py,sha256=cpWeAL9Xw2qHfm52ZCAQzQhjoOAmVFSXPL-8MrnWAxA,2540
6
- flowfile/api.py,sha256=c0IRR03jrOzMuhNMDfiHm0lfLCtPtg3whexc1dUciJc,17130
6
+ flowfile/api.py,sha256=PqlYPJqXqq4z0jW4w1r-rhrdzEX5WfwcMOZ87osOw4Q,18634
7
7
  flowfile/web/__init__.py,sha256=mFAAdo3rQGi3b_fu5FJH69JR0eHWUg44AHW03MuRChQ,5756
8
8
  flowfile/web/static/assets/AirbyteReader-1ac35765.css,sha256=GsNXZRBzBqcgSHWYHFfpQjYnQ1G90hCaWgThLCG80jI,6260
9
9
  flowfile/web/static/assets/AirbyteReader-e08044e5.js,sha256=aqR9n686reSpNrLTYPP4LzzJvopBvE-pAozL24X2V9Q,38789
@@ -160,7 +160,7 @@ flowfile_core/flowfile/analytics/graphic_walker.py,sha256=snYNQUTPZLhtz1egv_rSmo
160
160
  flowfile_core/flowfile/analytics/schemas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
161
161
  flowfile_core/flowfile/analytics/utils.py,sha256=x-FS1ZwQrHLzAfKm1THiQEKeCm_w0vO5dyWgyyIPjLY,487
162
162
  flowfile_core/flowfile/code_generator/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
163
- flowfile_core/flowfile/code_generator/code_generator.py,sha256=z526qAMARoZ-DECh8CQIJYjSbfg8V9g_x6oyS2ZSylY,31048
163
+ flowfile_core/flowfile/code_generator/code_generator.py,sha256=gzzgh8moVBmCqzCaxczVVjIkXASWIfLqcwZnRyLie1w,31015
164
164
  flowfile_core/flowfile/connection_manager/__init__.py,sha256=wLAGuQBA0lgN1tZleYZ32eFeY4UODG46RrclWoEc7hM,134
165
165
  flowfile_core/flowfile/connection_manager/_connection_manager.py,sha256=W9FWRAFUT1c2eHa2QhFpKNWA-Kps63o2vcGAH1zXSeo,2612
166
166
  flowfile_core/flowfile/connection_manager/models.py,sha256=o_2FK7aNdjMHfiGX7hIUz5uslfLar8KIcI_760WprzM,227
@@ -306,8 +306,8 @@ test_utils/__init__.py,sha256=8WwOgIuKw6YtOc1GWR1DqIhQ8BhlLWqsMyQJSpxnzKk,66
306
306
  test_utils/postgres/__init__.py,sha256=y3V_6a9N1Pvm5NIBaA8CFf3i4mvPVY-H1teHA-rg0VU,33
307
307
  test_utils/postgres/commands.py,sha256=4oA8EHW3EqwGkG02HSqEGbXEBGM01sUW5FsyHm86W4k,4347
308
308
  test_utils/postgres/fixtures.py,sha256=kR8UBjQr3pgbe-xM-V8x8VseTHCPv0EmDEzPHl5Qc8Y,13507
309
- flowfile-0.3.4.dist-info/LICENSE,sha256=pCfLAA27jMHReYk_wGiirZxWRRXz_Bm7PVInRCa9P5g,1075
310
- flowfile-0.3.4.dist-info/METADATA,sha256=gHXGI7HyE-ulUETdvvsohYwlRoITjM9m6lGApilgnXQ,8519
311
- flowfile-0.3.4.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
312
- flowfile-0.3.4.dist-info/entry_points.txt,sha256=Q3CEYNk33UaWlA9D-8yXYH0FwjKBsrtNuzzzHxhwnNI,333
313
- flowfile-0.3.4.dist-info/RECORD,,
309
+ flowfile-0.3.5.dist-info/LICENSE,sha256=pCfLAA27jMHReYk_wGiirZxWRRXz_Bm7PVInRCa9P5g,1075
310
+ flowfile-0.3.5.dist-info/METADATA,sha256=r1ddYzejKRpdJghcfhVUffB4b2KHuk9Z5rNV8c2aJT4,8595
311
+ flowfile-0.3.5.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
312
+ flowfile-0.3.5.dist-info/entry_points.txt,sha256=Q3CEYNk33UaWlA9D-8yXYH0FwjKBsrtNuzzzHxhwnNI,333
313
+ flowfile-0.3.5.dist-info/RECORD,,
@@ -509,7 +509,7 @@ class FlowGraphToPolarsConverter:
509
509
  args = ", ".join(arg_list)
510
510
 
511
511
  # Check if the code is just an expression (no assignment)
512
- is_expression = '=' not in code or code.count('=') == 1 and '==' in code
512
+ is_expression = "output_df" not in code
513
513
 
514
514
  # Wrap the code in a function
515
515
  self._add_code(f"# Custom Polars code")