|
1 | 1 | """Module describing the planemo ``tool_init`` command.""" |
2 | | -import os |
3 | 2 |
|
4 | 3 | import click |
5 | 4 |
|
|
8 | 7 | from planemo import tool_builder |
9 | 8 | from planemo.cli import command_function |
10 | 9 |
|
11 | | -REUSING_MACROS_MESSAGE = ("Macros file macros.xml already exists, assuming " |
12 | | - " it has relevant planemo-generated definitions.") |
13 | 10 |
|
14 | | - |
15 | | -# --input_format |
16 | | -# --output_format |
17 | | -# --advanced_options |
18 | 11 | @click.command("tool_init") |
19 | | -@click.option( |
20 | | - "-i", |
21 | | - "--id", |
22 | | - type=click.STRING, |
23 | | - prompt=True, |
24 | | - help="Short identifier for new tool (no whitespace)", |
25 | | -) |
| 12 | +@options.tool_init_id_option() |
26 | 13 | @options.force_option(what="tool") |
27 | | -@click.option( |
28 | | - "-t", |
29 | | - "--tool", |
30 | | - default=None, |
31 | | - type=click.Path(exists=False, |
32 | | - file_okay=True, |
33 | | - dir_okay=False, |
34 | | - writable=True, |
35 | | - resolve_path=True), |
36 | | - help="Output path for new tool (default is <id>.xml)", |
37 | | -) |
38 | | -@click.option( |
39 | | - "-n", |
40 | | - "--name", |
41 | | - type=click.STRING, |
42 | | - prompt=True, |
43 | | - help="Name for new tool (user facing)", |
44 | | -) |
45 | | -@click.option( |
46 | | - "--version", |
47 | | - default="0.1.0", |
48 | | - type=click.STRING, |
49 | | - help="Tool XML version.", |
50 | | -) |
51 | | -@click.option( |
52 | | - "-d", |
53 | | - "--description", |
54 | | - type=click.STRING, |
55 | | - default=None, |
56 | | - prompt=False, |
57 | | - help="Short description for new tool (user facing)", |
58 | | -) |
59 | | -@click.option( |
60 | | - "-c", |
61 | | - "--command", |
62 | | - type=click.STRING, |
63 | | - default=None, |
64 | | - prompt=False, |
65 | | - help=("Command potentially including cheetah variables ()" |
66 | | - "(e.g. 'seqtk seq -a $input > $output')"), |
67 | | -) |
68 | | -@click.option( |
69 | | - "--example_command", |
70 | | - type=click.STRING, |
71 | | - default=None, |
72 | | - prompt=False, |
73 | | - help=("Example to command with paths to build Cheetah template from " |
74 | | - "(e.g. 'seqtk seq -a 2.fastq > 2.fasta'). Option cannot be used " |
75 | | - "with --command, should be used --example_input and " |
76 | | - "--example_output."), |
77 | | -) |
78 | | -@click.option( |
79 | | - "--example_input", |
80 | | - type=click.STRING, |
81 | | - default=None, |
82 | | - prompt=False, |
83 | | - multiple=True, |
84 | | - help=("For use with --example_command, replace input file (e.g. 2.fastq " |
85 | | - "with a data input parameter)."), |
86 | | -) |
87 | | -@click.option( |
88 | | - "--example_output", |
89 | | - type=click.STRING, |
90 | | - default=None, |
91 | | - prompt=False, |
92 | | - multiple=True, |
93 | | - help=("For use with --example_command, replace input file (e.g. 2.fastq " |
94 | | - "with a tool output)."), |
95 | | -) |
96 | | -@click.option( |
97 | | - "--version_command", |
98 | | - type=click.STRING, |
99 | | - default=None, |
100 | | - prompt=False, |
101 | | - help="Command to print version (e.g. 'seqtk --version')", |
102 | | -) |
103 | | -@click.option( |
104 | | - "--input", |
105 | | - type=click.STRING, |
106 | | - default=None, |
107 | | - prompt=False, |
108 | | - multiple=True, |
109 | | - help="An input description (e.g. input.fasta)", |
110 | | -) |
111 | | -@click.option( |
112 | | - "--output", |
113 | | - type=click.STRING, |
114 | | - multiple=True, |
115 | | - default=None, |
116 | | - prompt=False, |
117 | | - help=("An output location (e.g. output.bam), the Galaxy datatype is " |
118 | | - "inferred from the extension."), |
119 | | -) |
120 | | -@click.option( |
121 | | - "--named_output", |
122 | | - type=click.STRING, |
123 | | - multiple=True, |
124 | | - default=None, |
125 | | - prompt=False, |
126 | | - help=("Create a named output for use with command block for example " |
127 | | - "specify --named_output=output1.bam and then use '-o $output1' " |
128 | | - "in your command block."), |
129 | | -) |
130 | | -@click.option( |
131 | | - "--help_text", |
132 | | - type=click.STRING, |
133 | | - default=None, |
134 | | - prompt=False, |
135 | | - help="Help text (reStructuredText)", |
136 | | -) |
137 | | -@click.option( |
138 | | - "--help_from_command", |
139 | | - type=click.STRING, |
140 | | - default=None, |
141 | | - prompt=False, |
142 | | - help="Auto populate help from supplied command.", |
143 | | -) |
144 | | -@click.option( |
145 | | - "--requirement", |
146 | | - type=click.STRING, |
147 | | - default=None, |
148 | | - multiple=True, |
149 | | - prompt=False, |
150 | | - help="Add a tool requirement package (e.g. 'seqtk' or 'seqtk@1.68')." |
151 | | -) |
152 | | -@click.option( |
153 | | - "--container", |
154 | | - type=click.STRING, |
155 | | - default=None, |
156 | | - multiple=True, |
157 | | - prompt=False, |
158 | | - help="Add a Docker image identifier for this tool." |
159 | | -) |
160 | | -@click.option( |
161 | | - "--doi", |
162 | | - type=click.STRING, |
163 | | - default=None, |
164 | | - multiple=True, |
165 | | - prompt=False, |
166 | | - help=("Supply a DOI (http://www.doi.org/) easing citation of the tool " |
167 | | - "for Galaxy users (e.g. 10.1101/014043).") |
168 | | -) |
169 | | -@click.option( |
170 | | - "--cite_url", |
171 | | - type=click.STRING, |
172 | | - default=None, |
173 | | - multiple=True, |
174 | | - prompt=False, |
175 | | - help=("Supply a URL for citation.") |
176 | | -) |
177 | | -@click.option( |
178 | | - "--test_case", |
179 | | - is_flag=True, |
180 | | - default=None, |
181 | | - prompt=False, |
182 | | - help=("For use with --example_commmand, generate a tool test case from " |
183 | | - "the supplied example."), |
184 | | -) |
185 | | -@click.option( |
186 | | - "--macros", |
187 | | - is_flag=True, |
188 | | - default=None, |
189 | | - prompt=False, |
190 | | - help="Generate a macros.xml for reuse across many tools.", |
191 | | -) |
| 14 | +@options.tool_init_tool_option() |
| 15 | +@options.tool_init_name_option() |
| 16 | +@options.tool_init_version_option() |
| 17 | +@options.tool_init_description_option() |
| 18 | +@options.tool_init_command_option() |
| 19 | +@options.tool_init_example_command_option() |
| 20 | +@options.tool_init_example_input_option() |
| 21 | +@options.tool_init_example_output_option() |
| 22 | +@options.tool_init_named_output_option() |
| 23 | +@options.tool_init_input_option() |
| 24 | +@options.tool_init_output_option() |
| 25 | +@options.tool_init_help_text_option() |
| 26 | +@options.tool_init_help_from_command_option() |
| 27 | +@options.tool_init_doi_option() |
| 28 | +@options.tool_init_cite_url_option() |
| 29 | +@options.tool_init_test_case_option() |
| 30 | +@options.tool_init_macros_option() |
| 31 | +@options.tool_init_version_command_option() |
| 32 | +@options.tool_init_requirement_option() |
| 33 | +@options.tool_init_container_option() |
192 | 34 | @options.build_cwl_option() |
193 | 35 | @command_function |
194 | 36 | def cli(ctx, **kwds): |
195 | 37 | """Generate tool outline from given arguments.""" |
196 | 38 | invalid = _validate_kwds(kwds) |
197 | | - tool_id = kwds.get("id") |
198 | 39 | if invalid: |
199 | 40 | ctx.exit(invalid) |
200 | | - output = kwds.get("tool") |
201 | | - if not output: |
202 | | - extension = "cwl" if kwds.get("cwl") else "xml" |
203 | | - output = "%s.%s" % (tool_id, extension) |
204 | | - if not io.can_write_to_path(output, **kwds): |
205 | | - ctx.exit(1) |
206 | 41 | tool_description = tool_builder.build(**kwds) |
207 | | - io.write_file(output, tool_description.contents) |
208 | | - io.info("Tool written to %s" % output) |
209 | | - test_contents = tool_description.test_contents |
210 | | - if test_contents: |
211 | | - sep = "-" if "-" in tool_id else "_" |
212 | | - tests_path = "%s%stests.yml" % (kwds.get("id"), sep) |
213 | | - if not io.can_write_to_path(tests_path, **kwds): |
214 | | - ctx.exit(1) |
215 | | - io.write_file(tests_path, test_contents) |
216 | | - io.info("Tool tests written to %s" % tests_path) |
217 | | - |
218 | | - macros = kwds["macros"] |
219 | | - macros_file = "macros.xml" |
220 | | - if macros and not os.path.exists(macros_file): |
221 | | - io.write_file(macros_file, tool_description.macro_contents) |
222 | | - elif macros: |
223 | | - io.info(REUSING_MACROS_MESSAGE) |
224 | | - if tool_description.test_files: |
225 | | - if not os.path.exists("test-data"): |
226 | | - io.info("No test-data directory, creating one.") |
227 | | - io.shell("mkdir -p 'test-data'") |
228 | | - for test_file in tool_description.test_files: |
229 | | - io.info("Copying test-file %s" % test_file) |
230 | | - io.shell("cp '%s' 'test-data'" % test_file) |
| 42 | + tool_builder.write_tool_description( |
| 43 | + ctx, tool_description, **kwds |
| 44 | + ) |
231 | 45 |
|
232 | 46 |
|
233 | 47 | def _validate_kwds(kwds): |
|
0 commit comments