Spaces:
Paused
Paused
| from pathlib import Path | |
| import hashlib | |
| import re | |
| from datetime import timedelta | |
| from typing import Optional | |
| def get_gravatar_url(email): | |
| # Trim leading and trailing whitespace from | |
| # an email address and force all characters | |
| # to lower case | |
| address = str(email).strip().lower() | |
| # Create a SHA256 hash of the final string | |
| hash_object = hashlib.sha256(address.encode()) | |
| hash_hex = hash_object.hexdigest() | |
| # Grab the actual image URL | |
| return f"https://www.gravatar.com/avatar/{hash_hex}?d=mp" | |
| def calculate_sha256(file): | |
| sha256 = hashlib.sha256() | |
| # Read the file in chunks to efficiently handle large files | |
| for chunk in iter(lambda: file.read(8192), b""): | |
| sha256.update(chunk) | |
| return sha256.hexdigest() | |
| def calculate_sha256_string(string): | |
| # Create a new SHA-256 hash object | |
| sha256_hash = hashlib.sha256() | |
| # Update the hash object with the bytes of the input string | |
| sha256_hash.update(string.encode("utf-8")) | |
| # Get the hexadecimal representation of the hash | |
| hashed_string = sha256_hash.hexdigest() | |
| return hashed_string | |
| def validate_email_format(email: str) -> bool: | |
| if email.endswith("@localhost"): | |
| return True | |
| return bool(re.match(r"[^@]+@[^@]+\.[^@]+", email)) | |
| def sanitize_filename(file_name): | |
| # Convert to lowercase | |
| lower_case_file_name = file_name.lower() | |
| # Remove special characters using regular expression | |
| sanitized_file_name = re.sub(r"[^\w\s]", "", lower_case_file_name) | |
| # Replace spaces with dashes | |
| final_file_name = re.sub(r"\s+", "-", sanitized_file_name) | |
| return final_file_name | |
| def extract_folders_after_data_docs(path): | |
| # Convert the path to a Path object if it's not already | |
| path = Path(path) | |
| # Extract parts of the path | |
| parts = path.parts | |
| # Find the index of '/data/docs' in the path | |
| try: | |
| index_data_docs = parts.index("data") + 1 | |
| index_docs = parts.index("docs", index_data_docs) + 1 | |
| except ValueError: | |
| return [] | |
| # Exclude the filename and accumulate folder names | |
| tags = [] | |
| folders = parts[index_docs:-1] | |
| for idx, part in enumerate(folders): | |
| tags.append("/".join(folders[: idx + 1])) | |
| return tags | |
| def parse_duration(duration: str) -> Optional[timedelta]: | |
| if duration == "-1" or duration == "0": | |
| return None | |
| # Regular expression to find number and unit pairs | |
| pattern = r"(-?\d+(\.\d+)?)(ms|s|m|h|d|w)" | |
| matches = re.findall(pattern, duration) | |
| if not matches: | |
| raise ValueError("Invalid duration string") | |
| total_duration = timedelta() | |
| for number, _, unit in matches: | |
| number = float(number) | |
| if unit == "ms": | |
| total_duration += timedelta(milliseconds=number) | |
| elif unit == "s": | |
| total_duration += timedelta(seconds=number) | |
| elif unit == "m": | |
| total_duration += timedelta(minutes=number) | |
| elif unit == "h": | |
| total_duration += timedelta(hours=number) | |
| elif unit == "d": | |
| total_duration += timedelta(days=number) | |
| elif unit == "w": | |
| total_duration += timedelta(weeks=number) | |
| return total_duration | |