-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathswitchcraft.spec
More file actions
149 lines (131 loc) · 5.64 KB
/
switchcraft.spec
File metadata and controls
149 lines (131 loc) · 5.64 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
# -*- mode: python ; coding: utf-8 -*-
import sys
import os
from pathlib import Path
from PyInstaller.utils.hooks import collect_submodules
block_cipher = None
# MANUAL COLLECTION for Modern
# We need switchcraft.* and flet
hidden_imports = [
'flet', 'flet_desktop', 'defusedxml', 'winotify', 'requests',
'xml.parsers.expat', 'pyexpat',
'switchcraft.utils', 'switchcraft.utils.config', 'switchcraft.utils.app_updater',
'switchcraft.gui', 'switchcraft.gui_modern',
'switchcraft.controllers', 'switchcraft.services', 'switchcraft.gui_modern.utils',
'switchcraft.gui_modern.app',
# Explicitly include all views for PyInstaller to find them
'switchcraft.gui_modern.views.crash_view',
'switchcraft.gui_modern.views.packaging_wizard_view',
'switchcraft.gui_modern.views.analyzer_view',
'switchcraft.gui_modern.views.winget_view',
'switchcraft.gui_modern.views.home_view',
'switchcraft.gui_modern.views.intune_view',
'switchcraft.gui_modern.views.settings_view',
'switchcraft.gui_modern.views.history_view',
'switchcraft.gui_modern.views.script_upload_view',
'switchcraft.gui_modern.views.helper_view',
'switchcraft.gui_modern.views.macos_wizard_view',
'switchcraft.gui_modern.views.group_manager_view',
'switchcraft.gui_modern.views.stack_manager_view',
'switchcraft.gui_modern.views.detection_tester_view',
'switchcraft.gui_modern.views.intune_store_view',
'switchcraft.gui_modern.views.library_view',
'switchcraft.gui_modern.views.dashboard_view',
]
# Collect everything from gui_modern.views explicitly to be safe
try:
views_submodules = collect_submodules('switchcraft.gui_modern.views')
hidden_imports += views_submodules
except Exception as e:
print(f"WARNING: Failed to collect view submodules: {e}")
# Collect all other submodules but exclude addon modules that are not part of core
all_submodules = collect_submodules('switchcraft')
# Filter out modules that were moved to addons or don't exist
excluded_modules = ['switchcraft.utils.winget', 'switchcraft.gui.views.ai_view', 'switchcraft_winget', 'switchcraft_ai', 'switchcraft_advanced', 'switchcraft.utils.updater']
# Filter gui_modern submodules with the same exclusion rules
try:
gui_modern_submodules = collect_submodules('switchcraft.gui_modern')
filtered_gui_modern = [m for m in gui_modern_submodules if not any(m.startswith(ex) for ex in excluded_modules)]
hidden_imports += filtered_gui_modern
except Exception as e:
print(f"WARNING: Failed to collect gui_modern submodules: {e}")
# Ensure app.py is explicitly included (it might be filtered out otherwise)
filtered_submodules = [m for m in all_submodules if not any(m.startswith(ex) for ex in excluded_modules)]
if 'switchcraft.gui_modern.app' not in filtered_submodules:
filtered_submodules.append('switchcraft.gui_modern.app')
hidden_imports += filtered_submodules
# Deduplicate
hidden_imports = list(set(hidden_imports))
src_root = os.path.abspath('src')
if src_root not in sys.path:
sys.path.insert(0, src_root)
datas = [
('src/switchcraft/assets', 'assets'),
]
# Collect Flet data files and binaries
from PyInstaller.utils.hooks import collect_all
try:
flet_datas, flet_binaries, flet_hiddenimports = collect_all('flet')
# Filter out web and CLI related datas/hiddenimports
datas += [d for d in flet_datas if not any(x in d[0] for x in ['flet_web', 'flet_cli', 'bin/flet'])]
binaries = flet_binaries
hidden_imports += [h for h in flet_hiddenimports if not any(x in h for x in ['flet_web', 'flet.cli', 'flet_cli'])]
fd_datas, fd_binaries, fd_hiddenimports = collect_all('flet_desktop')
# Filter desktop binaries to exclude libmpv (28MB) which is for video/audio play
# We only need the core flutter/flet binaries for the GUI
datas += [d for d in fd_datas if 'flet_web' not in d[0]]
excluded_binaries = ['libmpv-2.dll', 'audioplayers_windows_plugin.dll', 'media_kit_libs_windows_video_plugin.dll', 'media_kit_video_plugin.dll']
binaries += [b for b in fd_binaries if not any(ex in b[0] for ex in excluded_binaries)]
hidden_imports += [h for h in fd_hiddenimports if 'flet_web' not in h]
except Exception as e:
print(f"WARNING: Failed to collect Flet bundle files: {e}")
binaries = []
# Analysis for Modern (Flet)
a = Analysis(
['src/switchcraft/main.py'],
pathex=[os.path.abspath('src')],
binaries=binaries,
datas=datas,
hiddenimports=hidden_imports,
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=['flet.testing', 'numpy', 'scipy', 'skimage', 'pandas', 'matplotlib', 'google.generativeai', 'grpc', 'openai', 'flet_web', 'pydantic', 'fastapi', 'starlette', 'uvicorn', 'websockets', 'pydantic_core'],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False,
)
splash = None
if sys.platform != 'darwin':
splash = Splash(
'src/switchcraft/assets/splash.png',
binaries=a.binaries,
datas=a.datas,
text_pos=None,
text_size=12,
minify_script=True
)
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
exe_args = [pyz, a.scripts]
if splash:
exe_args.append(splash)
exe_args.append(splash.binaries)
exe_args.extend([a.binaries, a.zipfiles, a.datas])
exe = EXE(
*exe_args,
name='SwitchCraft',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx_exclude=[],
runtime_tmpdir=None,
console=False, # Windowed app
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
icon='src/switchcraft/assets/switchcraft_logo.ico',
version='file_version_info.txt'
)