feat: basic implementation

This commit is contained in:
2025-10-03 16:27:21 +01:00
parent c34f8679d1
commit 66c6540294
5 changed files with 116 additions and 2 deletions

View File

@@ -1 +0,0 @@
/home/parker/MyRepos/bluebolt-asset-version-validation/example-files

0
docker/run.sh Normal file → Executable file
View File

8
example-paths.txt Normal file
View File

@@ -0,0 +1,8 @@
/shows/projectX/assets/environment/forest_v001/model/render/forest_beauty_v001.1001.exr
/shows/projectX/assets/environment/forest_v001/model/render/forest_beauty_v001.1002.exr
/shows/projectX/assets/environment/forest_v001/model/render/forest_beauty_v001.1003.exr
/shows/projectX/assets/environment/forest_v001/model/cache/forest_v001.fbx
/shows/projectX/assets/environment/forest_v002/model/render/forest_beauty_v002.1001.exr
/shows/projectX/assets/environment/forest_v002/model/render/forest_beauty_v002.1002.exr
/shows/projectX/assets/environment/forest_v002/model/render/forest_beauty_v002.1003.exr
/shows/projectX/assets/environment/forest_v002/model/cache/forest_v002.fbx

View File

@@ -1,5 +1,112 @@
import argparse
import os.path
import sys
def parse_args() -> argparse.Namespace:
"""
Parses cli arguments.
Returns:
argparse.Namespace: Parsed argument namespace
"""
parser = argparse.ArgumentParser(
prog="bb-asset-validation",
description="This program parses and validates paths in a given directory based on the BlueBolt asset delivery format.",
epilog="If you have any questions let me know at parker@parkerbritt.com"
)
parser.add_argument("--shows-directory", default="/shows", help="Specifies the directory shows are contained within.")
parser.add_argument("--paths-file", help="Specifies a file containing show paths to inspect and validate.")
return parser.parse_args()
def validate_shows_dir(shows_directory: str):
"""
Checks the given show directory is valid.
Arguments:
shows_directory (str): The directory shows are stored within
Returns:
bool: Whether the directory is valid.
"""
# Check path exists
if(not os.path.exists(shows_directory)):
raise ValueError("Designated show path does not exist: " + shows_directory)
def split_path(path):
PATH_DELIMETER = os.path.sep
split_path = path.split(PATH_DELIMETER)
# remove empty values
split_path = [i for i in split_path if i.strip()!=""]
return split_path
def validate_asset_path_structure(parsed_args, asset_path: str):
if(asset_path[0] != "/"):
print(f"\nError for path: {asset_path}\n-------------", file=sys.stderr)
print("Expected absolute asset path, recieved path does not start with '/'\n", file=sys.stderr)
split_asset_path = split_path(os.path.normpath(asset_path))
# check path is prefixed with shows path
# valid_show_path = True
split_shows_path = split_path(os.path.realpath(parsed_args.shows_directory))
valid_show_path = split_shows_path == split_asset_path[:len(split_shows_path)]
if(not valid_show_path):
print(f"\nError for path: {asset_path}\n-------------", file=sys.stderr)
print(f"Path starting with '{split_asset_path[0]}' does not start with expected show directory '{parsed_args.shows_directory}'\n", file=sys.stderr)
else:
print("\n--------------\nGOOD PATH:", asset_path,"\n----------------\n")
split_asset_path_suffix = split_asset_path[len(split_shows_path):]
path_components = {
"project_name" : split_asset_path_suffix[0],
"asset_type" : split_asset_path_suffix[2],
"asset_name" : split_asset_path_suffix[3].split("_")[0],
"task" : split_asset_path_suffix[4],
"version" : split_asset_path_suffix[3].split("_")[1],
"filename" : os.path.splitext(split_asset_path_suffix[6])[0].split("_")[0],
"file_extension" : os.path.splitext(split_asset_path_suffix[6])[1],
}
print(path_components)
new_path = f"/shows/{path_components['project_name']}/staging/delivery/assets/{path_components['asset_type']}_{path_components['asset_name']}/{path_components['task']}_{path_components['version']}/{path_components['filename']}{path_components['file_extension']}"
print("new path:\n", new_path)
def main() -> None: def main() -> None:
print("Hello world") # Parse args
parsed_args = parse_args()
shows_directory = parsed_args.shows_directory
# validate_shows_dir(shows_directory)
if(parsed_args.paths_file):
with open(parsed_args.paths_file, "r") as f:
line = f.readline()
while(line):
line = f.readline()
# clean line
line = line.strip()
# skip empty lines
if(line==""):
continue
print('line:', line)
validate_asset_path_structure(parsed_args, line)
if __name__ == "__main__": if __name__ == "__main__":
main() main()