Skip to content

Commit 387e6f3

Browse files
committed
Add patch to support more complex apps.
1 parent 6cd1025 commit 387e6f3

7 files changed

Lines changed: 101 additions & 70 deletions

File tree

README.md

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,12 @@ All you have to do is to import the module in your `setup.py` and use it.
1212

1313
from setuptools import find_packages, setup
1414

15-
from pyside_setup_macro import QtBuildPackage
15+
from pyside_setup_macro import QtBuildPackage, QtBuildDevelop
16+
1617

1718
setup(
1819
...,
19-
cmdclass={
20-
"build_py": QtBuildPackage, # This is all you need to add.
21-
},
20+
cmdclass={"build_py": QtBuildPackage, "develop": QtBuildDevelop}, # This is all you need to add.
2221
)
2322
```
2423

examples/email_app/setup.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from setuptools import find_packages, setup
22

3-
from pyside_setup_macro import QtBuildPackage
3+
from pyside_setup_macro import QtBuildPackage, QtBuildDevelop
44
import email_app
55

66

@@ -13,7 +13,6 @@
1313
author="Max Wiklund",
1414
author_email="",
1515
description="Demo project",
16-
cmdclass={
17-
"build_py": QtBuildPackage,
18-
},
16+
cmdclass={"build_py": QtBuildPackage, "develop": QtBuildDevelop},
17+
install_requires=["PySide6"],
1918
)

examples/scandinavian_flag_picker/setup.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
from setuptools import find_packages, setup
1616

17-
from pyside_setup_macro import QtBuildPackage
17+
from pyside_setup_macro import QtBuildPackage, QtBuildDevelop
1818
import scandinavian_flag_picker
1919

2020

@@ -27,7 +27,6 @@
2727
author="Max Wiklund",
2828
author_email="",
2929
description="Demo project",
30-
cmdclass={
31-
"build_py": QtBuildPackage,
32-
},
30+
cmdclass={"build_py": QtBuildPackage, "develop": QtBuildDevelop},
31+
install_requires=["PySide6"],
3332
)

examples/ui_file_app/setup.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
from setuptools import find_packages, setup
1717

18-
from pyside_setup_macro import QtBuildPackage
18+
from pyside_setup_macro import QtBuildPackage, QtBuildDevelop
1919
import ui_file_app
2020

2121

@@ -28,7 +28,6 @@
2828
author="Max Wiklund",
2929
author_email="",
3030
description="Demo project",
31-
cmdclass={
32-
"build_py": QtBuildPackage,
33-
},
31+
cmdclass={"build_py": QtBuildPackage, "develop": QtBuildDevelop},
32+
install_requires=["PySide6"],
3433
)

pyside_setup_macro/__init__.py

Lines changed: 68 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,10 @@
1515
import os
1616
import shutil
1717
from setuptools.command.build_py import build_py
18+
from setuptools.command.develop import develop
1819
from pyside_setup_macro import _qmacro, _qt
1920

20-
__version__ = "0.1.0"
21+
__version__ = "0.1.1"
2122

2223

2324
def _create_build_dir(path: str) -> None:
@@ -31,64 +32,90 @@ def _create_build_dir(path: str) -> None:
3132
os.makedirs(path)
3233

3334

35+
def _file_needs_processing(file_name: str) -> bool:
36+
return file_name == "qmacro" or file_name.endswith((".qrc", ".ui"))
37+
38+
39+
def _convert_qrc(source_path: str, destination_dir: str, file: str) -> None:
40+
"""Compile qresource file.
41+
42+
Args:
43+
source_path: Source qresource file to compile.
44+
destination_dir: Build directory to put compiled python module in.
45+
file: File name of qresource.
46+
47+
"""
48+
resource_name = file.replace(".qrc", ".py")
49+
_qt.compile_qresource(source_path, os.path.join(destination_dir, resource_name))
50+
51+
52+
def _convert_ui_files(source_path: str, destination_dir: str, file: str) -> None:
53+
"""Compile .ui file.
54+
55+
Args:
56+
source_path: Source ui. file to compile.
57+
destination_dir: Build directory to put compiled python module in.
58+
file: File name of .ui file.
59+
60+
"""
61+
resource_name = file.replace(".ui", ".py")
62+
_qt.compile_ui_file(source_path, os.path.join(destination_dir, resource_name))
63+
64+
65+
def _compile_file(source_path, destination_dir, file) -> None:
66+
if source_path.endswith(".qrc"):
67+
# A Qt Resource file has been found. it needs to be compiled and moved to build dir.
68+
_convert_qrc(source_path, destination_dir, file)
69+
elif source_path.endswith(".ui"):
70+
_convert_ui_files(source_path, destination_dir, file)
71+
elif file == "qmacro":
72+
_qmacro.create_and_compile_qresource(source_path, destination_dir)
73+
74+
3475
class QtBuildPackage(build_py):
3576
"""Build class that can compile qt files."""
3677

3778
def _compile_and_move_qt_files(self) -> None:
3879
"""Compile qt files and move them to build dir."""
3980
if os.path.exists(self.build_lib):
40-
print("Build dir exists")
4181
shutil.rmtree(self.build_lib)
4282

43-
package_root = "."
83+
root_packages = {
84+
path.split(os.path.sep).pop(0) for path in self.get_source_files()
85+
}
86+
87+
package_root = self.package_dir.get("", ".")
4488
# Travers source code and compile any qt file.
45-
for package in self.packages:
89+
for package in root_packages:
4690
for root, _, files in os.walk(package):
4791
for file in files:
4892
destination_dir = os.path.join(
4993
self.build_lib, os.path.relpath(root, package_root)
5094
)
5195
source_path = os.path.join(root, file)
52-
if source_path.endswith(".qrc"):
53-
# A Qt Resource file has been found. it needs to be compiled and moved to build dir.
54-
self._convert_qrc(source_path, destination_dir, file)
55-
elif source_path.endswith(".ui"):
56-
self._convert_ui_files(source_path, destination_dir, file)
57-
elif file == "qmacro":
96+
if _file_needs_processing(file):
5897
_create_build_dir(destination_dir)
59-
_qmacro.create_and_compile_qresource(
60-
source_path, destination_dir
61-
)
62-
63-
def _convert_qrc(self, source_path: str, destination_dir: str, file: str) -> None:
64-
"""Compile qresource file.
65-
66-
Args:
67-
source_path: Source qresource file to compile.
68-
destination_dir: Build directory to put compiled python module in.
69-
file: File name of qresource.
70-
71-
"""
72-
_create_build_dir(destination_dir)
73-
resource_name = file.replace(".qrc", ".py")
74-
_qt.compile_qresource(source_path, os.path.join(destination_dir, resource_name))
75-
76-
def _convert_ui_files(
77-
self, source_path: str, destination_dir: str, file: str
78-
) -> None:
79-
"""Compile .ui file.
80-
81-
Args:
82-
source_path: Source ui. file to compile.
83-
destination_dir: Build directory to put compiled python module in.
84-
file: File name of .ui file.
85-
86-
"""
87-
_create_build_dir(destination_dir)
88-
resource_name = file.replace(".ui", ".py")
89-
_qt.compile_ui_file(source_path, os.path.join(destination_dir, resource_name))
98+
_compile_file(source_path, destination_dir, file)
9099

91100
def run(self) -> None:
92101
"""Convert qt files and build python package."""
93102
self._compile_and_move_qt_files()
94103
super().run() # Run normal installation.
104+
105+
106+
class QtBuildDevelop(develop):
107+
"""Build class that can compile qt files in dev-mode."""
108+
109+
def _compile(self) -> None:
110+
"""Compile qt files in dev-mode"""
111+
112+
# Travers source code and compile any qt file in package.
113+
for root, _, files in os.walk(self.dist.module_path):
114+
for file in files:
115+
if _file_needs_processing(file):
116+
_compile_file(os.path.join(root, file), root, file)
117+
118+
def run(self) -> None:
119+
"""Convert qt files locally and configure package in dev-mode."""
120+
self._compile()
121+
super().run()

pyside_setup_macro/_qmacro.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,12 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15-
1615
from typing import List
17-
import glob
18-
1916
from xml.dom import minidom
20-
import xml.etree.ElementTree as ET
17+
import glob
2118
import os
2219
import re
20+
import xml.etree.ElementTree as ET
2321

2422
from pyside_setup_macro._qt import compile_qresource
2523

pyside_setup_macro/_qt.py

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,26 @@
1616
import sys
1717
import subprocess
1818

19-
try:
20-
import PySide6 as pyside
21-
except ImportError:
19+
20+
def get_qt_root() -> str:
21+
"""Get root dir of PySide install.
22+
23+
Returns:
24+
Latest available Pyside package root.
25+
26+
Raises:
27+
ModuleNotFoundError: No PySide module found.
28+
29+
"""
2230
try:
23-
import PySide2 as pyside
31+
import PySide6 as pyside
2432
except ImportError:
25-
raise ModuleNotFoundError("No PySide module found!")
26-
33+
try:
34+
import PySide2 as pyside
35+
except ImportError:
36+
raise ModuleNotFoundError("No PySide module found!")
2737

28-
QT_ROOT = os.path.dirname(pyside.__file__)
38+
return os.path.dirname(pyside.__file__)
2939

3040

3141
def get_app(qt_tool: str) -> str:
@@ -39,8 +49,8 @@ def get_app(qt_tool: str) -> str:
3949
4050
"""
4151
if sys.platform != "win32":
42-
return os.path.join(QT_ROOT, "Qt", "libexec", qt_tool)
43-
return os.path.join(QT_ROOT, qt_tool)
52+
return os.path.join(get_qt_root(), "Qt", "libexec", qt_tool)
53+
return os.path.join(get_qt_root(), qt_tool)
4454

4555

4656
def compile_qresource(source: str, destination: str) -> None:

0 commit comments

Comments
 (0)