# -*- mode: python ; coding: utf-8 -*- """PyInstaller spec for MISF_Planner_Download.exe (onedir build). Layout produced (matches what is deployed to D:\\MISF_Planner_Download): MISF_Planner_Download.exe _internal/ src/*.py <- imported via sys.path at runtime playwright/driver/... <- node.exe + cli.js, used to auto-install Chromium """ from PyInstaller.utils.hooks import collect_data_files, collect_submodules block_cipher = None # src/ is shipped as data, not as a package: onedrive_planner_http.py puts it on # sys.path at import time (ROOT / "src"), and PROJECT_ROOT resolves next to the # .exe so Input/ and Output/ stay outside the bundle. datas = [("src", "src")] # node.exe + package/cli.js — _ensure_playwright_browsers() shells out to these # on a machine that has no Chromium yet. datas += collect_data_files("playwright") hiddenimports = [ "checkpoint", "config", "logging_setup", "onedrive_planner", "run_log", "totp_utils", "pyotp", "openpyxl", "openpyxl.cell._writer", ] hiddenimports += collect_submodules("playwright") a = Analysis( ["onedrive_planner_http.py"], pathex=["src"], binaries=[], datas=datas, hiddenimports=hiddenimports, hookspath=[], hooksconfig={}, runtime_hooks=[], excludes=["tkinter", "matplotlib", "PyQt5", "PySide2", "IPython"], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False, ) pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) exe = EXE( pyz, a.scripts, [], exclude_binaries=True, name="MISF_Planner_Download", debug=False, bootloader_ignore_signals=False, strip=False, upx=False, console=True, disable_windowed_traceback=False, argv_emulation=False, target_arch=None, codesign_identity=None, entitlements_file=None, ) coll = COLLECT( exe, a.binaries, a.zipfiles, a.datas, strip=False, upx=False, upx_exclude=[], name="MISF_Planner_Download", )