123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- 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
|