@galaxy-tool-util/cli 0.1.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/bin/galaxy-tool-cache.js +15 -0
- package/dist/bin/galaxy-tool-cache.js.map +1 -1
- package/dist/bin/gxwf.d.ts +3 -0
- package/dist/bin/gxwf.d.ts.map +1 -0
- package/dist/bin/gxwf.js +150 -0
- package/dist/bin/gxwf.js.map +1 -0
- package/dist/commands/add.js +2 -2
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/clean-tree.d.ts +9 -0
- package/dist/commands/clean-tree.d.ts.map +1 -0
- package/dist/commands/clean-tree.js +69 -0
- package/dist/commands/clean-tree.js.map +1 -0
- package/dist/commands/clean.d.ts +10 -0
- package/dist/commands/clean.d.ts.map +1 -0
- package/dist/commands/clean.js +48 -0
- package/dist/commands/clean.js.map +1 -0
- package/dist/commands/clear.js +4 -4
- package/dist/commands/clear.js.map +1 -1
- package/dist/commands/convert-tree.d.ts +32 -0
- package/dist/commands/convert-tree.d.ts.map +1 -0
- package/dist/commands/convert-tree.js +229 -0
- package/dist/commands/convert-tree.js.map +1 -0
- package/dist/commands/convert.d.ts +13 -0
- package/dist/commands/convert.d.ts.map +1 -0
- package/dist/commands/convert.js +151 -0
- package/dist/commands/convert.js.map +1 -0
- package/dist/commands/info.d.ts.map +1 -1
- package/dist/commands/info.js +5 -4
- package/dist/commands/info.js.map +1 -1
- package/dist/commands/lint-tree.d.ts +11 -0
- package/dist/commands/lint-tree.d.ts.map +1 -0
- package/dist/commands/lint-tree.js +104 -0
- package/dist/commands/lint-tree.js.map +1 -0
- package/dist/commands/lint.d.ts +34 -0
- package/dist/commands/lint.d.ts.map +1 -0
- package/dist/commands/lint.js +195 -0
- package/dist/commands/lint.js.map +1 -0
- package/dist/commands/list.js +3 -3
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/populate-workflow.d.ts +6 -0
- package/dist/commands/populate-workflow.d.ts.map +1 -0
- package/dist/commands/populate-workflow.js +55 -0
- package/dist/commands/populate-workflow.js.map +1 -0
- package/dist/commands/render-results.d.ts +11 -0
- package/dist/commands/render-results.d.ts.map +1 -0
- package/dist/commands/render-results.js +27 -0
- package/dist/commands/render-results.js.map +1 -0
- package/dist/commands/report-output.d.ts +34 -0
- package/dist/commands/report-output.d.ts.map +1 -0
- package/dist/commands/report-output.js +70 -0
- package/dist/commands/report-output.js.map +1 -0
- package/dist/commands/resolve-tool.js +1 -1
- package/dist/commands/resolve-tool.js.map +1 -1
- package/dist/commands/roundtrip-tree.d.ts +15 -0
- package/dist/commands/roundtrip-tree.d.ts.map +1 -0
- package/dist/commands/roundtrip-tree.js +178 -0
- package/dist/commands/roundtrip-tree.js.map +1 -0
- package/dist/commands/roundtrip.d.ts +31 -0
- package/dist/commands/roundtrip.d.ts.map +1 -0
- package/dist/commands/roundtrip.js +144 -0
- package/dist/commands/roundtrip.js.map +1 -0
- package/dist/commands/schema.js +2 -2
- package/dist/commands/schema.js.map +1 -1
- package/dist/commands/stateful-tool-inputs.d.ts +33 -0
- package/dist/commands/stateful-tool-inputs.d.ts.map +1 -0
- package/dist/commands/stateful-tool-inputs.js +73 -0
- package/dist/commands/stateful-tool-inputs.js.map +1 -0
- package/dist/commands/strict-options.d.ts +22 -0
- package/dist/commands/strict-options.d.ts.map +1 -0
- package/dist/commands/strict-options.js +18 -0
- package/dist/commands/strict-options.js.map +1 -0
- package/dist/commands/structural-schema.d.ts +6 -0
- package/dist/commands/structural-schema.d.ts.map +1 -0
- package/dist/commands/structural-schema.js +31 -0
- package/dist/commands/structural-schema.js.map +1 -0
- package/dist/commands/tree.d.ts +45 -0
- package/dist/commands/tree.d.ts.map +1 -0
- package/dist/commands/tree.js +155 -0
- package/dist/commands/tree.js.map +1 -0
- package/dist/commands/validate-tests-tree.d.ts +36 -0
- package/dist/commands/validate-tests-tree.d.ts.map +1 -0
- package/dist/commands/validate-tests-tree.js +191 -0
- package/dist/commands/validate-tests-tree.js.map +1 -0
- package/dist/commands/validate-tests.d.ts +21 -0
- package/dist/commands/validate-tests.d.ts.map +1 -0
- package/dist/commands/validate-tests.js +83 -0
- package/dist/commands/validate-tests.js.map +1 -0
- package/dist/commands/validate-tree.d.ts +12 -0
- package/dist/commands/validate-tree.d.ts.map +1 -0
- package/dist/commands/validate-tree.js +124 -0
- package/dist/commands/validate-tree.js.map +1 -0
- package/dist/commands/validate-workflow-json-schema.d.ts +8 -2
- package/dist/commands/validate-workflow-json-schema.d.ts.map +1 -1
- package/dist/commands/validate-workflow-json-schema.js +129 -50
- package/dist/commands/validate-workflow-json-schema.js.map +1 -1
- package/dist/commands/validate-workflow.d.ts +18 -10
- package/dist/commands/validate-workflow.d.ts.map +1 -1
- package/dist/commands/validate-workflow.js +215 -88
- package/dist/commands/validate-workflow.js.map +1 -1
- package/dist/commands/workflow-io.d.ts +7 -0
- package/dist/commands/workflow-io.d.ts.map +1 -0
- package/dist/commands/workflow-io.js +38 -0
- package/dist/commands/workflow-io.js.map +1 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -1
- package/dist/workflow/_templates-bundled.d.ts +2 -0
- package/dist/workflow/_templates-bundled.d.ts.map +1 -0
- package/dist/workflow/_templates-bundled.js +324 -0
- package/dist/workflow/_templates-bundled.js.map +1 -0
- package/dist/workflow/report-templates.d.ts +13 -0
- package/dist/workflow/report-templates.d.ts.map +1 -0
- package/dist/workflow/report-templates.js +91 -0
- package/dist/workflow/report-templates.js.map +1 -0
- package/package.json +18 -16
- package/dist/bin/galaxy-workflow-validate.d.ts +0 -3
- package/dist/bin/galaxy-workflow-validate.d.ts.map +0 -1
- package/dist/bin/galaxy-workflow-validate.js +0 -17
- package/dist/bin/galaxy-workflow-validate.js.map +0 -1
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared tree-walking infrastructure for batch workflow operations.
|
|
3
|
+
*
|
|
4
|
+
* Provides a generic discover→load→process→aggregate loop so that
|
|
5
|
+
* each tree command only supplies a per-workflow processing function
|
|
6
|
+
* and an aggregation/formatting function.
|
|
7
|
+
*
|
|
8
|
+
* Mirrors Python's _tree_orchestrator.py pattern.
|
|
9
|
+
*/
|
|
10
|
+
import type { WorkflowFormat } from "@galaxy-tool-util/schema";
|
|
11
|
+
export interface WorkflowInfo {
|
|
12
|
+
path: string;
|
|
13
|
+
relativePath: string;
|
|
14
|
+
format: WorkflowFormat;
|
|
15
|
+
}
|
|
16
|
+
export interface WorkflowOutcome<T> {
|
|
17
|
+
info: WorkflowInfo;
|
|
18
|
+
result?: T;
|
|
19
|
+
error?: string;
|
|
20
|
+
skipped?: boolean;
|
|
21
|
+
skipReason?: string;
|
|
22
|
+
}
|
|
23
|
+
export interface TreeResult<T> {
|
|
24
|
+
root: string;
|
|
25
|
+
outcomes: WorkflowOutcome<T>[];
|
|
26
|
+
}
|
|
27
|
+
export interface TreeSummary {
|
|
28
|
+
total: number;
|
|
29
|
+
ok: number;
|
|
30
|
+
fail: number;
|
|
31
|
+
error: number;
|
|
32
|
+
skipped: number;
|
|
33
|
+
}
|
|
34
|
+
/** Call from processOne to skip a workflow with a reason. */
|
|
35
|
+
export declare function skipWorkflow(reason: string): never;
|
|
36
|
+
/** Discover workflow files recursively under root. */
|
|
37
|
+
export declare function discoverWorkflows(root: string, includeFormat2?: boolean): Promise<WorkflowInfo[]>;
|
|
38
|
+
/** Load and parse a discovered workflow file. Returns null on failure. */
|
|
39
|
+
export declare function loadWorkflowSafe(info: WorkflowInfo): Promise<Record<string, unknown> | null>;
|
|
40
|
+
export type ProcessOne<T> = (info: WorkflowInfo, data: Record<string, unknown>) => Promise<T> | T;
|
|
41
|
+
/** Discover, load, and process all workflows under a directory. */
|
|
42
|
+
export declare function collectTree<T>(root: string, processOne: ProcessOne<T>, includeFormat2?: boolean): Promise<TreeResult<T>>;
|
|
43
|
+
/** Compute a basic summary from tree outcomes. */
|
|
44
|
+
export declare function summarizeOutcomes<T>(outcomes: WorkflowOutcome<T>[], isFail?: (result: T) => boolean): TreeSummary;
|
|
45
|
+
//# sourceMappingURL=tree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tree.d.ts","sourceRoot":"","sources":["../../src/commands/tree.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAO/D,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,cAAc,CAAC;CACxB;AAED,MAAM,WAAW,eAAe,CAAC,CAAC;IAChC,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,CAAC,EAAE,CAAC,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAKD,6DAA6D;AAC7D,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAElD;AAyCD,sDAAsD;AACtD,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,EACZ,cAAc,UAAO,GACpB,OAAO,CAAC,YAAY,EAAE,CAAC,CAKzB;AAkDD,0EAA0E;AAC1E,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAOzC;AAID,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAElG,mEAAmE;AACnE,wBAAsB,WAAW,CAAC,CAAC,EACjC,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,EACzB,cAAc,UAAO,GACpB,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAwBxB;AAED,kDAAkD;AAClD,wBAAgB,iBAAiB,CAAC,CAAC,EACjC,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC,EAAE,EAC9B,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,OAAO,GAC9B,WAAW,CAiBb"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { readdir, readFile } from "node:fs/promises";
|
|
2
|
+
import { join, relative, extname } from "node:path";
|
|
3
|
+
import * as YAML from "yaml";
|
|
4
|
+
/** Thrown by processOne to skip a workflow. */
|
|
5
|
+
class SkipWorkflow extends Error {
|
|
6
|
+
}
|
|
7
|
+
/** Call from processOne to skip a workflow with a reason. */
|
|
8
|
+
export function skipWorkflow(reason) {
|
|
9
|
+
throw new SkipWorkflow(reason);
|
|
10
|
+
}
|
|
11
|
+
// ── Discovery ──────────────────────────────────────────────────────────
|
|
12
|
+
const EXCLUDE_DIRS = new Set([".git", ".hg", ".venv", "node_modules", "__pycache__", ".snakemake"]);
|
|
13
|
+
const NATIVE_EXTENSIONS = new Set([".ga"]);
|
|
14
|
+
const FORMAT2_SUFFIXES = [".gxwf.yml", ".gxwf.yaml"];
|
|
15
|
+
function classifyFile(filename) {
|
|
16
|
+
// Check format2 compound extensions first
|
|
17
|
+
for (const suffix of FORMAT2_SUFFIXES) {
|
|
18
|
+
if (filename.endsWith(suffix))
|
|
19
|
+
return "format2";
|
|
20
|
+
}
|
|
21
|
+
const ext = extname(filename);
|
|
22
|
+
if (NATIVE_EXTENSIONS.has(ext))
|
|
23
|
+
return "native";
|
|
24
|
+
// Plain .json could be native, plain .yml/.yaml could be format2
|
|
25
|
+
if (ext === ".json")
|
|
26
|
+
return "native";
|
|
27
|
+
if (ext === ".yml" || ext === ".yaml")
|
|
28
|
+
return "format2";
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
function isWorkflowContent(data, format) {
|
|
32
|
+
if (format === "native") {
|
|
33
|
+
return data.a_galaxy_workflow === "true";
|
|
34
|
+
}
|
|
35
|
+
return data.class === "GalaxyWorkflow";
|
|
36
|
+
}
|
|
37
|
+
function parseFileContent(raw, format) {
|
|
38
|
+
try {
|
|
39
|
+
if (format === "native") {
|
|
40
|
+
const parsed = JSON.parse(raw);
|
|
41
|
+
return typeof parsed === "object" && parsed !== null ? parsed : null;
|
|
42
|
+
}
|
|
43
|
+
const parsed = YAML.parse(raw);
|
|
44
|
+
return typeof parsed === "object" && parsed !== null ? parsed : null;
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/** Discover workflow files recursively under root. */
|
|
51
|
+
export async function discoverWorkflows(root, includeFormat2 = true) {
|
|
52
|
+
const workflows = [];
|
|
53
|
+
await _walkDir(root, root, includeFormat2, workflows);
|
|
54
|
+
workflows.sort((a, b) => a.relativePath.localeCompare(b.relativePath));
|
|
55
|
+
return workflows;
|
|
56
|
+
}
|
|
57
|
+
async function _walkDir(dir, root, includeFormat2, out) {
|
|
58
|
+
let entries;
|
|
59
|
+
try {
|
|
60
|
+
entries = await readdir(dir, { withFileTypes: true });
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
for (const entry of entries) {
|
|
66
|
+
if (entry.isDirectory()) {
|
|
67
|
+
if (!EXCLUDE_DIRS.has(entry.name)) {
|
|
68
|
+
await _walkDir(join(dir, entry.name), root, includeFormat2, out);
|
|
69
|
+
}
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
if (!entry.isFile())
|
|
73
|
+
continue;
|
|
74
|
+
const format = classifyFile(entry.name);
|
|
75
|
+
if (!format)
|
|
76
|
+
continue;
|
|
77
|
+
if (format === "format2" && !includeFormat2)
|
|
78
|
+
continue;
|
|
79
|
+
const filePath = join(dir, entry.name);
|
|
80
|
+
let raw;
|
|
81
|
+
try {
|
|
82
|
+
raw = await readFile(filePath, "utf-8");
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
const data = parseFileContent(raw, format);
|
|
88
|
+
if (!data || !isWorkflowContent(data, format))
|
|
89
|
+
continue;
|
|
90
|
+
out.push({
|
|
91
|
+
path: filePath,
|
|
92
|
+
relativePath: relative(root, filePath),
|
|
93
|
+
format,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// ── Load ───────────────────────────────────────────────────────────────
|
|
98
|
+
/** Load and parse a discovered workflow file. Returns null on failure. */
|
|
99
|
+
export async function loadWorkflowSafe(info) {
|
|
100
|
+
try {
|
|
101
|
+
const raw = await readFile(info.path, "utf-8");
|
|
102
|
+
return parseFileContent(raw, info.format);
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/** Discover, load, and process all workflows under a directory. */
|
|
109
|
+
export async function collectTree(root, processOne, includeFormat2 = true) {
|
|
110
|
+
const workflows = await discoverWorkflows(root, includeFormat2);
|
|
111
|
+
const outcomes = [];
|
|
112
|
+
for (const info of workflows) {
|
|
113
|
+
const data = await loadWorkflowSafe(info);
|
|
114
|
+
if (!data) {
|
|
115
|
+
outcomes.push({ info, error: "Failed to load workflow" });
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
try {
|
|
119
|
+
const result = await processOne(info, data);
|
|
120
|
+
outcomes.push({ info, result });
|
|
121
|
+
}
|
|
122
|
+
catch (e) {
|
|
123
|
+
if (e instanceof SkipWorkflow) {
|
|
124
|
+
outcomes.push({ info, skipped: true, skipReason: e.message });
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
outcomes.push({ info, error: e instanceof Error ? e.message : String(e) });
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return { root, outcomes };
|
|
132
|
+
}
|
|
133
|
+
/** Compute a basic summary from tree outcomes. */
|
|
134
|
+
export function summarizeOutcomes(outcomes, isFail) {
|
|
135
|
+
let ok = 0;
|
|
136
|
+
let fail = 0;
|
|
137
|
+
let error = 0;
|
|
138
|
+
let skipped = 0;
|
|
139
|
+
for (const o of outcomes) {
|
|
140
|
+
if (o.error) {
|
|
141
|
+
error++;
|
|
142
|
+
}
|
|
143
|
+
else if (o.skipped) {
|
|
144
|
+
skipped++;
|
|
145
|
+
}
|
|
146
|
+
else if (isFail && o.result !== undefined && isFail(o.result)) {
|
|
147
|
+
fail++;
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
ok++;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return { total: outcomes.length, ok, fail, error, skipped };
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=tree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tree.js","sourceRoot":"","sources":["../../src/commands/tree.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ``gxwf validate-tests-tree`` — batch-validate every workflow-test file
|
|
3
|
+
* (``*-tests.yml``, ``*-tests.yaml``, ``*.gxwf-tests.yml``, ``*.gxwf-tests.yaml``)
|
|
4
|
+
* under a directory against the ``galaxy.tool_util_models.Tests`` JSON Schema.
|
|
5
|
+
*
|
|
6
|
+
* Unlike ``validate-tree`` this uses its own discovery pass because test
|
|
7
|
+
* documents don't carry a ``class: GalaxyWorkflow`` / ``a_galaxy_workflow``
|
|
8
|
+
* marker — classification is filename-based.
|
|
9
|
+
*
|
|
10
|
+
* With ``--auto-workflow``, each test file is paired with a sibling workflow
|
|
11
|
+
* by suffix convention and cross-checked. Silent no-op when no sibling is
|
|
12
|
+
* found.
|
|
13
|
+
*/
|
|
14
|
+
import { type TestFormatDiagnostic } from "@galaxy-tool-util/schema";
|
|
15
|
+
export interface ValidateTestsTreeOptions {
|
|
16
|
+
json?: boolean;
|
|
17
|
+
autoWorkflow?: boolean;
|
|
18
|
+
}
|
|
19
|
+
export interface TestsTreeFileReport {
|
|
20
|
+
path: string;
|
|
21
|
+
valid: boolean;
|
|
22
|
+
errors: TestFormatDiagnostic[];
|
|
23
|
+
workflow?: string;
|
|
24
|
+
}
|
|
25
|
+
export interface ValidateTestsTreeReport {
|
|
26
|
+
root: string;
|
|
27
|
+
files: TestsTreeFileReport[];
|
|
28
|
+
summary: {
|
|
29
|
+
total: number;
|
|
30
|
+
ok: number;
|
|
31
|
+
fail: number;
|
|
32
|
+
error: number;
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
export declare function runValidateTestsTree(dir: string, opts?: ValidateTestsTreeOptions): Promise<void>;
|
|
36
|
+
//# sourceMappingURL=validate-tests-tree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-tests-tree.d.ts","sourceRoot":"","sources":["../../src/commands/validate-tests-tree.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,EAML,KAAK,oBAAoB,EAE1B,MAAM,0BAA0B,CAAC;AAElC,MAAM,WAAW,wBAAwB;IACvC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,oBAAoB,EAAE,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,mBAAmB,EAAE,CAAC;IAC7B,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CACrE;AAuID,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,MAAM,EACX,IAAI,GAAE,wBAA6B,GAClC,OAAO,CAAC,IAAI,CAAC,CA6Cf"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ``gxwf validate-tests-tree`` — batch-validate every workflow-test file
|
|
3
|
+
* (``*-tests.yml``, ``*-tests.yaml``, ``*.gxwf-tests.yml``, ``*.gxwf-tests.yaml``)
|
|
4
|
+
* under a directory against the ``galaxy.tool_util_models.Tests`` JSON Schema.
|
|
5
|
+
*
|
|
6
|
+
* Unlike ``validate-tree`` this uses its own discovery pass because test
|
|
7
|
+
* documents don't carry a ``class: GalaxyWorkflow`` / ``a_galaxy_workflow``
|
|
8
|
+
* marker — classification is filename-based.
|
|
9
|
+
*
|
|
10
|
+
* With ``--auto-workflow``, each test file is paired with a sibling workflow
|
|
11
|
+
* by suffix convention and cross-checked. Silent no-op when no sibling is
|
|
12
|
+
* found.
|
|
13
|
+
*/
|
|
14
|
+
import { readdir, readFile, stat } from "node:fs/promises";
|
|
15
|
+
import { dirname, join, relative } from "node:path";
|
|
16
|
+
import { parse as parseYaml } from "yaml";
|
|
17
|
+
import { checkTestsAgainstWorkflow, extractWorkflowInputs, extractWorkflowOutputs, resolveFormat, validateTestsFile, } from "@galaxy-tool-util/schema";
|
|
18
|
+
const EXCLUDE_DIRS = new Set([".git", ".hg", ".venv", "node_modules", "__pycache__", ".snakemake"]);
|
|
19
|
+
const TEST_SUFFIXES = [".gxwf-tests.yml", ".gxwf-tests.yaml", "-tests.yml", "-tests.yaml"];
|
|
20
|
+
const WORKFLOW_EXTS = [".gxwf.yml", ".gxwf.yaml", ".yml", ".yaml", ".ga"];
|
|
21
|
+
function isTestFile(name) {
|
|
22
|
+
return TEST_SUFFIXES.some((s) => name.endsWith(s));
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Derive the workflow basename a given tests file pairs with.
|
|
26
|
+
* `foo.gxwf-tests.yml` → `foo`; `bar-tests.yml` → `bar`.
|
|
27
|
+
*/
|
|
28
|
+
function stripTestsSuffix(name) {
|
|
29
|
+
for (const suffix of TEST_SUFFIXES) {
|
|
30
|
+
if (name.endsWith(suffix))
|
|
31
|
+
return name.slice(0, -suffix.length);
|
|
32
|
+
}
|
|
33
|
+
return undefined;
|
|
34
|
+
}
|
|
35
|
+
async function fileExists(path) {
|
|
36
|
+
try {
|
|
37
|
+
const s = await stat(path);
|
|
38
|
+
return s.isFile();
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Locate a sibling workflow for a tests file. Returns the first existing
|
|
46
|
+
* candidate in suffix-priority order, or undefined if none found.
|
|
47
|
+
*/
|
|
48
|
+
async function findSiblingWorkflow(testsPath) {
|
|
49
|
+
const base = stripTestsSuffix(testsPath.split("/").pop() ?? "");
|
|
50
|
+
if (!base)
|
|
51
|
+
return undefined;
|
|
52
|
+
const dir = dirname(testsPath);
|
|
53
|
+
for (const ext of WORKFLOW_EXTS) {
|
|
54
|
+
const candidate = join(dir, `${base}${ext}`);
|
|
55
|
+
if (await fileExists(candidate))
|
|
56
|
+
return candidate;
|
|
57
|
+
}
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
async function loadWorkflowShape(path) {
|
|
61
|
+
const raw = await readFile(path, "utf-8");
|
|
62
|
+
const parsed = path.endsWith(".ga") || path.endsWith(".json") ? JSON.parse(raw) : parseYaml(raw);
|
|
63
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
64
|
+
throw new Error(`Workflow ${path} did not parse to an object.`);
|
|
65
|
+
}
|
|
66
|
+
const dict = parsed;
|
|
67
|
+
const format = resolveFormat(dict);
|
|
68
|
+
return {
|
|
69
|
+
inputs: extractWorkflowInputs(dict, format),
|
|
70
|
+
outputs: extractWorkflowOutputs(dict, format),
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
async function discoverTestFiles(root) {
|
|
74
|
+
const out = [];
|
|
75
|
+
await walk(root, out);
|
|
76
|
+
out.sort();
|
|
77
|
+
return out;
|
|
78
|
+
}
|
|
79
|
+
async function walk(dir, out) {
|
|
80
|
+
let entries;
|
|
81
|
+
try {
|
|
82
|
+
entries = await readdir(dir, { withFileTypes: true });
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
for (const entry of entries) {
|
|
88
|
+
if (entry.isDirectory()) {
|
|
89
|
+
if (!EXCLUDE_DIRS.has(entry.name)) {
|
|
90
|
+
await walk(join(dir, entry.name), out);
|
|
91
|
+
}
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
if (entry.isFile() && isTestFile(entry.name)) {
|
|
95
|
+
out.push(join(dir, entry.name));
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
async function validateOne(path, root, autoWorkflow) {
|
|
100
|
+
const rel = relative(root, path);
|
|
101
|
+
let parsed;
|
|
102
|
+
try {
|
|
103
|
+
const raw = await readFile(path, "utf-8");
|
|
104
|
+
parsed = parseYaml(raw);
|
|
105
|
+
}
|
|
106
|
+
catch (err) {
|
|
107
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
108
|
+
return {
|
|
109
|
+
path: rel,
|
|
110
|
+
valid: false,
|
|
111
|
+
loadError: true,
|
|
112
|
+
errors: [
|
|
113
|
+
{ path: "(root)", message: `YAML parse error: ${msg}`, keyword: "yaml", params: {} },
|
|
114
|
+
],
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
const { valid: schemaValid, errors } = validateTestsFile(parsed);
|
|
118
|
+
const allErrors = [...errors];
|
|
119
|
+
let pairedWorkflow;
|
|
120
|
+
if (autoWorkflow) {
|
|
121
|
+
const sibling = await findSiblingWorkflow(path);
|
|
122
|
+
if (sibling) {
|
|
123
|
+
pairedWorkflow = relative(root, sibling);
|
|
124
|
+
try {
|
|
125
|
+
const shape = await loadWorkflowShape(sibling);
|
|
126
|
+
allErrors.push(...checkTestsAgainstWorkflow(parsed, shape));
|
|
127
|
+
}
|
|
128
|
+
catch (err) {
|
|
129
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
130
|
+
allErrors.push({
|
|
131
|
+
path: "(root)",
|
|
132
|
+
message: `Failed to load workflow ${pairedWorkflow}: ${msg}`,
|
|
133
|
+
keyword: "workflow_load_error",
|
|
134
|
+
params: { workflow: pairedWorkflow },
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
const valid = schemaValid && allErrors.length === 0;
|
|
140
|
+
const report = { path: rel, valid, errors: allErrors };
|
|
141
|
+
if (pairedWorkflow)
|
|
142
|
+
report.workflow = pairedWorkflow;
|
|
143
|
+
return report;
|
|
144
|
+
}
|
|
145
|
+
export async function runValidateTestsTree(dir, opts = {}) {
|
|
146
|
+
const paths = await discoverTestFiles(dir);
|
|
147
|
+
const files = [];
|
|
148
|
+
for (const p of paths) {
|
|
149
|
+
files.push(await validateOne(p, dir, opts.autoWorkflow === true));
|
|
150
|
+
}
|
|
151
|
+
const summary = {
|
|
152
|
+
total: files.length,
|
|
153
|
+
ok: files.filter((f) => f.valid).length,
|
|
154
|
+
fail: files.filter((f) => !f.valid && !f.loadError).length,
|
|
155
|
+
error: files.filter((f) => f.loadError).length,
|
|
156
|
+
};
|
|
157
|
+
const report = {
|
|
158
|
+
root: dir,
|
|
159
|
+
files: files.map(({ path, valid, errors, workflow }) => {
|
|
160
|
+
const entry = { path, valid, errors };
|
|
161
|
+
if (workflow)
|
|
162
|
+
entry.workflow = workflow;
|
|
163
|
+
return entry;
|
|
164
|
+
}),
|
|
165
|
+
summary,
|
|
166
|
+
};
|
|
167
|
+
if (opts.json) {
|
|
168
|
+
console.log(JSON.stringify(report, null, 2));
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
for (const f of files) {
|
|
172
|
+
const wfNote = f.workflow ? ` [workflow: ${f.workflow}]` : "";
|
|
173
|
+
if (f.loadError) {
|
|
174
|
+
console.error(` ${f.path}: ERROR (${f.errors[0]?.message ?? "load failed"})`);
|
|
175
|
+
}
|
|
176
|
+
else if (f.valid) {
|
|
177
|
+
console.log(` ${f.path}: OK${wfNote}`);
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
console.error(` ${f.path}: ${f.errors.length} validation error(s)${wfNote}`);
|
|
181
|
+
for (const e of f.errors) {
|
|
182
|
+
console.error(` ${e.path}: ${e.message} [${e.keyword}]`);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
const s = summary;
|
|
187
|
+
console.log(`\nSummary: ${s.total} files | ${s.ok} OK, ${s.fail} FAIL, ${s.error} ERROR`);
|
|
188
|
+
}
|
|
189
|
+
process.exitCode = summary.fail > 0 || summary.error > 0 ? 1 : 0;
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=validate-tests-tree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-tests-tree.js","sourceRoot":"","sources":["../../src/commands/validate-tests-tree.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ``gxwf validate-tests`` — validate a workflow-test file (``*-tests.yml`` /
|
|
3
|
+
* ``*.gxwf-tests.yml``) against the JSON Schema synced from Galaxy's
|
|
4
|
+
* ``galaxy.tool_util_models.Tests`` Pydantic model.
|
|
5
|
+
*
|
|
6
|
+
* With ``--workflow <path>`` also cross-checks inputs/outputs against the
|
|
7
|
+
* referenced workflow: unknown job keys, missing required inputs, type
|
|
8
|
+
* mismatches, unknown output assertions.
|
|
9
|
+
*/
|
|
10
|
+
import { type TestFormatDiagnostic } from "@galaxy-tool-util/schema";
|
|
11
|
+
export interface ValidateTestsOptions {
|
|
12
|
+
json?: boolean;
|
|
13
|
+
workflow?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface ValidateTestsReport {
|
|
16
|
+
file: string;
|
|
17
|
+
valid: boolean;
|
|
18
|
+
errors: TestFormatDiagnostic[];
|
|
19
|
+
}
|
|
20
|
+
export declare function runValidateTests(filePath: string, opts?: ValidateTestsOptions): Promise<void>;
|
|
21
|
+
//# sourceMappingURL=validate-tests.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-tests.d.ts","sourceRoot":"","sources":["../../src/commands/validate-tests.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EAML,KAAK,oBAAoB,EAE1B,MAAM,0BAA0B,CAAC;AAElC,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,oBAAoB,EAAE,CAAC;CAChC;AAiBD,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,oBAAyB,GAC9B,OAAO,CAAC,IAAI,CAAC,CAwDf"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ``gxwf validate-tests`` — validate a workflow-test file (``*-tests.yml`` /
|
|
3
|
+
* ``*.gxwf-tests.yml``) against the JSON Schema synced from Galaxy's
|
|
4
|
+
* ``galaxy.tool_util_models.Tests`` Pydantic model.
|
|
5
|
+
*
|
|
6
|
+
* With ``--workflow <path>`` also cross-checks inputs/outputs against the
|
|
7
|
+
* referenced workflow: unknown job keys, missing required inputs, type
|
|
8
|
+
* mismatches, unknown output assertions.
|
|
9
|
+
*/
|
|
10
|
+
import { readFile } from "node:fs/promises";
|
|
11
|
+
import { parse as parseYaml } from "yaml";
|
|
12
|
+
import { checkTestsAgainstWorkflow, extractWorkflowInputs, extractWorkflowOutputs, resolveFormat, validateTestsFile, } from "@galaxy-tool-util/schema";
|
|
13
|
+
async function loadWorkflowShape(path) {
|
|
14
|
+
const raw = await readFile(path, "utf-8");
|
|
15
|
+
const parsed = path.endsWith(".ga") || path.endsWith(".json") ? JSON.parse(raw) : parseYaml(raw);
|
|
16
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
17
|
+
throw new Error(`Workflow ${path} did not parse to an object.`);
|
|
18
|
+
}
|
|
19
|
+
const dict = parsed;
|
|
20
|
+
const format = resolveFormat(dict);
|
|
21
|
+
return {
|
|
22
|
+
inputs: extractWorkflowInputs(dict, format),
|
|
23
|
+
outputs: extractWorkflowOutputs(dict, format),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
export async function runValidateTests(filePath, opts = {}) {
|
|
27
|
+
const raw = await readFile(filePath, "utf-8");
|
|
28
|
+
let parsed;
|
|
29
|
+
try {
|
|
30
|
+
parsed = parseYaml(raw);
|
|
31
|
+
}
|
|
32
|
+
catch (err) {
|
|
33
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
34
|
+
if (opts.json) {
|
|
35
|
+
const report = {
|
|
36
|
+
file: filePath,
|
|
37
|
+
valid: false,
|
|
38
|
+
errors: [
|
|
39
|
+
{ path: "(root)", message: `YAML parse error: ${msg}`, keyword: "yaml", params: {} },
|
|
40
|
+
],
|
|
41
|
+
};
|
|
42
|
+
console.log(JSON.stringify(report, null, 2));
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
console.error(`${filePath}: YAML parse error: ${msg}`);
|
|
46
|
+
}
|
|
47
|
+
process.exitCode = 2;
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const { valid: schemaValid, errors } = validateTestsFile(parsed);
|
|
51
|
+
const allErrors = [...errors];
|
|
52
|
+
if (opts.workflow) {
|
|
53
|
+
try {
|
|
54
|
+
const shape = await loadWorkflowShape(opts.workflow);
|
|
55
|
+
allErrors.push(...checkTestsAgainstWorkflow(parsed, shape));
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
59
|
+
allErrors.push({
|
|
60
|
+
path: "(root)",
|
|
61
|
+
message: `Failed to load workflow ${opts.workflow}: ${msg}`,
|
|
62
|
+
keyword: "workflow_load_error",
|
|
63
|
+
params: { workflow: opts.workflow },
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
const valid = schemaValid && allErrors.length === 0;
|
|
68
|
+
if (opts.json) {
|
|
69
|
+
const report = { file: filePath, valid, errors: allErrors };
|
|
70
|
+
console.log(JSON.stringify(report, null, 2));
|
|
71
|
+
}
|
|
72
|
+
else if (valid) {
|
|
73
|
+
console.log(`${filePath}: OK`);
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
console.error(`${filePath}: ${allErrors.length} validation error(s)`);
|
|
77
|
+
for (const e of allErrors) {
|
|
78
|
+
console.error(` ${e.path}: ${e.message} [${e.keyword}]`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
process.exitCode = valid ? 0 : 1;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=validate-tests.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-tests.js","sourceRoot":"","sources":["../../src/commands/validate-tests.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type StrictOptions } from "./strict-options.js";
|
|
2
|
+
import { type ReportOutputOptions } from "./report-output.js";
|
|
3
|
+
export interface ValidateTreeOptions extends StrictOptions, ReportOutputOptions {
|
|
4
|
+
format?: string;
|
|
5
|
+
toolState?: boolean;
|
|
6
|
+
cacheDir?: string;
|
|
7
|
+
mode?: string;
|
|
8
|
+
toolSchemaDir?: string;
|
|
9
|
+
json?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare function runValidateTree(dir: string, opts: ValidateTreeOptions): Promise<void>;
|
|
12
|
+
//# sourceMappingURL=validate-tree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-tree.d.ts","sourceRoot":"","sources":["../../src/commands/validate-tree.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAwB,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAQ/E,OAAO,EAAsC,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAElG,MAAM,WAAW,mBAAoB,SAAQ,aAAa,EAAE,mBAAmB;IAC7E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyG3F"}
|