diff --git a/Expert Mode.ipynb b/Expert Mode.ipynb new file mode 100644 index 0000000..c67040d --- /dev/null +++ b/Expert Mode.ipynb @@ -0,0 +1,312 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import sys\n", + "import json\n", + "from pathlib import Path\n", + "\n", + "import yaml\n", + "from rich import print" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "class EmptyClass:\n", + " pass\n", + "\n", + "self = EmptyClass()\n", + "self.AD = EmptyClass()\n", + "self.AD.app_dir = '/mnt/ad_dev_conf/apps'" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
Python parents:\n", + "\n" + ], + "text/plain": [ + "Python parents:\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
- /mnt/ad_dev_conf/apps/my_repo/my_pkg\n", + " - /mnt/ad_dev_conf/apps\n", + " - /mnt/ad_dev_conf/apps/my_repo/my_pkg/my_sub_pkg\n", + "\n" + ], + "text/plain": [ + " - \u001b[35m/mnt/ad_dev_conf/apps/my_repo/\u001b[0m\u001b[95mmy_pkg\u001b[0m\n", + " - \u001b[35m/mnt/ad_dev_conf/\u001b[0m\u001b[95mapps\u001b[0m\n", + " - \u001b[35m/mnt/ad_dev_conf/apps/my_repo/my_pkg/\u001b[0m\u001b[95mmy_sub_pkg\u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
Module parents:\n", + "\n" + ], + "text/plain": [ + "Module parents:\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
- /mnt/ad_dev_conf/apps\n", + "\n" + ], + "text/plain": [ + " - \u001b[35m/mnt/ad_dev_conf/\u001b[0m\u001b[95mapps\u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
Package parents:\n", + "\n" + ], + "text/plain": [ + "Package parents:\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
- /mnt/ad_dev_conf/apps/my_repo/my_pkg\n", + " - /mnt/ad_dev_conf/apps/my_repo/my_pkg/my_sub_pkg\n", + "\n" + ], + "text/plain": [ + " - \u001b[35m/mnt/ad_dev_conf/apps/my_repo/\u001b[0m\u001b[95mmy_pkg\u001b[0m\n", + " - \u001b[35m/mnt/ad_dev_conf/apps/my_repo/my_pkg/\u001b[0m\u001b[95mmy_sub_pkg\u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
Top package parents:\n", + "\n" + ], + "text/plain": [ + "Top package parents:\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
- /mnt/ad_dev_conf/apps/my_repo/my_pkg\n", + "\n" + ], + "text/plain": [ + " - \u001b[35m/mnt/ad_dev_conf/apps/my_repo/\u001b[0m\u001b[95mmy_pkg\u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
Imports\n", + "\n" + ], + "text/plain": [ + "Imports\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
- /mnt/ad_dev_conf/apps\n", + " - /mnt/ad_dev_conf/apps/my_repo\n", + "\n" + ], + "text/plain": [ + " - \u001b[35m/mnt/ad_dev_conf/\u001b[0m\u001b[95mapps\u001b[0m\n", + " - \u001b[35m/mnt/ad_dev_conf/apps/\u001b[0m\u001b[95mmy_repo\u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "base_path = Path(self.AD.app_dir)\n", + "\n", + "python_file_parents = set(\n", + " f.parent.resolve()\n", + " for f in base_path.rglob('*.py')\n", + ")\n", + "print('Python parents:')\n", + "print('\\n'.join(f' - {p.as_posix()}' for p in python_file_parents))\n", + "\n", + "module_parents = set(\n", + " p for p in python_file_parents\n", + " if not (p / '__init__.py').exists()\n", + ")\n", + "print('Module parents:')\n", + "print('\\n'.join(f' - {p.as_posix()}' for p in module_parents))\n", + "\n", + "package_parents = set(\n", + " p for p in python_file_parents\n", + " if (p / '__init__.py').exists()\n", + ")\n", + "print('Package parents:')\n", + "print('\\n'.join(f' - {p.as_posix()}' for p in package_parents))\n", + "\n", + "top_packages_dirs = set(\n", + " p for p in package_parents\n", + " if not (p.parent / '__init__.py').exists()\n", + ")\n", + "print('Top package parents:')\n", + "print('\\n'.join(f' - {p.as_posix()}' for p in top_packages_dirs))\n", + "\n", + "import_dirs = module_parents | set(p.parent for p in top_packages_dirs)\n", + "print('Imports')\n", + "print('\\n'.join(f' - {p.as_posix()}' for p in import_dirs))" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
{\n", + " PosixPath('/mnt/ad_dev_conf/apps/my_repo/my_pkg/__init__.py'): 'my_pkg',\n", + " PosixPath('/mnt/ad_dev_conf/apps/my_repo/my_pkg/motion.py'): 'my_pkg',\n", + " PosixPath('/mnt/ad_dev_conf/apps/my_repo/my_pkg/my_sub_pkg/__init__.py'): 'my_pkg',\n", + " PosixPath('/mnt/ad_dev_conf/apps/my_repo/my_pkg/my_sub_pkg/hello.py'): 'my_pkg'\n", + "}\n", + "\n" + ], + "text/plain": [ + "\u001b[1m{\u001b[0m\n", + " \u001b[1;35mPosixPath\u001b[0m\u001b[1m(\u001b[0m\u001b[32m'/mnt/ad_dev_conf/apps/my_repo/my_pkg/__init__.py'\u001b[0m\u001b[1m)\u001b[0m: \u001b[32m'my_pkg'\u001b[0m,\n", + " \u001b[1;35mPosixPath\u001b[0m\u001b[1m(\u001b[0m\u001b[32m'/mnt/ad_dev_conf/apps/my_repo/my_pkg/motion.py'\u001b[0m\u001b[1m)\u001b[0m: \u001b[32m'my_pkg'\u001b[0m,\n", + " \u001b[1;35mPosixPath\u001b[0m\u001b[1m(\u001b[0m\u001b[32m'/mnt/ad_dev_conf/apps/my_repo/my_pkg/my_sub_pkg/__init__.py'\u001b[0m\u001b[1m)\u001b[0m: \u001b[32m'my_pkg'\u001b[0m,\n", + " \u001b[1;35mPosixPath\u001b[0m\u001b[1m(\u001b[0m\u001b[32m'/mnt/ad_dev_conf/apps/my_repo/my_pkg/my_sub_pkg/hello.py'\u001b[0m\u001b[1m)\u001b[0m: \u001b[32m'my_pkg'\u001b[0m\n", + "\u001b[1m}\u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "association = {}\n", + "for dir in top_packages_dirs:\n", + " associated_modules = list(dir.rglob('*.py'))\n", + " # print('\\n'.join(f' - {p.as_posix()}' for p in associated_modules))\n", + " for module_file in associated_modules:\n", + " association[module_file] = dir.stem\n", + "\n", + "print(association)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['hello_sub', 'motion']" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "module_name = 'my_pkg'\n", + "\n", + "with Path('apps/apps.yaml').open('r') as f:\n", + " self.app_config = yaml.load(f, Loader=yaml.SafeLoader)\n", + "\n", + "self.non_apps = []\n", + "\n", + "[\n", + " app_name\n", + " for app_name, app_cfg in self.app_config.items()\n", + " if app_cfg['module'].split('.')[0] == module_name\n", + "]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "ad_dev", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.7" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/Imports.ipynb b/Imports.ipynb new file mode 100644 index 0000000..a7b5cca --- /dev/null +++ b/Imports.ipynb @@ -0,0 +1,42 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import importlib\n", + "from pathlib import Path" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "ad_dev", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.7" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/appdaemon.yaml b/appdaemon.yaml index 77135af..993720c 100644 --- a/appdaemon.yaml +++ b/appdaemon.yaml @@ -11,8 +11,16 @@ appdaemon: type: hass ha_url: http://192.168.1.82:8123 token: !secret long_lived_token -http: - url: http://0.0.0.0:5051 + # mqtt: + # type: mqtt + # namespace: mqtt + # client_host: zigbee.localdomain + # client_user: homeassistant + # client_password: !secret mqtt_password + # client_topics: + # - zigbee2mqtt/# +# http: +# url: http://0.0.0.0:5051 admin: api: hadashboard: diff --git a/apps/apps2.yaml b/apps/apps2.yaml deleted file mode 100644 index 128d3da..0000000 --- a/apps/apps2.yaml +++ /dev/null @@ -1,9 +0,0 @@ -# Baz: -# module: my_pkg.my_sub_pkg.baz -# class: Baz - -Hello2: - module: hello - class: HelloWorld - -# Foo: bar diff --git a/apps/global_apps.yaml b/apps/global_apps.yaml new file mode 100644 index 0000000..412735d --- /dev/null +++ b/apps/global_apps.yaml @@ -0,0 +1,3 @@ +globals: + module: globals + global: true diff --git a/apps/apps.yaml b/apps/repo_apps.yaml similarity index 76% rename from apps/apps.yaml rename to apps/repo_apps.yaml index 015ad27..1ba4a85 100644 --- a/apps/apps.yaml +++ b/apps/repo_apps.yaml @@ -13,9 +13,3 @@ Baz: Hello: module: hello class: HelloWorld - -globals: - module: globals - global: true - -# Foo: bar \ No newline at end of file diff --git a/apps/standard_import_apps.yaml b/apps/standard_import_apps.yaml new file mode 100644 index 0000000..1c34d12 --- /dev/null +++ b/apps/standard_import_apps.yaml @@ -0,0 +1,7 @@ +Hello2: + module: hello + class: HelloWorld + +TestApp: + module: test + class: Test diff --git a/modules.ipynb b/modules.ipynb new file mode 100644 index 0000000..3c8128c --- /dev/null +++ b/modules.ipynb @@ -0,0 +1,144 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import importlib\n", + "\n", + "import pathlib\n", + "from types import ModuleType\n", + "from typing import List\n", + "from pathlib import Path\n", + "\n", + "from IPython.lib import deepreload" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "=============== Importing my_pkg ===============\n", + "-------------- Importing motion.py ---------------\n", + "===================== Done =====================\n" + ] + } + ], + "source": [ + "import sys\n", + "\n", + "sys.path.insert(0, Path('apps/my_repo').resolve().as_posix())\n", + "\n", + "import my_pkg" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['importlib._abc',\n", + " 'importlib._bootstrap',\n", + " 'importlib._bootstrap_external',\n", + " 'importlib._imp',\n", + " 'importlib.abc',\n", + " 'importlib.machinery',\n", + " 'importlib.metadata',\n", + " 'importlib.resources',\n", + " 'importlib.sys',\n", + " 'importlib.util',\n", + " 'importlib.warnings']" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def recursive_modules(module_obj: ModuleType) -> List[str]:\n", + " sub_modules = [\n", + " f'{module_obj.__name__}.{name}' for name in dir(module_obj)\n", + " if isinstance(getattr(module_obj, name), ModuleType)\n", + " ]\n", + " return sub_modules\n", + "\n", + "recursive_modules(importlib)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[