Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve template bootstraper script #106

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
133 changes: 119 additions & 14 deletions scripts/bootstrap-template.py
Original file line number Diff line number Diff line change
@@ -1,33 +1,97 @@
#!/usr/bin/python3

import sys, os, shutil, re
import os
import re
import shutil
import sys
from pathlib import Path


def is_snake_case(s):
# Define the regex pattern for snake case with numbers
def is_snake_case(s: str) -> bool:
"""
Check if the provided string is in snake_case format.
Snake case is lower case with words separated by underscores, and it can contain digits.

Args:
s (str): String to check.

Returns:
bool: True if the string is in snake_case, False otherwise.
"""
pattern = r"^[a-z0-9]+(_[a-z0-9]+)*$"
return bool(re.match(pattern, s))

# Use re.match to check if the string matches the pattern
if re.match(pattern, s):
return True
else:
return False

def to_camel_case(snake_str: str) -> str:
"""
Convert a snake_case string to camelCase.

def to_camel_case(snake_str):
Args:
snake_str (str): String in snake_case to convert.

Returns:
str: Converted string in camelCase.
"""
return "".join(x.capitalize() for x in snake_str.lower().split("_"))


def replace(file_name, to_find, to_replace):
def replace(file_name: str, to_find: str, to_replace: str) -> None:
"""
Replace occurrences of a string within a file, ensuring placeholders are handled.
The function replaces the `to_find` string with `to_replace`, adds a placeholder,
and skips lines with placeholders already in place.

Args:
file_name (str): Path to the file to perform replacement in.
to_find (str): String to search for in the file.
to_replace (str): String to replace `to_find` with.

Returns:
None
"""
with open(file_name, "r", encoding="utf8") as file:
filedata = file.read()
filedata = filedata.replace(to_find, to_replace)
filedata = file.readlines()

new_filedata = []
for line in filedata:
# Skip lines that have already been replaced by checking for placeholder
if "__REPLACEMENT_DONE__" in line:
new_filedata.append(line)
continue

modified_line = line.replace(
to_find,
to_replace,
)
modified_line = modified_line.replace(
to_find.capitalize(), to_camel_case(to_replace)
)
modified_line = modified_line.replace(
to_find.upper(),
to_replace.upper(),
)

# Add placeholder once after all replacements
if to_find in line or to_find.capitalize() in line or to_find.upper() in line:
modified_line += "__REPLACEMENT_DONE__"

new_filedata.append(modified_line)

with open(file_name, "w", encoding="utf8") as file:
file.write(filedata)
file.writelines(new_filedata)


def replace_everywhere(to_find: str, to_replace: str) -> None:
"""
Replace a string in all files in the project.

def replace_everywhere(to_find, to_replace):
Args:
to_find (str): String to search for in the file.
to_replace (str): String to replace `to_find` with.

Returns:
None
"""
for path in files_to_search:
replace(path, to_find, to_replace)
replace(path, to_find.capitalize(), to_camel_case(to_replace))
Expand All @@ -42,6 +106,45 @@ def replace_everywhere(to_find, to_replace):
replace("./scripts/setup-custom-toolchain.sh", to_find, to_replace)


def remove_placeholder() -> None:
"""
Remove the placeholder from all files.

Returns:
None
"""
for path in files_to_search:
replace_placeholders(path)

replace_placeholders("./CMakeLists.txt")
replace_placeholders("./Makefile")
replace_placeholders("./Makefile")
replace_placeholders("./Makefile")
replace_placeholders("./README.md")
replace_placeholders("./extension_config.cmake")
replace_placeholders("./scripts/setup-custom-toolchain.sh")


def replace_placeholders(file_name: str) -> None:
"""
Remove the placeholder from a file.

Args:
file_name (str): Path to the file to remove the placeholder from.

Returns:
None
"""
with open(file_name, "r", encoding="utf8") as file:
filedata = file.read()

# Remove all placeholders
filedata = filedata.replace("__REPLACEMENT_DONE__", "")

with open(file_name, "w", encoding="utf8") as file:
file.write(filedata)


if __name__ == "__main__":
if len(sys.argv) != 2:
raise Exception(
Expand Down Expand Up @@ -74,6 +177,8 @@ def replace_everywhere(to_find, to_replace):
replace_everywhere("Quack", name_extension.capitalize())
replace_everywhere("<extension_name>", name_extension)

remove_placeholder()

string_to_replace = name_extension
string_to_find = "quack"

Expand Down
Loading