Skip to content

Commit 7198c20

Browse files
committed
Tweaks to new plug-in scheme
Signed-off-by: Matthew Ballance <matt.ballance@gmail.com>
1 parent 6afe542 commit 7198c20

14 files changed

+66
-28
lines changed

src/ivpm/__init__.py

+5
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,11 @@
2828
from .utils import load_project_package_info
2929
import ivpm.setup
3030

31+
from .package import Package
32+
from .package_factory import PackageFactory
33+
from .package_factory_rgy import PackageFactoryRgy
34+
from .update_info import UpdateInfo
35+
3136
def get_pkg_version(setup_py_path):
3237
"""Returns the package version based on the etc/ivpm.info file"""
3338
rootdir = os.path.dirname(os.path.realpath(setup_py_path))

src/ivpm/__main__.py

+27-2
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ def fetch_file(
163163

164164

165165

166-
def get_parser():
166+
def get_parser(parser_ext = None):
167167
"""Create the argument parser"""
168168
parser = argparse.ArgumentParser(prog="ivpm")
169169

@@ -230,10 +230,35 @@ def get_parser():
230230
snapshot_cmd.add_argument("snapshot_dir",
231231
help="Specifies the directory where the snapshot will be created")
232232

233+
if parser_ext is not None:
234+
for ext in parser_ext:
235+
ext(subparser)
236+
233237
return parser
234238

235239
def main(project_dir=None):
236-
parser = get_parser()
240+
241+
# First things first: load any extensions
242+
import sys
243+
if sys.version_info < (3, 10):
244+
from importlib_metadata import entry_points
245+
else:
246+
from importlib.metadata import entry_points
247+
248+
discovered_plugins = entry_points(group='ivpm.ext')
249+
parser_ext = []
250+
for p in discovered_plugins:
251+
try:
252+
mod = p.load()
253+
if hasattr(mod, "ivpm_subcommand"):
254+
parser_ext.append(getattr(mod, "ivpm_subcommand"))
255+
except Exception as e:
256+
print("Error: caught exception while loading IVPM extension %s (%s)" %(
257+
p.name,
258+
str(e)))
259+
raise e
260+
261+
parser = get_parser(parser_ext)
237262

238263
args = parser.parse_args()
239264

src/ivpm/cmds/cmd_update.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ def __call__(self, args):
4141
args.project_dir,
4242
dep_set=ds_name,
4343
anonymous=args.anonymous
44-
)
44+
).update()
4545

4646

4747
# with open(os.path.join(packages_dir, "sve.F"), "w") as fp:

src/ivpm/ivpm_yaml_reader.py

+4
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,10 @@ def read(self, fp, name) -> ProjInfo:
5151
else:
5252
ret.version = None
5353

54+
if "deps-dir" in pkg.keys():
55+
ret.deps_dir = pkg["deps-dir"]
56+
57+
5458
if "deps" in pkg.keys() or "dev-deps" in pkg.keys():
5559
# old-style format
5660
print("Note: Package %s uses old-style ivpm.yaml format" % ret.name)

src/ivpm/package.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ def build(self, pkgs_info):
8888
def update(self, update_info : UpdateInfo) -> 'ProjInfo':
8989
from .project_info_reader import ProjectInfoReader
9090
info = ProjectInfoReader(
91-
os.path.join(update_info.packages_dir, self.name)).read()
91+
os.path.join(update_info.deps_dir, self.name)).read()
9292

9393
return info
9494

src/ivpm/package_dir.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ def update(self, update_info : UpdateInfo):
4343
src_path,
4444
self.name
4545
))
46-
dst_path = os.path.join(update_info.packages_dir, self.name)
46+
dst_path = os.path.join(update_info.deps_dir, self.name)
4747

4848
if os.path.isdir(dst_path):
4949
note("Destination directory for %s exists ... skipping copy" % self.name)

src/ivpm/package_file.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ class PackageFile(PackageURL):
3535
def update(self, update_info : UpdateInfo) -> ProjInfo:
3636
from .project_info_reader import ProjectInfoReader
3737

38-
pkg_dir = os.path.join(update_info.packages_dir, self.name)
38+
pkg_dir = os.path.join(update_info.deps_dir, self.name)
3939
self.path = pkg_dir.replace("\\", "/")
4040

4141
# Install (unpack) the file

src/ivpm/package_git.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ class PackageGit(Package):
3636
anonymous : bool = None
3737

3838
def update(self, update_info : UpdateInfo):
39-
pkg_dir = os.path.join(update_info.packages_dir, self.name)
39+
pkg_dir = os.path.join(update_info.deps_dir, self.name)
4040
self.path = pkg_dir.replace("\\", "/")
4141

4242
if os.path.exists(pkg_dir):
@@ -45,7 +45,7 @@ def update(self, update_info : UpdateInfo):
4545
note("loading package %s" % self.name)
4646

4747
cwd = os.getcwd()
48-
os.chdir(update_info.packages_dir)
48+
os.chdir(update_info.deps_dir)
4949
sys.stdout.flush()
5050

5151
git_cmd = ["git", "clone"]
@@ -87,7 +87,7 @@ def update(self, update_info : UpdateInfo):
8787

8888
# Checkout a specific commit
8989
if self.commit is not None:
90-
os.chdir(os.path.join(self.packages_dir, self.name))
90+
os.chdir(os.path.join(self.deps_dir, self.name))
9191
git_cmd = "git reset --hard %s" % self.commit
9292
status = os.system(git_cmd)
9393

@@ -97,7 +97,7 @@ def update(self, update_info : UpdateInfo):
9797

9898

9999
# TODO: Existence of .gitmodules should trigger this
100-
os.chdir(os.path.join(update_info.packages_dir, self.name))
100+
os.chdir(os.path.join(update_info.deps_dir, self.name))
101101
sys.stdout.flush()
102102
status = os.system("git submodule update --init --recursive")
103103
os.chdir(cwd)

src/ivpm/package_handler_python.py

+9-9
Original file line numberDiff line numberDiff line change
@@ -145,10 +145,10 @@ def update(self, update_info : UpdateInfo):
145145
setup_deps_pkgs.append(pkgs_info[dep])
146146

147147
requirements_path = os.path.join(
148-
update_info.packages_dir, "python_pkgs_%d.txt" % (
148+
update_info.deps_dir, "python_pkgs_%d.txt" % (
149149
len(python_requirements_paths)+1))
150150
self._write_requirements_txt(
151-
update_info.packages_dir,
151+
update_info.deps_dir,
152152
setup_deps_pkgs,
153153
requirements_path)
154154
python_requirements_paths.append(requirements_path)
@@ -162,11 +162,11 @@ def update(self, update_info : UpdateInfo):
162162

163163
if len(python_pkgs) > 0:
164164
requirements_path = os.path.join(
165-
update_info.packages_dir, "python_pkgs_%d.txt" % (
165+
update_info.deps_dir, "python_pkgs_%d.txt" % (
166166
len(python_requirements_paths)+1))
167167

168168
self._write_requirements_txt(
169-
update_info.packages_dir,
169+
update_info.deps_dir,
170170
python_pkgs,
171171
requirements_path)
172172
python_requirements_paths.append(requirements_path)
@@ -197,9 +197,9 @@ def update(self, update_info : UpdateInfo):
197197

198198
if len(python_pkgs):
199199
requirements_path = os.path.join(
200-
packages_dir, "python_pkgs_%d.txt" % (len(python_requirements_paths)+1))
200+
deps_dir, "python_pkgs_%d.txt" % (len(python_requirements_paths)+1))
201201
self._write_requirements_txt(
202-
packages_dir,
202+
deps_dir,
203203
python_pkgs,
204204
requirements_path)
205205
python_requirements_paths.append(requirements_path)
@@ -214,12 +214,12 @@ def update(self, update_info : UpdateInfo):
214214
note("Installing Python dependencies in %d phases" % len(python_requirements_paths))
215215
for reqfile in python_requirements_paths:
216216
cwd = os.getcwd()
217-
os.chdir(os.path.join(packages_dir))
217+
os.chdir(os.path.join(deps_dir))
218218
cmd = [
219-
get_venv_python(os.path.join(packages_dir, "python")),
219+
get_venv_python(os.path.join(deps_dir, "python")),
220220
"-m",
221221
"ivpm.pywrap",
222-
get_venv_python(os.path.join(packages_dir, "python")),
222+
get_venv_python(os.path.join(deps_dir, "python")),
223223
"-m",
224224
"pip",
225225
"install",

src/ivpm/package_http.py

+4-3
Original file line numberDiff line numberDiff line change
@@ -26,22 +26,23 @@
2626
import dataclasses as dc
2727
from .package_file import PackageFile
2828
from .update_info import UpdateInfo
29+
from .package import SourceType2Ext
2930

3031
class PackageHttp(PackageFile):
3132

3233
def update(self, update_info : UpdateInfo):
33-
pkg_dir = os.path.join(update_info.packages_dir, self.name)
34+
pkg_dir = os.path.join(update_info.deps_dir, self.name)
3435
self.path = pkg_dir.replace("\\", "/")
3536

3637
# Need to fetch, then unpack these
37-
download_dir = os.path.join(update_info.packages_dir, ".download")
38+
download_dir = os.path.join(update_info.deps_dir, ".download")
3839

3940
if not os.path.isdir(download_dir):
4041
os.makedirs(download_dir)
4142

4243
# if pkg.src_type not in SourceType2Ext.keys():
4344
# fatal("Unsupported source-type %s for package %s" % (str(pkg.src_type), pkg.name))
44-
filename = self.name + SourceType2Ext[pkg.src_type]
45+
filename = self.name + SourceType2Ext[self.src_type]
4546

4647
pkg_path = os.path.join(download_dir, filename)
4748

src/ivpm/package_updater.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ def __init__(self,
2828
anonymous_git=False,
2929
load=True):
3030
self.debug = False
31-
self.packages_dir = packages_dir
31+
self.deps_dir = packages_dir
3232
self.all_pkgs = PackagesInfo("root")
3333
self.new_deps = []
3434
self.anonymous_git = anonymous_git
@@ -114,14 +114,14 @@ def _update_pkg(self, pkg : Package) -> ProjInfo:
114114
"""Loads a single package. Returns any dependencies"""
115115
must_update=False
116116

117-
update_info = UpdateInfo(self.packages_dir)
117+
update_info = UpdateInfo(self.deps_dir)
118118

119119
print("********************************************************************")
120120
print("* Processing package %s" % pkg.name)
121121
print("********************************************************************")
122122

123123

124-
pkg_dir = os.path.join(self.packages_dir, pkg.name)
124+
pkg_dir = os.path.join(self.deps_dir, pkg.name)
125125
pkg.path = pkg_dir.replace("\\", "/")
126126

127127
info = pkg.update(update_info)
@@ -169,7 +169,7 @@ def _update_pkg(self, pkg : Package) -> ProjInfo:
169169
# check what we have
170170
if pkg.pkg_type == PackageType.Unknown:
171171
for py in ("setup.py", "pyproject.toml"):
172-
if os.path.isfile(os.path.join(self.packages_dir, pkg.name, py)):
172+
if os.path.isfile(os.path.join(self.deps_dir, pkg.name, py)):
173173
pkg.pkg_type = PackageType.Python
174174
break
175175

src/ivpm/proj_info.py

+3
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,11 @@ def __init__(self, is_src):
2020

2121
self.ivpm_info = {}
2222
self.requirements_txt = None
23+
2324
self.name = None
2425
self.version = None
26+
self.deps_dir = "packages"
27+
2528
self.process_deps = True
2629
self.paths : Dict[str, Dict[str, List[str]]] = {}
2730

src/ivpm/project_update.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ def update(self):
4040
if proj_info is None:
4141
fatal("Failed to locate IVPM meta-data (eg ivpm.yaml)")
4242

43-
packages_dir = os.path.join(self.root_dir, "packages")
43+
packages_dir = os.path.join(self.root_dir, proj_info.deps_dir)
4444

4545
# Ensure that we have a python virtual environment setup
4646
if not self.skip_venv:

src/ivpm/update_info.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323

2424
@dc.dataclass
2525
class UpdateInfo(object):
26-
packages_dir : str
26+
deps_dir : str
2727
anonymous_git : bool = False
2828

2929

0 commit comments

Comments
 (0)