Skip to content
Merged
Show file tree
Hide file tree
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
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,5 @@ test.py
*.cpython*.so

.codspeed
models_map.json

similarity_output/
1 change: 1 addition & 0 deletions deebot_client/hardware/deebot/5089oy.py
1 change: 1 addition & 0 deletions deebot_client/hardware/deebot/6cibhb.py
1 change: 1 addition & 0 deletions deebot_client/hardware/deebot/7c26ui.py
1 change: 1 addition & 0 deletions deebot_client/hardware/deebot/8o3xke.py
1 change: 1 addition & 0 deletions deebot_client/hardware/deebot/9rft3c.py
1 change: 1 addition & 0 deletions deebot_client/hardware/deebot/ao7fpw.py
1 change: 1 addition & 0 deletions deebot_client/hardware/deebot/aqdd5p.py
1 change: 1 addition & 0 deletions deebot_client/hardware/deebot/bheggm.py
1 change: 1 addition & 0 deletions deebot_client/hardware/deebot/czjwet.py
1 change: 1 addition & 0 deletions deebot_client/hardware/deebot/k1lgm7.py
1 change: 1 addition & 0 deletions deebot_client/hardware/deebot/m17zko.py
1 change: 1 addition & 0 deletions deebot_client/hardware/deebot/p1wg05.py
1 change: 1 addition & 0 deletions deebot_client/hardware/deebot/qhq6i0.py
1 change: 1 addition & 0 deletions deebot_client/hardware/deebot/ruhc0q.py
1 change: 1 addition & 0 deletions deebot_client/hardware/deebot/sa4tf7.py
1 change: 1 addition & 0 deletions deebot_client/hardware/deebot/wgxm70.py
1 change: 1 addition & 0 deletions deebot_client/hardware/deebot/xztz07.py
1 change: 1 addition & 0 deletions deebot_client/hardware/deebot/zjna8m.py
70 changes: 42 additions & 28 deletions scripts/check_for_similar_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,35 @@
from deebot_client.util import md5


def _save_models(models_map: dict[str, list[str]]) -> None:
"""Save models to file."""
with Path("models_map.json").open("w") as f:
f.write(json.dumps(models_map, indent=4))
def _save_file(name: str, data: dict[str, list[str]]) -> None:
"""Save data to file."""
path = Path("similarity_output")
path.mkdir(exist_ok=True)
with path.joinpath(name).open("w") as f:
f.write(json.dumps(data, indent=4))


def _add_models_by_similarity(models: list[str]) -> None:
"""Add models by similarity."""
if len(models) < 2:
# No similar models
return

model_to_link = None
for model in models:
if model in DEVICES:
model_to_link = model
break

if model_to_link:
# Found a model to link
for model in models:
if model != model_to_link and model not in DEVICES:
os.symlink(
f"{model_to_link}.py",
f"{model}.py",
dir_fd=os.open("deebot_client/hardware/deebot", os.O_RDONLY),
)
Comment on lines +44 to +48

Copilot AI May 11, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider handling potential exceptions (e.g., FileExistsError) when creating a symlink to avoid runtime errors if the link already exists.

Suggested change
os.symlink(
f"{model_to_link}.py",
f"{model}.py",
dir_fd=os.open("deebot_client/hardware/deebot", os.O_RDONLY),
)
try:
os.symlink(
f"{model_to_link}.py",
f"{model}.py",
dir_fd=os.open("deebot_client/hardware/deebot", os.O_RDONLY),
)
except FileExistsError:
logging.warning(f"Symbolic link for {model} already exists. Skipping.")

Copilot uses AI. Check for mistakes.


async def main() -> None:
Expand All @@ -38,37 +63,26 @@ async def main() -> None:
)
api_client = ApiClient(authenticator)

iot_map = await api_client.get_product_iot_map()
name_map: dict[str, list[str]] = {}
for key, value in (await api_client.get_product_iot_map()).items():
ui_logic_map: dict[str, list[str]] = {}
for key, value in iot_map.items():
name_map.setdefault(value["name"], []).append(key)
ui_logic_map.setdefault(value["UILogicId"], []).append(key)

await asyncio.get_event_loop().run_in_executor(None, _save_models, name_map)
await asyncio.get_event_loop().run_in_executor(
None, _save_file, "models_map.json", name_map
)
await asyncio.get_event_loop().run_in_executor(
None, _save_file, "ui_logic_map.json", ui_logic_map
)

# Load current models
await asyncio.get_event_loop().run_in_executor(None, _load)

for models in name_map.values():
if len(models) < 2:
# No similar models
continue

model_to_link = None
for model in models:
if model in DEVICES:
model_to_link = model
break

if model_to_link:
# Found a model to link
for model in models:
if model != model_to_link and model not in DEVICES:
os.symlink(
f"{model_to_link}.py",
f"{model}.py",
dir_fd=os.open(
"deebot_client/hardware/deebot", os.O_RDONLY
),
)
for map in (name_map, ui_logic_map):
for models in map.values():
_add_models_by_similarity(models)


if __name__ == "__main__":
Expand Down