comparison env/lib/python3.9/site-packages/planemo/deps.py @ 0:4f3585e2f14b draft default tip

"planemo upload commit 60cee0fc7c0cda8592644e1aad72851dec82c959"
author shellac
date Mon, 22 Mar 2021 18:12:50 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:4f3585e2f14b
1 """Abstractions for building dependency resolution configurations."""
2 import tempfile
3 from string import Template
4
5 import click
6 from six import iteritems
7
8 from planemo.conda import build_conda_context
9
10 CONDA_DEPENDENCY_RESOLUTION_CONF = """<dependency_resolvers>
11 <conda ${attributes} />
12 <conda versionless="true" ${attributes} />
13 </dependency_resolvers>
14 """
15
16 # Like Conda resolution above, but allow tool shed packages to be used for
17 # shed_serve and shed_test.
18 DEFAULT_DEPENDENCY_RESOLUTION_CONF = """<dependency_resolvers>
19 <tool_shed_packages />
20 <conda ${attributes} />
21 <conda versionless="true" ${attributes} />
22 </dependency_resolvers>
23 """
24
25 NO_DEPENDENCY_RESOLUTION_CONF = """<dependency_resolvers>
26 </dependency_resolvers>
27 """
28
29 BREW_DEPENDENCY_RESOLUTION_CONF = """<dependency_resolvers>
30 <homebrew />
31 <!--
32 <homebrew versionless="true" />
33 -->
34 </dependency_resolvers>
35 """
36
37 SHED_DEPENDENCY_RESOLUTION_CONF = """<dependency_resolvers>
38 <tool_shed_tap />
39 </dependency_resolvers>
40 """
41
42 # Provide some shortcuts for simple/common dependency resolutions strategies.
43 STOCK_DEPENDENCY_RESOLUTION_STRATEGIES = {
44 "brew_dependency_resolution": BREW_DEPENDENCY_RESOLUTION_CONF,
45 "shed_dependency_resolution": SHED_DEPENDENCY_RESOLUTION_CONF,
46 "conda_dependency_resolution": CONDA_DEPENDENCY_RESOLUTION_CONF,
47 "no_dependency_resolution": NO_DEPENDENCY_RESOLUTION_CONF,
48 "default_dependency_resolution": DEFAULT_DEPENDENCY_RESOLUTION_CONF,
49 }
50
51
52 def ensure_dependency_resolvers_conf_configured(ctx, kwds, resolvers_conf=None):
53 """Use supplied CLI options (kwds) to find or build a dependency resolvers file.
54
55 Set new path in kwds if needed.
56 """
57 _validate_dependency_resolution_options(kwds)
58 always_specify_attribute = object()
59
60 dependency_attribute_kwds = {
61 'conda_prefix': None,
62 'conda_exec': None,
63 'conda_debug': False,
64 'conda_copy_dependencies': False,
65 'conda_auto_init': always_specify_attribute,
66 'conda_auto_install': always_specify_attribute,
67 'conda_ensure_channels': '',
68 'conda_use_local': False,
69 }
70 attributes = []
71
72 def add_attribute(key, value):
73 attributes.append('%s="%s"' % (key, value))
74
75 conda_prefix_specified = False
76 for key, default_value in iteritems(dependency_attribute_kwds):
77 value = kwds.get(key, default_value)
78 if value != default_value:
79 conda_prefix_specified = conda_prefix_specified or (key == "conda_prefix")
80 # Strip leading prefix (conda_) off attributes
81 attribute_key = "_".join(key.split("_")[1:])
82 add_attribute(attribute_key, value)
83
84 conda_context = build_conda_context(ctx, **kwds)
85 if not conda_prefix_specified:
86 add_attribute("prefix", conda_context.conda_prefix)
87 add_attribute("condarc_override", conda_context.condarc_override)
88
89 attribute_str = " ".join(attributes)
90
91 if kwds.get("dependency_resolvers_config_file", None):
92 resolution_type = "__explicit__"
93 else:
94 resolution_type = "default_dependency_resolution"
95 for key in STOCK_DEPENDENCY_RESOLUTION_STRATEGIES:
96 if kwds.get(key):
97 resolution_type = key
98
99 if resolution_type != "__explicit__":
100 # Planemo manages the dependency resolve conf file.
101 template_str = STOCK_DEPENDENCY_RESOLUTION_STRATEGIES[resolution_type]
102 conf_contents = Template(template_str).safe_substitute({
103 'attributes': attribute_str
104 })
105 if resolvers_conf is None:
106 resolvers_conf = tempfile.NamedTemporaryFile(delete=False).name
107 with open(resolvers_conf, "w") as fh:
108 fh.write(conf_contents)
109 ctx.vlog(
110 "Writing dependency_resolvers_config_file to path %s with contents [%s]",
111 resolvers_conf,
112 conf_contents,
113 )
114 kwds["dependency_resolvers_config_file"] = resolvers_conf
115
116
117 def _validate_dependency_resolution_options(kwds):
118 resolutions_strategies = [
119 "brew_dependency_resolution",
120 "dependency_resolvers_config_file",
121 "shed_dependency_resolution",
122 "conda_dependency_resolution",
123 ]
124
125 selected_strategies = 0
126 for key in resolutions_strategies:
127 if kwds.get(key):
128 selected_strategies += 1
129
130 if selected_strategies > 1:
131 message = "At most one option from [%s] may be specified"
132 raise click.UsageError(message % resolutions_strategies)