Browse Source

Compute global setup to avoid duplicate info (#584)

* Compute global setup to avoid duplicate info
should do the same for extra
to build a real packages:
- cp tools/packages/taipy-<pkg>/* .
- python setup.py build_py
- python -m build

* pycodestyle

* comments from FV et FLe

---------

Co-authored-by: Fred Lefévère-Laoide <Fred.Lefevere-Laoide@Taipy.io>
Fred Lefévère-Laoide 1 năm trước cách đây
mục cha
commit
06b7165bfa

+ 1 - 0
.github/workflows/packaging.yml

@@ -34,6 +34,7 @@ jobs:
 
       - name: Install Taipy without dependencies
         run: |
+          cat tools/packages/taipy*/MANIFEST.in > MANIFEST.in
           pip install .
           rm -rf taipy
 

+ 0 - 18
MANIFEST.in

@@ -1,18 +0,0 @@
-include taipy/*.json
-include taipy/gui_core/*.json
-include taipy/gui_core/lib/*.js
-
-include taipy/config/*.pyi
-include taipy/config/*.json
-
-include taipy/core/*.json
-include taipy/core/config/*.json
-
-recursive-include taipy/gui/webapp *
-include taipy/gui/version.json
-include taipy/gui/viselements.json
-include taipy/gui/*.pyi
-
-include taipy/rest/*.json
-
-recursive-include taipy/templates *

+ 7 - 36
setup.py

@@ -21,7 +21,7 @@ from setuptools.command.build_py import build_py
 
 root_folder = Path(__file__).parent
 
-readme = Path(root_folder / "README.md").read_text("UTF-8")
+readme = (root_folder / "README.md").read_text("UTF-8")
 
 with open(root_folder / "taipy" / "version.json") as version_file:
     version = json.load(version_file)
@@ -29,43 +29,14 @@ with open(root_folder / "taipy" / "version.json") as version_file:
     if vext := version.get("ext"):
         version_string = f"{version_string}.{vext}"
 
-requirements = [
-    "backports.zoneinfo>=0.2.1,<0.3;python_version<'3.9'",
-    "cookiecutter>=2.1.1,<2.2",
-    "toml>=0.10,<0.11",
-    "deepdiff>=6.2,<6.3",
-    "pyarrow>=10.0.1,<11.0",
-    "networkx>=2.6,<3.0",
-    "openpyxl>=3.1.2,<3.2",
-    "modin[dask]>=0.23.0,<1.0",
-    "pymongo[srv]>=4.2.0,<5.0",
-    "sqlalchemy>=2.0.16,<2.1",
-    "flask>=3.0.0,<3.1",
-    "flask-cors>=4.0.0,<5.0",
-    "flask-socketio>=5.3.6,<6.0",
-    "markdown>=3.4.4,<4.0",
-    "pandas>=2.0.0,<3.0",
-    "python-dotenv>=1.0.0,<1.1",
-    "pytz>=2021.3,<2022.2",
-    "tzlocal>=3.0,<5.0",
-    "backports.zoneinfo>=0.2.1,<0.3;python_version<'3.9'",
-    "gevent>=23.7.0,<24.0",
-    "gevent-websocket>=0.10.1,<0.11",
-    "kthread>=0.2.3,<0.3",
-    "gitignore-parser>=0.1,<0.2",
-    "simple-websocket>=0.10.1,<1.0",
-    "twisted>=23.8.0,<24.0",
-    "flask-restful>=0.3.9,<0.4",
-    "passlib>=1.7.4,<1.8",
-    "marshmallow>=3.20.1,<3.30",
-    "apispec[yaml]>=6.3,<7.0",
-    "apispec-webframeworks>=0.5.2,<0.6",
-]
-
 
 def get_requirements():
-    # TODO get requirements from the different setups in tools/packages (removing taipy packages)
-    return requirements
+    # get requirements from the different setups in tools/packages (removing taipy packages)
+    reqs = set()
+    for pkg in (root_folder / "tools" / "packages").iterdir():
+        reqs.update((pkg / "setup.requirements.txt").read_text("UTF-8").splitlines())
+
+    return [r for r in reqs if r and not r.startswith("taipy")]
 
 
 test_requirements = ["pytest>=3.8"]

+ 2 - 2
tools/packages/taipy-config/MANIFEST.in

@@ -1,2 +1,2 @@
-include ../../../taipy/config/*.pyi
-include ../../../taipy/config/*.json
+include taipy/config/*.pyi
+include taipy/config/*.json

+ 2 - 4
tools/packages/taipy-config/setup.py

@@ -18,8 +18,7 @@ from pathlib import Path
 
 from setuptools import find_packages, setup
 
-# assuming we're in tools/packages/taipy-config
-root_folder = Path(__file__).parent.parent.parent.parent
+root_folder = Path(__file__).parent
 
 readme = Path(root_folder / "README.md").read_text("UTF-8")
 
@@ -29,7 +28,7 @@ with open(root_folder / "taipy" / "config" / "version.json") as version_file:
     if vext := version.get("ext"):
         version_string = f"{version_string}.{vext}"
 
-requirements = ["toml>=0.10,<0.11", "deepdiff>=6.2,<6.3"]
+requirements = [r for r in (root_folder / "setup.requirements.txt").read_text("UTF-8").splitlines() if r]
 
 test_requirements = ["pytest>=3.8"]
 
@@ -54,7 +53,6 @@ setup(
     license="Apache License 2.0",
     keywords="taipy-config",
     name="taipy-config",
-    package_dir={"": "../../.."},
     packages=find_packages(
         where=root_folder, include=["taipy", "taipy.config", "taipy.config.*", "taipy.logger", "taipy.logger.*"]
     ),

+ 2 - 0
tools/packages/taipy-config/setup.requirements.txt

@@ -0,0 +1,2 @@
+toml>=0.10,<0.11
+deepdiff>=6.2,<6.3

+ 2 - 2
tools/packages/taipy-core/MANIFEST.in

@@ -1,2 +1,2 @@
-include ../../../taipy/core/*.json
-include ../../../taipy/core/config/*.json
+include taipy/core/*.json
+include taipy/core/config/*.json

+ 2 - 12
tools/packages/taipy-core/setup.py

@@ -18,7 +18,7 @@ from pathlib import Path
 
 from setuptools import find_packages, setup
 
-root_folder = Path(__file__).parent.parent.parent.parent
+root_folder = Path(__file__).parent
 
 readme = Path(root_folder / "README.md").read_text("UTF-8")
 
@@ -28,16 +28,7 @@ with open(root_folder / "taipy" / "core" / "version.json") as version_file:
     if vext := version.get("ext"):
         version_string = f"{version_string}.{vext}"
 
-requirements = [
-    "pyarrow>=10.0.1,<11.0",
-    "networkx>=2.6,<3.0",
-    "openpyxl>=3.1.2,<3.2",
-    "modin[dask]>=0.23.0,<1.0",
-    "pymongo[srv]>=4.2.0,<5.0",
-    "sqlalchemy>=2.0.16,<2.1",
-    "toml>=0.10,<0.11",
-    "taipy-config",
-]
+requirements = [r for r in (root_folder / "setup.requirements.txt").read_text("UTF-8").splitlines() if r]
 
 test_requirements = ["pytest>=3.8"]
 
@@ -69,7 +60,6 @@ setup(
     license="Apache License 2.0",
     keywords="taipy-core",
     name="taipy-core",
-    package_dir={"": "../../.."},
     packages=find_packages(where=root_folder, include=["taipy", "taipy.core", "taipy.core.*"]),
     include_package_data=True,
     test_suite="tests",

+ 8 - 0
tools/packages/taipy-core/setup.requirements.txt

@@ -0,0 +1,8 @@
+pyarrow>=10.0.1,<11.0
+networkx>=2.6,<3.0
+openpyxl>=3.1.2,<3.2
+modin[dask]>=0.23.0,<1.0
+pymongo[srv]>=4.2.0,<5.0
+sqlalchemy>=2.0.16,<2.1
+toml>=0.10,<0.11
+taipy-config

+ 4 - 4
tools/packages/taipy-gui/MANIFEST.in

@@ -1,4 +1,4 @@
-recursive-include ../../../taipy/gui/webapp *
-include ../../../taipy/gui/version.json
-include ../../../taipy/gui/viselements.json
-include ../../../taipy/gui/*.pyi
+recursive-include taipy/gui/webapp *
+include taipy/gui/version.json
+include taipy/gui/viselements.json
+include taipy/gui/*.pyi

+ 21 - 23
tools/packages/taipy-gui/setup.py

@@ -14,13 +14,14 @@
 """The setup script."""
 
 import json
+import platform
 from pathlib import Path
 import subprocess
 
 from setuptools import find_packages, setup
 from setuptools.command.build_py import build_py
 
-root_folder = Path(__file__).parent.parent.parent.parent
+root_folder = Path(__file__).parent
 
 readme = Path(root_folder / "README.md").read_text("UTF-8")
 
@@ -30,24 +31,7 @@ with open(root_folder / "taipy" / "gui" / "version.json") as version_file:
     if vext := version.get("ext"):
         version_string = f"{version_string}.{vext}"
 
-requirements = [
-    "flask>=3.0.0,<3.1",
-    "flask-cors>=4.0.0,<5.0",
-    "flask-socketio>=5.3.6,<6.0",
-    "markdown>=3.4.4,<4.0",
-    "pandas>=2.0.0,<3.0",
-    "python-dotenv>=1.0.0,<1.1",
-    "pytz>=2021.3,<2022.2",
-    "tzlocal>=3.0,<5.0",
-    "backports.zoneinfo>=0.2.1,<0.3;python_version<'3.9'",
-    "gevent>=23.7.0,<24.0",
-    "gevent-websocket>=0.10.1,<0.11",
-    "kthread>=0.2.3,<0.3",
-    "taipy-config",
-    "gitignore-parser>=0.1,<0.2",
-    "simple-websocket>=0.10.1,<1.0",
-    "twisted>=23.8.0,<24.0",
-]
+requirements = [r for r in (root_folder / "setup.requirements.txt").read_text("UTF-8").splitlines() if r]
 
 test_requirements = ["pytest>=3.8"]
 
@@ -63,9 +47,24 @@ extras_require = {
 
 class NPMInstall(build_py):
     def run(self):
-        subprocess.run(
-            ["python", "bundle_build.py", "gui"], cwd=root_folder / "tools" / "frontend", check=True, shell=True
-        )
+        with_shell = platform.system() == "Windows"
+        print(f"Building taipy-gui frontend bundle in {root_folder}.")
+        already_exists = (root_folder / "taipy" / "gui" / "webapp" / "index.html").exists()
+        if already_exists:
+            print(f'Found taipy-gui frontend bundle in {root_folder  / "taipy" / "gui" / "webapp"}.')
+        else:
+            subprocess.run(
+                ["npm", "ci"], cwd=root_folder / "frontend" / "taipy-gui" / "dom", check=True, shell=with_shell
+            )
+            subprocess.run(
+                ["npm", "ci", "--omit=optional"],
+                cwd=root_folder / "frontend" / "taipy-gui",
+                check=True,
+                shell=with_shell,
+            )
+            subprocess.run(
+                ["npm", "run", "build"], cwd=root_folder / "frontend" / "taipy-gui", check=True, shell=with_shell
+            )
         build_py.run(self)
 
 
@@ -91,7 +90,6 @@ setup(
     include_package_data=True,
     keywords="taipy-gui",
     name="taipy-gui",
-    package_dir={"": "../../.."},
     packages=find_packages(where=root_folder, include=["taipy", "taipy.gui", "taipy.gui.*"]),
     test_suite="tests",
     tests_require=test_requirements,

+ 16 - 0
tools/packages/taipy-gui/setup.requirements.txt

@@ -0,0 +1,16 @@
+flask>=3.0.0,<3.1
+flask-cors>=4.0.0,<5.0
+flask-socketio>=5.3.6,<6.0
+markdown>=3.4.4,<4.0
+pandas>=2.0.0,<3.0
+python-dotenv>=1.0.0,<1.1
+pytz>=2021.3,<2022.2
+tzlocal>=3.0,<5.0
+backports.zoneinfo>=0.2.1,<0.3;python_version<'3.9'
+gevent>=23.7.0,<24.0
+gevent-websocket>=0.10.1,<0.11
+kthread>=0.2.3,<0.3
+taipy-config
+gitignore-parser>=0.1,<0.2
+simple-websocket>=0.10.1,<1.0
+twisted>=23.8.0,<24.0

+ 1 - 1
tools/packages/taipy-rest/MANIFEST.in

@@ -1 +1 @@
-include ../../../taipy/rest/*.json
+include taipy/rest/*.json

+ 5 - 12
tools/packages/taipy-rest/setup.py

@@ -12,9 +12,9 @@ import json
 
 from pathlib import Path
 
-from setuptools import find_namespace_packages, find_packages, setup
+from setuptools import find_packages, setup
 
-root_folder = Path(__file__).parent.parent.parent.parent
+root_folder = Path(__file__).parent
 
 readme = Path(root_folder / "README.md").read_text("UTF-8")
 
@@ -24,6 +24,8 @@ with open(root_folder / "taipy" / "rest" / "version.json") as version_file:
     if vext := version.get("ext"):
         version_string = f"{version_string}.{vext}"
 
+requirements = [r for r in (root_folder / "setup.requirements.txt").read_text("UTF-8").splitlines() if r]
+
 setup(
     author="Avaiga",
     name="taipy-rest",
@@ -31,7 +33,6 @@ setup(
     python_requires=">=3.8",
     version=version_string,
     author_email="dev@taipy.io",
-    package_dir={"": "../../.."},
     packages=find_packages(where=root_folder, include=["taipy", "taipy.rest", "taipy.rest.*"]),
     include_package_data=True,
     long_description=readme,
@@ -48,13 +49,5 @@ setup(
         "Programming Language :: Python :: 3.10",
         "Programming Language :: Python :: 3.11",
     ],
-    install_requires=[
-        "flask>=3.0.0,<3.1",
-        "flask-restful>=0.3.9,<0.4",
-        "passlib>=1.7.4,<1.8",
-        "marshmallow>=3.20.1,<3.30",
-        "apispec[yaml]>=6.3,<7.0",
-        "apispec-webframeworks>=0.5.2,<0.6",
-        "taipy-core@git+https://git@github.com/Avaiga/taipy-core.git@develop",
-    ],
+    install_requires=requirements,
 )

+ 7 - 0
tools/packages/taipy-rest/setup.requirements.txt

@@ -0,0 +1,7 @@
+flask>=3.0.0,<3.1
+flask-restful>=0.3.9,<0.4
+passlib>=1.7.4,<1.8
+marshmallow>=3.20.1,<3.30
+apispec[yaml]>=6.3,<7.0
+apispec-webframeworks>=0.5.2,<0.6
+taipy-core

+ 1 - 1
tools/packages/taipy-templates/MANIFEST.in

@@ -1 +1 @@
-recursive-include ../../../taipy/templates *
+recursive-include taipy/templates *

+ 4 - 2
tools/packages/taipy-templates/setup.py

@@ -17,7 +17,7 @@ from pathlib import Path
 
 from setuptools import find_packages, setup
 
-root_folder = Path(__file__).parent.parent.parent.parent
+root_folder = Path(__file__).parent
 
 readme = Path(root_folder / "README.md").read_text("UTF-8")
 
@@ -27,6 +27,8 @@ with open(root_folder / "taipy" / "templates" / "version.json") as version_file:
     if vext := version.get("ext"):
         version_string = f"{version_string}.{vext}"
 
+requirements = [r for r in (root_folder / "setup.requirements.txt").read_text("UTF-8").splitlines() if r]
+
 test_requirements = ["pytest>=3.8"]
 
 setup(
@@ -49,7 +51,7 @@ setup(
     long_description_content_type="text/markdown",
     keywords="taipy-templates",
     name="taipy-templates",
-    package_dir={"": "../../.."},
+    install_requires=requirements,
     packages=find_packages(where=root_folder, include=["taipy"]),
     include_package_data=True,
     test_suite="tests",

+ 0 - 0
tools/packages/taipy-templates/setup.requirements.txt


+ 3 - 3
tools/packages/taipy/MANIFEST.in

@@ -1,3 +1,3 @@
-include ../../../taipy/*.json
-include ../../../taipy/gui_core/*.json
-include ../../../taipy/gui_core/lib/*.js
+include taipy/*.json
+include taipy/gui_core/*.json
+include taipy/gui_core/lib/*.js

+ 22 - 15
tools/packages/taipy/setup.py

@@ -13,15 +13,16 @@
 
 
 import json
+import platform
 from pathlib import Path
+import subprocess
 
 from setuptools import find_packages, setup
 from setuptools.command.build_py import build_py
-import subprocess
 
-root_folder = Path(__file__).parent.parent.parent.parent
+root_folder = Path(__file__).parent
 
-readme = Path(root_folder / "README.md").read_text("UTF-8")
+readme = (root_folder / "README.md").read_text("UTF-8")
 
 with open(root_folder / "taipy" / "version.json") as version_file:
     version = json.load(version_file)
@@ -29,13 +30,7 @@ with open(root_folder / "taipy" / "version.json") as version_file:
     if vext := version.get("ext"):
         version_string = f"{version_string}.{vext}"
 
-requirements = [
-    "backports.zoneinfo>=0.2.1,<0.3;python_version<'3.9'",
-    "cookiecutter>=2.1.1,<2.2",
-    "taipy-gui",
-    "taipy-rest",
-    "taipy-templates",
-]
+requirements = [r for r in (root_folder / "setup.requirements.txt").read_text("UTF-8").splitlines() if r]
 
 test_requirements = ["pytest>=3.8"]
 
@@ -53,9 +48,22 @@ extras_require = {
 
 class NPMInstall(build_py):
     def run(self):
-        subprocess.run(
-            ["python", "bundle_build.py", "taipy"], cwd=root_folder / "tools" / "frontend", check=True, shell=True
-        )
+        with_shell = platform.system() == "Windows"
+        print(f"Building taipy frontend bundle in {root_folder}.")
+        already_exists = (root_folder / "taipy" / "gui_core" / "lib" / "taipy-gui-core.js").exists()
+        if already_exists:
+            print(f'Found taipy frontend bundle in {root_folder / "taipy" / "gui_core" / "lib"}.')
+        else:
+            # Specify the correct path to taipy-gui in gui/.env file
+            env_file_path = root_folder / "frontend" / "taipy" / ".env"
+            if not env_file_path.exists():
+                with open(env_file_path, "w") as env_file:
+                    env_file.write(f"TAIPY_GUI_DIR={root_folder}\n")
+            subprocess.run(["npm", "ci"], cwd=root_folder / "frontend" / "taipy", check=True, shell=with_shell)
+            subprocess.run(
+                ["npm", "run", "build"], cwd=root_folder / "frontend" / "taipy", check=True, shell=with_shell
+            )
+
         build_py.run(self)
 
 
@@ -85,8 +93,7 @@ setup(
     long_description_content_type="text/markdown",
     keywords="taipy",
     name="taipy",
-    package_dir={"": "../../.."},
-    packages=find_packages(where=root_folder, include=["taipy", "taipy.gui_core", "taipy._cli"]),
+    packages=find_packages(include=["taipy", "taipy._cli", "taipy.gui_core"]),
     include_package_data=True,
     test_suite="tests",
     url="https://github.com/avaiga/taipy",

+ 5 - 0
tools/packages/taipy/setup.requirements.txt

@@ -0,0 +1,5 @@
+backports.zoneinfo>=0.2.1,<0.3;python_version<'3.9'
+cookiecutter>=2.1.1,<2.2
+taipy-gui
+taipy-rest
+taipy-templates