Skip to content

Commit 69f78e1

Browse files
Bordalantiga
authored andcommitted
pkg: parse local versions (#13933)
* pkg: parse local versions * offline * str * manifest * ci (cherry picked from commit 47833df)
1 parent a52782e commit 69f78e1

File tree

4 files changed

+54
-21
lines changed

4 files changed

+54
-21
lines changed

.actions/setup_tools.py

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
import urllib.request
2323
from datetime import datetime
2424
from importlib.util import module_from_spec, spec_from_file_location
25-
from itertools import groupby
25+
from itertools import chain, groupby
2626
from types import ModuleType
2727
from typing import List
2828

@@ -45,7 +45,7 @@ def _load_py_module(name: str, location: str) -> ModuleType:
4545
def load_requirements(
4646
path_dir: str, file_name: str = "base.txt", comment_char: str = "#", unfreeze: bool = True
4747
) -> List[str]:
48-
"""Load requirements from a file.
48+
"""Loading requirements from a file.
4949
5050
>>> path_req = os.path.join(_PROJECT_ROOT, "requirements")
5151
>>> load_requirements(path_req) # doctest: +ELLIPSIS +NORMALIZE_WHITESPACE
@@ -438,3 +438,33 @@ def _download_frontend(root: str = _PROJECT_ROOT):
438438
# If installing from source without internet connection, we don't want to break the installation
439439
except Exception:
440440
print("The Lightning UI downloading has failed!")
441+
442+
443+
def _adjust_require_versions(source_dir: str = "src", req_dir: str = "requirements") -> None:
444+
"""Parse the base requirements and append as version adjustments if needed `pkg>=X1.Y1.Z1,==X2.Y2.*`."""
445+
reqs = load_requirements(req_dir, file_name="base.txt")
446+
for i, req in enumerate(reqs):
447+
pkg_name = req[: min(req.index(c) for c in ">=" if c in req)]
448+
ver_ = parse_version_from_file(os.path.join(source_dir, pkg_name))
449+
if not ver_:
450+
continue
451+
ver2 = ".".join(ver_.split(".")[:2] + ["*"])
452+
reqs[i] = f"{req}, =={ver2}"
453+
454+
with open(os.path.join(req_dir, "base.txt"), "w") as fp:
455+
fp.writelines([ln + os.linesep for ln in reqs])
456+
457+
458+
def _load_aggregate_requirements(req_dir: str = "requirements", freeze_requirements: bool = False) -> None:
459+
"""Load all base requirements from all particular packages and prune duplicates."""
460+
requires = [
461+
load_requirements(d, file_name="base.txt", unfreeze=not freeze_requirements)
462+
for d in glob.glob(os.path.join(req_dir, "*"))
463+
if os.path.isdir(d)
464+
]
465+
if not requires:
466+
return None
467+
# TODO: add some smarter version aggregation per each package
468+
requires = list(chain(*requires))
469+
with open(os.path.join(req_dir, "base.txt"), "w") as fp:
470+
fp.writelines([ln + os.linesep for ln in requires])

requirements/base.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
pytorch_lightning>=1.6.5
2+
lightning_app>=0.5.2

setup.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,9 @@
6060
# http://blog.ionelmc.ro/2014/05/25/python-packaging/
6161
_PATH_ROOT = os.path.dirname(__file__)
6262
_PATH_SRC = os.path.join(_PATH_ROOT, "src")
63+
_PATH_REQUIRE = os.path.join(_PATH_ROOT, "requirements")
6364
_PATH_SETUP = os.path.join(_PATH_SRC, _REAL_PKG_NAME or "lightning", "__setup__.py")
65+
_FREEZE_REQUIREMENTS = bool(int(os.environ.get("FREEZE_REQUIREMENTS", 0)))
6466

6567

6668
# Hardcode the env variable from time of package creation, otherwise it fails during installation
@@ -89,11 +91,19 @@ def _load_py_module(name: str, location: str) -> ModuleType:
8991
# engineer specific practices
9092
if __name__ == "__main__":
9193
_SETUP_TOOLS = _load_py_module(name="setup_tools", location=os.path.join(".actions", "setup_tools.py"))
94+
95+
if _PACKAGE_NAME == "lightning": # install just the meta package
96+
_SETUP_TOOLS._adjust_require_versions(_PATH_SRC, _PATH_REQUIRE)
97+
elif _PACKAGE_NAME not in _PACKAGE_MAPPING: # install everything
98+
_SETUP_TOOLS._load_aggregate_requirements(_PATH_REQUIRE, _FREEZE_REQUIREMENTS)
99+
92100
if _PACKAGE_NAME not in _PACKAGE_MAPPING:
93101
_SETUP_TOOLS.set_version_today(os.path.join(_PATH_SRC, "lightning", "__version__.py"))
102+
94103
for lit_name, pkg_name in _PACKAGE_MAPPING.items():
95104
# fixme: if we run creation of meta pkg against stable we shall pull the source
96105
_SETUP_TOOLS.create_meta_package(os.path.join(_PATH_ROOT, "src"), pkg_name, lit_name)
106+
97107
_SETUP_MODULE = _load_py_module(name="pkg_setup", location=_PATH_SETUP)
98108
_SETUP_MODULE._adjust_manifest(pkg_name=_REAL_PKG_NAME)
99109
setup(**_SETUP_MODULE._setup_args(pkg_name=_REAL_PKG_NAME))

src/lightning/__setup__.py

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
1-
import glob
21
import os.path
32
from importlib.util import module_from_spec, spec_from_file_location
4-
from itertools import chain
53
from types import ModuleType
64
from typing import Any, Dict
75

@@ -10,6 +8,7 @@
108
_PROJECT_ROOT = "."
119
_SOURCE_ROOT = os.path.join(_PROJECT_ROOT, "src")
1210
_PACKAGE_ROOT = os.path.join(_SOURCE_ROOT, "lightning")
11+
_PATH_REQUIREMENTS = os.path.join("requirements")
1312
_FREEZE_REQUIREMENTS = bool(int(os.environ.get("FREEZE_REQUIREMENTS", 0)))
1413

1514

@@ -22,6 +21,9 @@ def _load_py_module(name: str, location: str) -> ModuleType:
2221
return py
2322

2423

24+
_SETUP_TOOLS = _load_py_module("setup_tools", os.path.join(_PROJECT_ROOT, ".actions", "setup_tools.py"))
25+
26+
2527
def _adjust_manifest(**kwargs: Any) -> None:
2628
# todo: consider rather aggregation of particular manifest adjustments
2729
manifest_path = os.path.join(_PROJECT_ROOT, "MANIFEST.in")
@@ -31,6 +33,7 @@ def _adjust_manifest(**kwargs: Any) -> None:
3133
if kwargs["pkg_name"] == "lightning":
3234
lines += [
3335
"recursive-include src/lightning *.md",
36+
"include requirements/base.txt",
3437
# fixme: this is strange, this shall work with setup find package - include
3538
"prune src/lightning_app",
3639
"prune src/pytorch_lightning",
@@ -47,29 +50,17 @@ def _adjust_manifest(**kwargs: Any) -> None:
4750

4851

4952
def _setup_args(**kwargs: Any) -> Dict[str, Any]:
50-
_path_setup_tools = os.path.join(_PROJECT_ROOT, ".actions", "setup_tools.py")
51-
_setup_tools = _load_py_module("setup_tools", _path_setup_tools)
5253
_about = _load_py_module("about", os.path.join(_PACKAGE_ROOT, "__about__.py"))
5354
_version = _load_py_module("version", os.path.join(_PACKAGE_ROOT, "__version__.py"))
54-
_long_description = _setup_tools.load_readme_description(
55+
_long_description = _SETUP_TOOLS.load_readme_description(
5556
_PROJECT_ROOT, homepage=_about.__homepage__, version=_version.version
5657
)
57-
if kwargs["pkg_name"] == "lightning":
58-
_include_pkgs = ["lightning", "lightning.*"]
59-
# todo: generate this list automatically with parsing feature pkg versions
60-
_requires = ["pytorch-lightning>=1.6.5, <1.7.0", "lightning-app>=0.5.2, <0.6.0"]
61-
else:
62-
_include_pkgs = ["*"]
63-
_requires = [
64-
_setup_tools.load_requirements(d, unfreeze=not _FREEZE_REQUIREMENTS)
65-
for d in glob.glob(os.path.join("requirements", "*"))
66-
if os.path.isdir(d)
67-
]
68-
_requires = list(chain(*_requires))
58+
_include_pkgs = ["lightning", "lightning.*"] if kwargs["pkg_name"] == "lightning" else ["*"]
59+
6960
# TODO: consider invaliding some additional arguments from packages, for example if include data or safe to zip
7061

7162
# TODO: remove this once lightning-ui package is ready as a dependency
72-
_setup_tools._download_frontend(_PROJECT_ROOT)
63+
_SETUP_TOOLS._download_frontend(_PROJECT_ROOT)
7364

7465
return dict(
7566
name="lightning",
@@ -94,7 +85,7 @@ def _setup_args(**kwargs: Any) -> Dict[str, Any]:
9485
],
9586
},
9687
setup_requires=[],
97-
install_requires=_requires,
88+
install_requires=_SETUP_TOOLS.load_requirements(_PATH_REQUIREMENTS, unfreeze=True),
9889
extras_require={}, # todo: consider porting all other packages extras with prefix
9990
project_urls={
10091
"Bug Tracker": "https://github.com/Lightning-AI/lightning/issues",

0 commit comments

Comments
 (0)