rewrite-to-python: flatten structure
This commit is contained in:
0
src/cli/__init__.py
Normal file
0
src/cli/__init__.py
Normal file
65
src/cli/main.py
Normal file
65
src/cli/main.py
Normal file
@@ -0,0 +1,65 @@
|
||||
import argparse
|
||||
from pathlib import Path
|
||||
|
||||
from .print import pretty_print_marker_data
|
||||
from .validate import validate_marker_data
|
||||
|
||||
from mapcrafter_exporter import generate_mapcrafter_output
|
||||
from bluemap_exporter import generate_bluemap_output
|
||||
|
||||
|
||||
def parse_args():
|
||||
parser = argparse.ArgumentParser(description="Minecraft map data exporter cli")
|
||||
|
||||
subparsers = parser.add_subparsers(dest="command")
|
||||
|
||||
ebh_parser = subparsers.add_parser(
|
||||
"export-bluemap", help="Export map data to Bluemap format"
|
||||
)
|
||||
ebh_parser.add_argument(
|
||||
"--output-dir",
|
||||
help="Output dir",
|
||||
type=Path,
|
||||
metavar="DIR",
|
||||
default=Path("bluemap"),
|
||||
)
|
||||
|
||||
emj_parser = subparsers.add_parser(
|
||||
"export-mapcrafter", help="Export map data to Mapcrafter format"
|
||||
)
|
||||
emj_parser.add_argument(
|
||||
"--output-dir",
|
||||
help="Output dir",
|
||||
type=Path,
|
||||
metavar="DIR",
|
||||
default=Path("mapcrafter"),
|
||||
)
|
||||
|
||||
subparsers.add_parser("validate", help="Validate the map data")
|
||||
subparsers.add_parser("print", help="Print the map data")
|
||||
|
||||
return parser.parse_args()
|
||||
|
||||
|
||||
def main():
|
||||
args = parse_args()
|
||||
|
||||
match args.command:
|
||||
case "export-bluemap":
|
||||
generate_bluemap_output(args.output_dir)
|
||||
|
||||
case "export-mapcrafter":
|
||||
generate_mapcrafter_output(args.output_dir)
|
||||
|
||||
case "validate":
|
||||
validate_marker_data()
|
||||
|
||||
case "print":
|
||||
pretty_print_marker_data()
|
||||
|
||||
case _:
|
||||
print("Unknown command")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
55
src/cli/print.py
Normal file
55
src/cli/print.py
Normal file
@@ -0,0 +1,55 @@
|
||||
from lib_marker import MarkerSet, Marker, Point, Track, Area
|
||||
from marker_sets import WORLDS
|
||||
|
||||
|
||||
def pretty_print_marker_data() -> None:
|
||||
tree = format_tree(
|
||||
"Worlds", [format_world(name, world) for name, world in WORLDS.items()]
|
||||
)
|
||||
print(tree)
|
||||
|
||||
|
||||
def format_world(name: str, world: list[MarkerSet]) -> str:
|
||||
tree = format_tree(name, [format_marker_set(marker_set) for marker_set in world])
|
||||
return tree
|
||||
|
||||
|
||||
def format_marker_set(marker_set: MarkerSet) -> str:
|
||||
tree = format_tree(
|
||||
marker_set.name, [format_marker(marker) for marker in marker_set.markers]
|
||||
)
|
||||
return tree
|
||||
|
||||
|
||||
def format_marker(marker: Marker) -> str:
|
||||
if isinstance(marker, Point):
|
||||
return format_point_marker(marker)
|
||||
elif isinstance(marker, Track):
|
||||
raise NotImplementedError("Track markers are not supported")
|
||||
elif isinstance(marker, Area):
|
||||
raise NotImplementedError("Area markers are not supported")
|
||||
else:
|
||||
raise ValueError(f"Unknown marker type: {marker}")
|
||||
|
||||
|
||||
def format_point_marker(marker: Point) -> str:
|
||||
return f"{marker.name} ({marker.x}, {marker.y}, {marker.z})"
|
||||
|
||||
|
||||
def format_tree(name: str, items: list[str]) -> str:
|
||||
result = [name]
|
||||
for i, item in enumerate(items):
|
||||
if i == len(items) - 1:
|
||||
for k, line in enumerate(item.splitlines()):
|
||||
if k == 0:
|
||||
result.append(f"└─ {line}")
|
||||
else:
|
||||
result.append(f" {line}")
|
||||
else:
|
||||
for k, line in enumerate(item.splitlines()):
|
||||
if k == 0:
|
||||
result.append(f"├─ {line}")
|
||||
else:
|
||||
result.append(f"│ {line}")
|
||||
|
||||
return "\n".join(result)
|
||||
200
src/cli/validate.py
Normal file
200
src/cli/validate.py
Normal file
@@ -0,0 +1,200 @@
|
||||
from marker_sets import WORLDS
|
||||
from lib_marker import Point, Track
|
||||
|
||||
|
||||
def validate_marker_data() -> None:
|
||||
for test_name, test_f in _tests.items():
|
||||
results = test_f()
|
||||
if len(results) > 0:
|
||||
print(f"[X] {test_name}")
|
||||
for result in results:
|
||||
print(f" {result}")
|
||||
else:
|
||||
print(f"[✓] {test_name}")
|
||||
|
||||
|
||||
def validate_no_non_included_files() -> list:
|
||||
# TODO: Implement this function
|
||||
return []
|
||||
|
||||
|
||||
def validate_no_invalid_y_values() -> list:
|
||||
result = []
|
||||
|
||||
for world_name, marker_sets in WORLDS.items():
|
||||
for marker_set in marker_sets:
|
||||
for marker in marker_set.markers:
|
||||
if isinstance(marker, Point):
|
||||
if marker.y < 0 or marker.y > 255:
|
||||
result.append(
|
||||
{
|
||||
"error_type": "invalid_y_value",
|
||||
"full_marker_name": (
|
||||
world_name,
|
||||
marker_set.name,
|
||||
marker.name,
|
||||
),
|
||||
"y_value": marker.y,
|
||||
}
|
||||
)
|
||||
elif isinstance(marker, Track):
|
||||
for i, point in enumerate(marker.points):
|
||||
_, y, _ = point
|
||||
if y < 0 or y > 255:
|
||||
result.append(
|
||||
{
|
||||
"error_type": "invalid_y_value",
|
||||
"full_marker_name": (
|
||||
world_name,
|
||||
marker_set.name,
|
||||
marker.name,
|
||||
),
|
||||
"index": i,
|
||||
"y_value": y,
|
||||
}
|
||||
)
|
||||
|
||||
return result
|
||||
|
||||
|
||||
def validate_no_duplicate_points_in_tracks() -> list:
|
||||
result = []
|
||||
|
||||
for world_name, marker_sets in WORLDS.items():
|
||||
for marker_set in marker_sets:
|
||||
for marker in marker_set.markers:
|
||||
if isinstance(marker, Track):
|
||||
points = {}
|
||||
for point in marker.points:
|
||||
if point in points:
|
||||
result.append(
|
||||
{
|
||||
"error_type": "duplicate_point",
|
||||
"point_a": points[point],
|
||||
"point_b": (
|
||||
world_name,
|
||||
marker_set.name,
|
||||
marker.name,
|
||||
),
|
||||
"coordinates": point,
|
||||
}
|
||||
)
|
||||
points[point] = (world_name, marker_set.name, marker.name)
|
||||
|
||||
return result
|
||||
|
||||
|
||||
def validate_no_duplicate_marker_names() -> list:
|
||||
result = []
|
||||
|
||||
marker_names = set()
|
||||
for world_name, marker_sets in WORLDS.items():
|
||||
for marker_set in marker_sets:
|
||||
for marker in marker_set.markers:
|
||||
full_name = (world_name, marker_set.name, marker.name)
|
||||
if full_name in marker_names:
|
||||
result.append(
|
||||
{
|
||||
"error_type": "duplicate_marker_name",
|
||||
"full_marker_name": full_name,
|
||||
}
|
||||
)
|
||||
marker_names.add(full_name)
|
||||
|
||||
return result
|
||||
|
||||
|
||||
def validate_no_duplicate_marker_set_names() -> list:
|
||||
result = []
|
||||
|
||||
marker_set_names = set()
|
||||
for world_name, marker_sets in WORLDS.items():
|
||||
for marker_set in marker_sets:
|
||||
if (world_name, marker_set.name) in marker_set_names:
|
||||
result.append(
|
||||
{
|
||||
"error_type": "duplicate_marker_set_name",
|
||||
"full_marker_set_name": (world_name, marker_set.name),
|
||||
}
|
||||
)
|
||||
marker_set_names.add((world_name, marker_set.name))
|
||||
|
||||
return result
|
||||
|
||||
|
||||
def validate_no_unused_icons() -> list:
|
||||
# TODO: Implement this function
|
||||
return []
|
||||
|
||||
|
||||
def validate_no_duplicate_points() -> list:
|
||||
result = []
|
||||
|
||||
for world_name, marker_sets in WORLDS.items():
|
||||
points = {}
|
||||
for marker_set in marker_sets:
|
||||
for marker in marker_set.markers:
|
||||
if isinstance(marker, Point):
|
||||
point = (marker.x, marker.y, marker.z)
|
||||
if point in points:
|
||||
result.append(
|
||||
{
|
||||
"error_type": "duplicate_point",
|
||||
"point_a": points[point],
|
||||
"point_b": (world_name, marker_set.name, marker.name),
|
||||
"coordinates": point,
|
||||
}
|
||||
)
|
||||
points[point] = (world_name, marker_set.name, marker.name)
|
||||
elif isinstance(marker, Track):
|
||||
for i, point in enumerate(marker.points):
|
||||
if point in points:
|
||||
result.append(
|
||||
{
|
||||
"error_type": "duplicate_point",
|
||||
"point_a": points[point],
|
||||
"point_b": (
|
||||
world_name,
|
||||
marker_set.name,
|
||||
marker.name,
|
||||
),
|
||||
"index": i,
|
||||
"coordinates": point,
|
||||
}
|
||||
)
|
||||
points[point] = (world_name, marker_set.name, marker.name)
|
||||
|
||||
return result
|
||||
|
||||
|
||||
def validate_all_tracks_have_at_least_two_points() -> list:
|
||||
result = []
|
||||
|
||||
for world_name, marker_sets in WORLDS.items():
|
||||
for marker_set in marker_sets:
|
||||
for marker in marker_set.markers:
|
||||
if isinstance(marker, Track) and len(marker.points) < 2:
|
||||
result.append(
|
||||
{
|
||||
"error_type": "track_too_short",
|
||||
"full_marker_name": (
|
||||
world_name,
|
||||
marker_set.name,
|
||||
marker.name,
|
||||
),
|
||||
}
|
||||
)
|
||||
|
||||
return result
|
||||
|
||||
|
||||
_tests = {
|
||||
"No non-included files": validate_no_non_included_files,
|
||||
"No invalid y coordinates": validate_no_invalid_y_values,
|
||||
"No duplicate points in tracks": validate_no_duplicate_points_in_tracks,
|
||||
"No duplicate marker names": validate_no_duplicate_marker_names,
|
||||
"No duplicate marker-set names": validate_no_duplicate_marker_set_names,
|
||||
"No unused icons": validate_no_unused_icons,
|
||||
"No duplicate points": validate_no_duplicate_points,
|
||||
"All tracks have at least two points": validate_all_tracks_have_at_least_two_points,
|
||||
}
|
||||
Reference in New Issue
Block a user