Skip to content

Commit 78a7ae2

Browse files
committed
Remove unused code in python_gardenlinux_lib module
Signed-off-by: Tobias Wolf <[email protected]>
1 parent 377e95a commit 78a7ae2

File tree

15 files changed

+203
-385
lines changed

15 files changed

+203
-385
lines changed

src/gardenlinux/apt/__init__.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# -*- coding: utf-8 -*-
2+
3+
from .debsource import Debsrc, DebsrcFile
4+
5+
__all__ = ["Parser"]

src/gardenlinux/constants.py

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
# -*- coding: utf-8 -*-
22

33
# GardenLinux "bare" feature
4-
BARE_FLAVOR_FEATURE_CONTENT = { "description": "Bare flavor", "type": "platform" }
5-
BARE_FLAVOR_LIBC_FEATURE_CONTENT = { "description": "Bare libc feature", "type": "element" }
4+
BARE_FLAVOR_FEATURE_CONTENT = {"description": "Bare flavor", "type": "platform"}
5+
6+
BARE_FLAVOR_LIBC_FEATURE_CONTENT = {
7+
"description": "Bare libc feature",
8+
"type": "element",
9+
}
610

711
# GardenLinux flavors schema for validation
812
GL_FLAVORS_SCHEMA = {
@@ -31,15 +35,22 @@
3135
"test-platform": {"type": "boolean"},
3236
"publish": {"type": "boolean"},
3337
},
34-
"required": ["features", "arch", "build", "test", "test-platform", "publish"],
38+
"required": [
39+
"features",
40+
"arch",
41+
"build",
42+
"test",
43+
"test-platform",
44+
"publish",
45+
],
3546
},
3647
},
3748
},
3849
"required": ["name", "category", "flavors"],
3950
},
4051
},
4152
},
42-
"required": ["targets"]
53+
"required": ["targets"],
4354
}
4455

4556
# It is important that this list is sorted in descending length of the entries

src/gardenlinux/features/__main__.py

Lines changed: 55 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -20,26 +20,38 @@
2020
"elements",
2121
"arch",
2222
"version",
23-
"graph"
23+
"graph",
2424
]
2525

2626

2727
def main():
2828
parser = argparse.ArgumentParser()
2929

30-
parser.add_argument("--arch", dest = "arch")
31-
parser.add_argument("--feature-dir", default = "features")
32-
parser.add_argument("--features", type = lambda arg: set([f for f in arg.split(",") if f]))
33-
parser.add_argument("--ignore", dest = "ignore", type = lambda arg: set([f for f in arg.split(",") if f]), default = set())
30+
parser.add_argument("--arch", dest="arch")
31+
parser.add_argument("--feature-dir", default="features")
3432
parser.add_argument("--cname")
3533
parser.add_argument("--default-arch")
3634
parser.add_argument("--default-version")
3735
parser.add_argument("--version", dest="version")
38-
parser.add_argument("type", nargs="?", choices = _ARGS_TYPE_ALLOWED, default = "cname")
36+
37+
parser.add_argument(
38+
"--features", type=lambda arg: set([f for f in arg.split(",") if f])
39+
)
40+
41+
parser.add_argument(
42+
"--ignore",
43+
dest="ignore",
44+
type=lambda arg: set([f for f in arg.split(",") if f]),
45+
default=set(),
46+
)
47+
48+
parser.add_argument("type", nargs="?", choices=_ARGS_TYPE_ALLOWED, default="cname")
3949

4050
args = parser.parse_args()
4151

42-
assert bool(args.features) or bool(args.cname), "Please provide either `--features` or `--cname` argument"
52+
assert bool(args.features) or bool(
53+
args.cname
54+
), "Please provide either `--features` or `--cname` argument"
4355

4456
arch = None
4557
cname_base = None
@@ -50,7 +62,7 @@ def main():
5062
if args.cname:
5163
re_match = re.match(
5264
"([a-zA-Z0-9]+([\\_\\-][a-zA-Z0-9]+)+?)(-([a-z0-9]+)(-([a-z0-9.]+)-([a-z0-9]+))*)?$",
53-
args.cname
65+
args.cname,
5466
)
5567

5668
assert re_match, f"Not a valid GardenLinux canonical name {args.cname}"
@@ -85,14 +97,16 @@ def main():
8597
commit_id = re_match[3]
8698
version = re_match[1]
8799

88-
if arch is None or arch == "" and (args.type in ( "cname", "arch" )):
89-
assert args.default_arch, "Architecture could not be determined and no default architecture set"
100+
if arch is None or arch == "" and (args.type in ("cname", "arch")):
101+
assert (
102+
args.default_arch
103+
), "Architecture could not be determined and no default architecture set"
90104
arch = args.default_arch
91105

92106
if not commit_id or not version:
93107
version, commit_id = get_version_and_commit_id_from_files(gardenlinux_root)
94108

95-
if not version and (args.type in ("cname", "version" )):
109+
if not version and (args.type in ("cname", "version")):
96110
assert args.default_version, "version not specified and no default version set"
97111
version = args.default_version
98112

@@ -108,15 +122,15 @@ def main():
108122

109123
if args.type == "arch":
110124
print(arch)
111-
elif args.type in ( "cname_base", "cname", "graph" ):
112-
graph = Parser(gardenlinux_root, feature_dir_name).filter(cname_base, additional_filter_func = additional_filter_func)
125+
elif args.type in ("cname_base", "cname", "graph"):
126+
graph = Parser(gardenlinux_root, feature_dir_name).filter(
127+
cname_base, additional_filter_func=additional_filter_func
128+
)
113129

114130
sorted_features = Parser.sort_graph_nodes(graph)
115131
minimal_feature_set = get_minimal_feature_set(graph)
116132

117-
sorted_minimal_features = sort_subset(
118-
minimal_feature_set, sorted_features
119-
)
133+
sorted_minimal_features = sort_subset(minimal_feature_set, sorted_features)
120134

121135
cname_base = get_cname_base(sorted_minimal_features)
122136

@@ -135,9 +149,15 @@ def main():
135149
elif args.type == "graph":
136150
print(graph_as_mermaid_markup(cname_base, graph))
137151
elif args.type == "features":
138-
print(Parser(gardenlinux_root, feature_dir_name).filter_as_string(cname_base, additional_filter_func = additional_filter_func))
139-
elif args.type in ( "flags", "elements", "platforms" ):
140-
features_by_type = Parser(gardenlinux_root, feature_dir_name).filter_as_dict(cname_base, additional_filter_func = additional_filter_func)
152+
print(
153+
Parser(gardenlinux_root, feature_dir_name).filter_as_string(
154+
cname_base, additional_filter_func=additional_filter_func
155+
)
156+
)
157+
elif args.type in ("flags", "elements", "platforms"):
158+
features_by_type = Parser(gardenlinux_root, feature_dir_name).filter_as_dict(
159+
cname_base, additional_filter_func=additional_filter_func
160+
)
141161

142162
if args.type == "platforms":
143163
print(",".join(features_by_type["platform"]))
@@ -151,9 +171,10 @@ def main():
151171

152172
def get_cname_base(sorted_features):
153173
return reduce(
154-
lambda a, b : a + ("-" if not b.startswith("_") else "") + b, sorted_features
174+
lambda a, b: a + ("-" if not b.startswith("_") else "") + b, sorted_features
155175
)
156176

177+
157178
def get_version_and_commit_id_from_files(gardenlinux_root):
158179
commit_id = None
159180
version = None
@@ -168,21 +189,24 @@ def get_version_and_commit_id_from_files(gardenlinux_root):
168189

169190
return (version, commit_id)
170191

192+
171193
def get_minimal_feature_set(graph):
172194
return set([node for (node, degree) in graph.in_degree() if degree == 0])
173195

196+
174197
def graph_as_mermaid_markup(cname_base, graph):
175-
"""
176-
Generates a mermaid.js representation of the graph.
177-
This is helpful to identify dependencies between features.
178-
179-
Syntax docs:
180-
https://mermaid.js.org/syntax/flowchart.html?id=flowcharts-basic-syntax
181-
"""
182-
markup = f"---\ntitle: Dependency Graph for Feature {cname_base}\n---\ngraph TD;\n"
183-
for u,v in graph.edges:
184-
markup += f" {u}-->{v};\n"
185-
return markup
198+
"""
199+
Generates a mermaid.js representation of the graph.
200+
This is helpful to identify dependencies between features.
201+
202+
Syntax docs:
203+
https://mermaid.js.org/syntax/flowchart.html?id=flowcharts-basic-syntax
204+
"""
205+
markup = f"---\ntitle: Dependency Graph for Feature {cname_base}\n---\ngraph TD;\n"
206+
for u, v in graph.edges:
207+
markup += f" {u}-->{v};\n"
208+
return markup
209+
186210

187211
def sort_subset(input_set, order_list):
188212
return [item for item in order_list if item in input_set]

src/gardenlinux/features/cname_main.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,12 @@
66
import argparse
77
import re
88

9-
from .__main__ import get_cname_base, get_minimal_feature_set, get_version_and_commit_id_from_files, sort_subset
9+
from .__main__ import (
10+
get_cname_base,
11+
get_minimal_feature_set,
12+
get_version_and_commit_id_from_files,
13+
sort_subset,
14+
)
1015
from .parser import Parser
1116

1217

@@ -22,7 +27,7 @@ def main():
2227

2328
re_match = re.match(
2429
"([a-zA-Z0-9]+([\\_\\-][a-zA-Z0-9]+)+?)(-([a-z0-9]+)(-([a-z0-9.]+)-([a-z0-9]+))*)?$",
25-
args.cname
30+
args.cname,
2631
)
2732

2833
assert re_match, f"Not a valid GardenLinux canonical name {args.cname}"
@@ -73,9 +78,7 @@ def main():
7378
sorted_features = Parser.sort_graph_nodes(graph)
7479
minimal_feature_set = get_minimal_feature_set(graph)
7580

76-
sorted_minimal_features = sort_subset(
77-
minimal_feature_set, sorted_features
78-
)
81+
sorted_minimal_features = sort_subset(minimal_feature_set, sorted_features)
7982

8083
cname = get_cname_base(sorted_minimal_features)
8184

src/gardenlinux/features/parser.py

Lines changed: 45 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,18 @@
1414

1515

1616
class Parser(object):
17-
def __init__(self, gardenlinux_root: str = ".", feature_dir_name: str = "features", logger: Optional[logging.Logger] = None):
17+
def __init__(
18+
self,
19+
gardenlinux_root: str = ".",
20+
feature_dir_name: str = "features",
21+
logger: Optional[logging.Logger] = None,
22+
):
1823
feature_base_dir = os.path.join(gardenlinux_root, feature_dir_name)
1924

2025
if not os.access(feature_base_dir, os.R_OK):
21-
raise ValueError("Feature directory given is invalid: {0}".format(feature_base_dir))
26+
raise ValueError(
27+
"Feature directory given is invalid: {0}".format(feature_base_dir)
28+
)
2229

2330
if logger is None or not logger.hasHandlers():
2431
logger = LoggerSetup.get_logger("gardenlinux.features")
@@ -28,7 +35,9 @@ def __init__(self, gardenlinux_root: str = ".", feature_dir_name: str = "feature
2835
self._graph = None
2936
self._logger = logger
3037

31-
self._logger.debug("features.Parser initialized for directory: {0}".format(feature_base_dir))
38+
self._logger.debug(
39+
"features.Parser initialized for directory: {0}".format(feature_base_dir)
40+
)
3241

3342
@property
3443
def graph(self) -> networkx.Graph:
@@ -49,7 +58,9 @@ def graph(self) -> networkx.Graph:
4958
continue
5059

5160
for ref in node_features[attr]:
52-
if not os.path.isfile("{0}/{1}/info.yaml".format(self._feature_base_dir, ref)):
61+
if not os.path.isfile(
62+
"{0}/{1}/info.yaml".format(self._feature_base_dir, ref)
63+
):
5364
raise ValueError(
5465
f"feature {node} references feature {ref}, but {feature_dir}/{ref}/info.yaml does not exist"
5566
)
@@ -67,7 +78,7 @@ def filter(
6778
self,
6879
cname: str,
6980
ignore_excludes: bool = False,
70-
additional_filter_func: Optional[Callable[(str,), bool]] = None
81+
additional_filter_func: Optional[Callable[(str,), bool]] = None,
7182
) -> networkx.Graph:
7283
input_features = Parser.get_cname_as_feature_set(cname)
7384
filter_set = input_features.copy()
@@ -80,9 +91,18 @@ def filter(
8091
self.graph.add_node("libc", content=BARE_FLAVOR_LIBC_FEATURE_CONTENT)
8192

8293
for feature in input_features:
83-
filter_set.update(networkx.descendants(Parser._get_graph_view_for_attr(self.graph, "include"), feature))
94+
filter_set.update(
95+
networkx.descendants(
96+
Parser._get_graph_view_for_attr(self.graph, "include"), feature
97+
)
98+
)
8499

85-
graph = networkx.subgraph_view(self.graph, filter_node = self._get_filter_set_callable(filter_set, additional_filter_func))
100+
graph = networkx.subgraph_view(
101+
self.graph,
102+
filter_node=self._get_filter_set_callable(
103+
filter_set, additional_filter_func
104+
),
105+
)
86106

87107
if not ignore_excludes:
88108
Parser._exclude_from_filter_set(graph, input_features, filter_set)
@@ -93,13 +113,13 @@ def filter_as_dict(
93113
self,
94114
cname: str,
95115
ignore_excludes: bool = False,
96-
additional_filter_func: Optional[Callable[(str,), bool]] = None
116+
additional_filter_func: Optional[Callable[(str,), bool]] = None,
97117
) -> dict:
98118
"""
99-
:param str cname: the target cname to get the feature dict for
100-
:param str gardenlinux_root: path of garden linux src root
119+
:param str cname: the target cname to get the feature dict for
120+
:param str gardenlinux_root: path of garden linux src root
101121
102-
:return: dict with list of features for a given cname, split into platform, element and flag
122+
:return: dict with list of features for a given cname, split into platform, element and flag
103123
"""
104124

105125
graph = self.filter(cname, ignore_excludes, additional_filter_func)
@@ -121,13 +141,13 @@ def filter_as_list(
121141
self,
122142
cname: str,
123143
ignore_excludes: bool = False,
124-
additional_filter_func: Optional[Callable[(str,), bool]] = None
144+
additional_filter_func: Optional[Callable[(str,), bool]] = None,
125145
) -> list:
126146
"""
127-
:param str cname: the target cname to get the feature dict for
128-
:param str gardenlinux_root: path of garden linux src root
147+
:param str cname: the target cname to get the feature dict for
148+
:param str gardenlinux_root: path of garden linux src root
129149
130-
:return: list of features for a given cname
150+
:return: list of features for a given cname
131151
"""
132152

133153
graph = self.filter(cname, ignore_excludes, additional_filter_func)
@@ -137,13 +157,13 @@ def filter_as_string(
137157
self,
138158
cname: str,
139159
ignore_excludes: bool = False,
140-
additional_filter_func: Optional[Callable[(str,), bool]] = None
160+
additional_filter_func: Optional[Callable[(str,), bool]] = None,
141161
) -> str:
142162
"""
143-
:param str cname: the target cname to get the feature set for
144-
:param str gardenlinux_root: path of garden linux src root
163+
:param str cname: the target cname to get the feature set for
164+
:param str gardenlinux_root: path of garden linux src root
145165
146-
:return: a comma separated string with the expanded feature set for the cname
166+
:return: a comma separated string with the expanded feature set for the cname
147167
"""
148168

149169
graph = self.filter(cname, ignore_excludes, additional_filter_func)
@@ -200,15 +220,17 @@ def get_cname_as_feature_set(cname):
200220
@staticmethod
201221
def _get_filter_set_callable(filter_set, additional_filter_func):
202222
def filter_func(node):
203-
additional_filter_result = True if additional_filter_func is None else additional_filter_func(node)
204-
return (node in filter_set and additional_filter_result)
223+
additional_filter_result = (
224+
True if additional_filter_func is None else additional_filter_func(node)
225+
)
226+
return node in filter_set and additional_filter_result
205227

206228
return filter_func
207229

208230
@staticmethod
209231
def _get_graph_view_for_attr(graph, attr):
210232
return networkx.subgraph_view(
211-
graph, filter_edge = Parser._get_graph_view_for_attr_callable(graph, attr)
233+
graph, filter_edge=Parser._get_graph_view_for_attr_callable(graph, attr)
212234
)
213235

214236
@staticmethod
@@ -231,7 +253,7 @@ def key_function(node):
231253

232254
return f"{prefix}-{node}"
233255

234-
return list(networkx.lexicographical_topological_sort(graph, key = key_function))
256+
return list(networkx.lexicographical_topological_sort(graph, key=key_function))
235257

236258
@staticmethod
237259
def sort_reversed_graph_nodes(graph):

0 commit comments

Comments
 (0)