Skip to content

Commit

Permalink
Systematically enforce valid field and class names
Browse files Browse the repository at this point in the history
  • Loading branch information
multimeric committed Jan 30, 2025
1 parent f36fdb7 commit 70009d8
Show file tree
Hide file tree
Showing 5 changed files with 499 additions and 22 deletions.
11 changes: 3 additions & 8 deletions src/mondantic/codegen.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,9 @@
import requests
import typer
import ast
import re
from mondantic import schema
from mondantic.formatting import clean_class_name, clean_field_name

INVALID_CHARS = re.compile(r"[^a-zA-Z0-9_]")

TYPE_MAP: dict[str, Type[schema.ColumnValue]] = {
"mirror": schema.MirrorValue,
Expand Down Expand Up @@ -48,10 +47,6 @@
"week": schema.WeekValue,
"world_clock": schema.WorldClockValue,
}
# DEFAULT_MAP: dict[str, ast.expr] = {
# "people": ast.List([]),
# "board_relation": ast.List([])
# }

app = typer.Typer()

Expand Down Expand Up @@ -104,7 +99,7 @@ def codegen(
)
]
for column in parsed["data"]["boards"][0]["columns"]:
col_name = column["title"].lower().replace(" ", "_").replace("#", "num").replace("&", "").replace("/", "")
col_name = clean_field_name(column["title"])
col_type: Type[schema.ColumnValue] = TYPE_MAP.get(column["type"], schema.ColumnValue)
# default: ast.expr = DEFAULT_MAP.get(column["type"], ast.Constant(None))
columns.append(
Expand All @@ -120,7 +115,7 @@ def codegen(
)
)

clean_board_name = INVALID_CHARS.sub("", parsed["data"]["boards"][0]["name"])
clean_board_name = clean_class_name(parsed["data"]["boards"][0]["name"])
return ast.fix_missing_locations(
ast.Module(
body=[
Expand Down
23 changes: 23 additions & 0 deletions src/mondantic/formatting.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import re
from typing import Iterable
# Characters that should be deleted from identifiers, after separators are replaced
INVALID_CHARS = re.compile(r"[^a-zA-Z]+", flags=re.ASCII)

def to_segments(name: str) -> Iterable[str]:
"""
Splits a string into segments, each of which is a valid Python identifier.
"""
# return (INVALID_CHARS.sub(segment, "") for segment in SEPARATOR_CHARS.split(name))
return (segment for segment in INVALID_CHARS.split(name) if segment)

def clean_class_name(name: str) -> str:
"""
Cleans a string to be a valid Python class name.
"""
return "".join([segment.title() for segment in to_segments(name)])

def clean_field_name(name: str) -> str:
"""
Cleans a string to be a valid Python class name.
"""
return "_".join([segment.lower() for segment in to_segments(name)])
15 changes: 15 additions & 0 deletions test/test_formatting.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
from mondantic.formatting import clean_class_name, clean_field_name

def test_class_name():
assert clean_class_name("board name") == "BoardName"
assert clean_class_name("board#name") == "BoardName"
assert clean_class_name("354;8wlfdrstdno") == "Wlfdrstdno"
assert clean_class_name("board-name") == "BoardName"
assert clean_class_name("board3453name") == "BoardName"

def test_field_name():
assert clean_field_name("field name") == "field_name"
assert clean_field_name("field#name") == "field_name"
assert clean_field_name("354;8wlfdrstdno") == "wlfdrstdno"
assert clean_field_name("field-name") == "field_name"
assert clean_field_name("field3453name") == "field_name"
File renamed without changes.
Loading

0 comments on commit 70009d8

Please sign in to comment.