diff --git a/client/galaxy/scripts/components/Datatypes/factory.js b/client/galaxy/scripts/components/Datatypes/factory.js new file mode 100644 index 00000000000..19637145afb --- /dev/null +++ b/client/galaxy/scripts/components/Datatypes/factory.js @@ -0,0 +1,7 @@ +import { DatatypesMapperModel } from "./model.js"; +import { getDatatypes } from "./services"; + +export async function getDatatypesMapper() { + const typesAndMapping = await getDatatypes(); + return new DatatypesMapperModel(typesAndMapping); +} diff --git a/client/galaxy/scripts/components/Datatypes/index.js b/client/galaxy/scripts/components/Datatypes/index.js new file mode 100644 index 00000000000..3350500fd3b --- /dev/null +++ b/client/galaxy/scripts/components/Datatypes/index.js @@ -0,0 +1 @@ +export { getDatatypesMapper } from "./factory.js"; diff --git a/client/galaxy/scripts/components/Datatypes/index.test.js b/client/galaxy/scripts/components/Datatypes/index.test.js new file mode 100644 index 00000000000..bf895148209 --- /dev/null +++ b/client/galaxy/scripts/components/Datatypes/index.test.js @@ -0,0 +1,27 @@ +import axios from "axios"; +import MockAdapter from "axios-mock-adapter"; + +import { getDatatypesMapper } from "./index"; +import { typesAndMappingResponse } from "./test_fixtures"; + +describe("Datatypes/index.js", () => { + let axiosMock; + + beforeEach(() => { + axiosMock = new MockAdapter(axios); + }); + + afterEach(() => { + axiosMock.restore(); + }); + + describe("getDatatypesMapper", () => { + it("should fetch logic from API for comparing datatypes in a hierarchy", async () => { + axiosMock.onGet(`/api/datatypes/types_and_mapping`).reply(200, typesAndMappingResponse); + await getDatatypesMapper().then((mapper) => { + expect(mapper.isSubType("txt", "data")).to.equals(true); + expect(mapper.isSubType("data", "txt")).to.equals(false); + }); + }); + }); +}); diff --git a/client/galaxy/scripts/components/Datatypes/model.js b/client/galaxy/scripts/components/Datatypes/model.js new file mode 100644 index 00000000000..1039dd96d20 --- /dev/null +++ b/client/galaxy/scripts/components/Datatypes/model.js @@ -0,0 +1,13 @@ +export class DatatypesMapperModel { + constructor(typesAndMapping) { + this.datatypes = typesAndMapping.datatypes; + this.datatypesMapping = typesAndMapping.datatypes_mapping; + } + + isSubType(child, parent) { + const mapping = this.datatypesMapping; + child = mapping.ext_to_class_name[child]; + parent = mapping.ext_to_class_name[parent]; + return mapping.class_to_classes[child] && parent in mapping.class_to_classes[child]; + } +} diff --git a/client/galaxy/scripts/components/Datatypes/services.js b/client/galaxy/scripts/components/Datatypes/services.js new file mode 100644 index 00000000000..f6ba04aa71f --- /dev/null +++ b/client/galaxy/scripts/components/Datatypes/services.js @@ -0,0 +1,12 @@ +import axios from "axios"; +import { rethrowSimple } from "utils/simple-error"; +import { getAppRoot } from "onload/loadConfig"; + +export async function getDatatypes() { + try { + const request = await axios.get(`${getAppRoot()}api/datatypes/types_and_mapping`); + return request.data; + } catch (e) { + rethrowSimple(e); + } +} diff --git a/client/galaxy/scripts/components/Datatypes/test_fixtures.js b/client/galaxy/scripts/components/Datatypes/test_fixtures.js new file mode 100644 index 00000000000..39897c7480a --- /dev/null +++ b/client/galaxy/scripts/components/Datatypes/test_fixtures.js @@ -0,0 +1,10 @@ +import DatatypesMappingJson from "qunit/test-data/json/datatypes.mapping.json"; +import DatatypesJson from "qunit/test-data/json/datatypes.json"; +import { DatatypesMapperModel } from "./model.js"; + +export const typesAndMappingResponse = { + datatypes: DatatypesJson, + datatypes_mapping: DatatypesMappingJson, +}; + +export const testDatatypesMapper = new DatatypesMapperModel(typesAndMappingResponse); diff --git a/client/galaxy/scripts/components/ToolRecommendation.vue b/client/galaxy/scripts/components/ToolRecommendation.vue index 3ccfc00b891..65a06946727 100644 --- a/client/galaxy/scripts/components/ToolRecommendation.vue +++ b/client/galaxy/scripts/components/ToolRecommendation.vue @@ -17,7 +17,8 @@