Skip to content

Commit 2328475

Browse files
committed
detect build system
1 parent 276c3d2 commit 2328475

File tree

4 files changed

+41
-25
lines changed

4 files changed

+41
-25
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ options:
2626

2727
## Example
2828

29-
For the [eigenpy](https://github.com/stack-of-tasks/eigenpy) project:
29+
For the [eigenpy](https://github.com/stack-of-tasks/eigenpy) project, you can add a `dockgen.toml` with:
3030
```toml
3131
[jrl-cmakemodules]
3232
url = "github:jrl-umi3218"

dockgen/forge.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,12 @@ def __init__(
3030
self.headers = {}
3131
self.org = None
3232
self.name = name
33+
self.dir = args.work_dir / self.name
3334
self.slug = (
3435
"dot"
3536
if self.forge_type == ForgeType.Dot
3637
else str(self.forge_type).removesuffix(":")
3738
)
38-
3939
getattr(self, f"init_{self.slug}")()
4040

4141
def init_github(self):
@@ -45,7 +45,6 @@ def init_github(self):
4545
self.headers = {"Accept": "application/vnd.github+json"}
4646
if self.args.token:
4747
self.headers["Authorization"] = f"Bearer {self.args.token}"
48-
self.dir = self.args.work_dir / self.name
4948
self.dir.mkdir(parents=True, exist_ok=True)
5049

5150
self.api_url = f"https://api.github.com/repos/{self.org}/{self.name}"
@@ -59,7 +58,6 @@ def init_http(self):
5958
if not self.name:
6059
err = f"name must be set for {self.url}"
6160
raise AttributeError(err)
62-
self.dir = self.args.work_dir / self.name
6361
self.tarball = self.url
6462
if self.dir.exists():
6563
logger.info("%s already exists, skipping download", self.dir)

dockgen/project.py

Lines changed: 38 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
"""Definition of a project to build."""
22

33
from enum import StrEnum
4+
from pathlib import Path
45
from tomllib import load
56
from typing import TYPE_CHECKING
67

78
from .forge import Forge, ForgeType
89

910

10-
if TYPE_CHECKING:
11+
if TYPE_CHECKING: # pragma: no cover
1112
from .__main__ import Dockgen
1213

1314

@@ -38,6 +39,7 @@ def __init__(
3839
apt_deps: list[str] | None = None,
3940
src_deps: list[str] | None = None,
4041
):
42+
self.dockgen = dockgen
4143
self.name = name
4244
self.url = url
4345
for forge_type in ForgeType:
@@ -51,28 +53,44 @@ def __init__(
5153
self.org = org or self.forge.org
5254
self.version = version or self.forge.version
5355
self.tarball = tarball or self.forge.tarball
54-
self.build_systems = [BuildSystem[b] for b in (build_systems or ["CMake"])]
56+
self.build_systems = [BuildSystem[b] for b in (build_systems or self.detect())]
5557
self.apt_deps = set(apt_deps or [])
5658
self.src_deps = set(src_deps or [])
5759

5860
if self.url != ".":
5961
if upstream_dockgen := self.forge.get_file("dockgen.toml"):
60-
with upstream_dockgen.open("rb") as f:
61-
for name, conf in load(f).items():
62-
if name == self.name:
63-
tgt = self
64-
elif name in dockgen.projects:
65-
tgt = dockgen.projects[name]
66-
else:
67-
dockgen.projects[name] = Project(
68-
dockgen=dockgen, name=name, **conf
69-
)
70-
dockgen.projects_order.append(name)
71-
continue
62+
self.upstream(upstream_dockgen)
7263

73-
for k, v in conf.items():
74-
match k:
75-
case "apt_deps":
76-
tgt.apt_deps |= set(v)
77-
case "src_deps":
78-
tgt.src_deps |= set(v)
64+
def detect(self) -> list[str]:
65+
"""
66+
Detect build systems
67+
"""
68+
return [
69+
build_system.name
70+
for build_system in BuildSystem
71+
if self.forge.get_file(build_system) is not None
72+
]
73+
74+
def upstream(self, upstream_dockgen: Path):
75+
"""
76+
Process data from upstream dockgen.toml
77+
"""
78+
with upstream_dockgen.open("rb") as f:
79+
for name, conf in load(f).items():
80+
if name == self.name:
81+
tgt = self
82+
elif name in self.dockgen.projects:
83+
tgt = self.dockgen.projects[name]
84+
else:
85+
self.dockgen.projects[name] = Project(
86+
dockgen=self.dockgen, name=name, **conf
87+
)
88+
self.dockgen.projects_order.append(name)
89+
continue
90+
91+
for k, v in conf.items():
92+
match k:
93+
case "apt_deps":
94+
tgt.apt_deps |= set(v)
95+
case "src_deps":
96+
tgt.src_deps |= set(v)

tests/tests.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ def test_help(self):
6868
import coverage # noqa: F401
6969

7070
exe = ["coverage", "run"]
71-
except ImportError:
71+
except ImportError: # pragma: no cover
7272
pass
7373
output = check_output([*exe, "-m", "dockgen", "-h"], text=True)
7474
self.assertIn("Generate fresh docker images", output)

0 commit comments

Comments
 (0)