2
2
3
3
from collections .abc import Iterable
4
4
from dataclasses import dataclass
5
+ from typing import Optional
5
6
6
7
from enum import Enum
7
8
@@ -33,18 +34,31 @@ class DependencySpec:
33
34
path : str
34
35
35
36
@classmethod
36
- def parse (cls , info : dict [str , str ]) -> DependencySpec :
37
- if "url" not in info :
37
+ def parse (
38
+ cls ,
39
+ info : dict [str , str ],
40
+ base_config : Optional [DependencySpec ] = None ,
41
+ ) -> DependencySpec :
42
+ if "url" not in info and not base_config :
38
43
raise DependencyParseError ("url" )
39
44
40
- if "version" not in info :
45
+ if "version" not in info and not base_config :
41
46
raise DependencyParseError ("version" )
42
47
43
48
path = info .get ("path" , "" )
44
49
if path .startswith ("/" ):
45
50
path = path [1 :]
46
51
47
- return DependencySpec (info ["url" ], info ["version" ], path )
52
+ if base_config :
53
+ url = info .get ("url" , base_config .url )
54
+ version = info .get ("version" , base_config .version )
55
+ if path not in info :
56
+ path = base_config .path
57
+ else :
58
+ url = info ["url" ]
59
+ version = info ["version" ]
60
+
61
+ return DependencySpec (url , version , path )
48
62
49
63
50
64
def _read_versions (
@@ -53,6 +67,8 @@ def _read_versions(
53
67
dependency_names : Iterable [str ],
54
68
require_key : bool = True ,
55
69
ignore_class_notfound : bool = False ,
70
+ aliases : dict [str , str ] = {},
71
+ fallback : dict [str , DependencySpec ] = {},
56
72
) -> dict [str , DependencySpec ]:
57
73
deps_key = dependency_type .value
58
74
deptype_str = dependency_type .name .lower ()
@@ -71,15 +87,26 @@ def _read_versions(
71
87
# just set deps to the empty dict.
72
88
deps = {}
73
89
90
+ if aliases :
91
+ all_dep_keys = set (aliases .keys ())
92
+ else :
93
+ all_dep_keys = deps .keys ()
74
94
for depname in dependency_names :
75
- if depname not in deps :
95
+ if depname not in all_dep_keys :
76
96
raise click .ClickException (
77
97
f"Unknown { deptype_str } '{ depname } '."
78
98
+ f" Please add it to 'parameters.{ deps_key } '"
79
99
)
80
100
81
101
try :
82
- dep = DependencySpec .parse (deps [depname ])
102
+ basename_for_dep = aliases .get (depname , depname )
103
+ print (depname , basename_for_dep )
104
+ print (deps .get (depname , {}))
105
+ print (fallback .get (basename_for_dep ))
106
+ dep = DependencySpec .parse (
107
+ deps .get (depname , {}),
108
+ base_config = fallback .get (basename_for_dep ),
109
+ )
83
110
except DependencyParseError as e :
84
111
raise click .ClickException (
85
112
f"{ deptype_cap } '{ depname } ' is missing field '{ e .field } '"
@@ -96,9 +123,26 @@ def _read_versions(
96
123
97
124
98
125
def _read_components (
99
- cfg : Config , component_names : Iterable [ str ]
126
+ cfg : Config , component_aliases : dict [ str , str ]
100
127
) -> dict [str , DependencySpec ]:
101
- return _read_versions (cfg , DepType .COMPONENT , component_names )
128
+ component_names = set (component_aliases .values ())
129
+ alias_names = set (component_aliases .keys ()) - component_names
130
+
131
+ component_versions = _read_versions (cfg , DepType .COMPONENT , component_names )
132
+ alias_versions = _read_versions (
133
+ cfg ,
134
+ DepType .COMPONENT ,
135
+ alias_names ,
136
+ aliases = component_aliases ,
137
+ fallback = component_versions ,
138
+ )
139
+
140
+ for alias , aspec in alias_versions .items ():
141
+ if alias in component_versions :
142
+ raise ValueError ("alias name already in component_versions?" )
143
+ component_versions [alias ] = aspec
144
+
145
+ return component_versions
102
146
103
147
104
148
def _read_packages (
0 commit comments