You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
168 lines
4.8 KiB
168 lines
4.8 KiB
# TODO: Potentially make another package for this
|
|
import json
|
|
import os
|
|
from typing import Any
|
|
import re
|
|
import shutil
|
|
import tempfile
|
|
from swarms.utils.loguru_logger import initialize_logger
|
|
|
|
logger = initialize_logger(log_folder="file_processing")
|
|
|
|
|
|
def check_if_folder_exists(folder_name: str) -> bool:
|
|
"""
|
|
Check if a folder exists at the specified path.
|
|
|
|
Args:
|
|
folder_name (str): The path to the folder to check.
|
|
|
|
Returns:
|
|
bool: True if the folder exists, False otherwise.
|
|
"""
|
|
try:
|
|
return os.path.exists(folder_name) and os.path.isdir(
|
|
folder_name
|
|
)
|
|
except Exception as e:
|
|
logger.error(f"Failed to check if folder exists: {e}")
|
|
return False
|
|
|
|
|
|
def zip_workspace(workspace_path: str, output_filename: str):
|
|
"""
|
|
Zips the specified workspace directory and returns the path to the zipped file.
|
|
Ensure the output_filename does not have .zip extension as it's added by make_archive.
|
|
"""
|
|
try:
|
|
temp_dir = tempfile.mkdtemp()
|
|
# Remove .zip if present in output_filename to avoid duplication
|
|
base_output_path = os.path.join(
|
|
temp_dir, output_filename.replace(".zip", "")
|
|
)
|
|
zip_path = shutil.make_archive(
|
|
base_output_path, "zip", workspace_path
|
|
)
|
|
return zip_path # make_archive already appends .zip
|
|
except Exception as e:
|
|
logger.error(f"Failed to zip workspace: {e}")
|
|
return None
|
|
|
|
|
|
def sanitize_file_path(file_path: str):
|
|
"""
|
|
Cleans and sanitizes the file path to be valid for Windows.
|
|
"""
|
|
try:
|
|
sanitized_path = file_path.replace("`", "").strip()
|
|
# Replace any invalid characters here with an underscore or remove them
|
|
sanitized_path = re.sub(r'[<>:"/\\|?*]', "_", sanitized_path)
|
|
return sanitized_path
|
|
except Exception as e:
|
|
logger.error(f"Failed to sanitize file path: {e}")
|
|
return None
|
|
|
|
|
|
def load_json(json_string: str):
|
|
"""
|
|
Loads a JSON string and returns the corresponding Python object.
|
|
|
|
Args:
|
|
json_string (str): The JSON string to be loaded.
|
|
|
|
Returns:
|
|
object: The Python object representing the JSON data.
|
|
"""
|
|
try:
|
|
json_data = json.loads(json_string)
|
|
return json_data
|
|
except json.JSONDecodeError as e:
|
|
logger.error(f"Failed to decode JSON: {e}")
|
|
return None
|
|
|
|
|
|
def create_file(
|
|
content: str,
|
|
file_path: str,
|
|
):
|
|
"""
|
|
Creates a file with the specified content at the specified file path.
|
|
|
|
Args:
|
|
content (str): The content to be written to the file.
|
|
file_path (str): The path to the file to be created.
|
|
"""
|
|
try:
|
|
with open(file_path, "w") as file:
|
|
file.write(content)
|
|
return file_path
|
|
except Exception as e:
|
|
logger.error(f"Failed to create file: {e}")
|
|
return None
|
|
|
|
|
|
def create_file_in_folder(
|
|
folder_path: str, file_name: str, content: Any
|
|
):
|
|
"""
|
|
Creates a file in the specified folder with the given file name and content.
|
|
|
|
Args:
|
|
folder_path (str): The path of the folder where the file will be created.
|
|
file_name (str): The name of the file to be created.
|
|
content (str): The content to be written to the file.
|
|
|
|
Returns:
|
|
str: The path of the created file.
|
|
"""
|
|
try:
|
|
if not os.path.exists(folder_path):
|
|
os.makedirs(folder_path)
|
|
|
|
# Create the file in the folder
|
|
file_path = os.path.join(folder_path, file_name)
|
|
with open(file_path, "w") as file:
|
|
file.write(content)
|
|
|
|
return file_path
|
|
except Exception as e:
|
|
logger.error(f"Failed to create file in folder: {e}")
|
|
return None
|
|
|
|
|
|
def zip_folders(
|
|
folder1_path: str, folder2_path: str, zip_file_path: str
|
|
):
|
|
"""
|
|
Zip two folders into a single zip file.
|
|
|
|
Args:
|
|
folder1_path (str): Path to the first folder.
|
|
folder2_path (str): Path to the second folder.
|
|
zip_file_path (str): Path to the output zip file.
|
|
|
|
Returns:
|
|
None
|
|
"""
|
|
try:
|
|
# Create a temporary directory
|
|
with tempfile.TemporaryDirectory() as temp_dir:
|
|
# Copy both folders into the temporary directory
|
|
shutil.copytree(
|
|
folder1_path,
|
|
os.path.join(
|
|
temp_dir, os.path.basename(folder1_path)
|
|
),
|
|
)
|
|
shutil.copytree(
|
|
folder2_path,
|
|
os.path.join(
|
|
temp_dir, os.path.basename(folder2_path)
|
|
),
|
|
)
|
|
# Create a zip file that contains the temporary directory
|
|
shutil.make_archive(zip_file_path, "zip", temp_dir)
|
|
except Exception as e:
|
|
logger.error(f"Failed to zip folders: {e}")
|
|
return None
|