Skip to content

Commit cc3b96f

Browse files
committed
Enable fetching all versions of a model
1 parent db5723f commit cc3b96f

File tree

2 files changed

+88
-0
lines changed

2 files changed

+88
-0
lines changed

lib/ReplicateClient.js

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,39 @@ export default class ReplicateClient {
2121
}
2222
}
2323

24+
async getModelVersions(nameOrParams) {
25+
let owner, name;
26+
27+
if (typeof nameOrParams === "string") {
28+
const nameComponents = /^([\w-]+)\/([\w-]+)$/.exec(nameOrParams);
29+
30+
if (!nameComponents) {
31+
throw new ReplicateError(`Invalid name: ${nameOrParams}`);
32+
}
33+
34+
[, owner, name] = nameComponents;
35+
} else if (nameOrParams.owner) {
36+
owner = nameOrParams.owner;
37+
name = nameOrParams.name;
38+
} else {
39+
const nameComponents = /^([\w-]+)\/([\w-]+)$/.exec(nameOrParams.name);
40+
41+
if (!nameComponents) {
42+
throw new ReplicateError(`Invalid name: ${nameOrParams.name}`);
43+
}
44+
45+
[, owner, name] = nameComponents;
46+
}
47+
48+
const versions = await this.request(
49+
`GET /v1/models/${owner}/${name}/versions`
50+
);
51+
52+
return versions.map(
53+
(version) => new Model({ owner, name, ...version }, this)
54+
);
55+
}
56+
2457
model(idOrParams) {
2558
let owner, name, version;
2659

lib/ReplicateClient.test.js

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,61 @@ describe("constructor()", () => {
6565
});
6666
});
6767

68+
describe("getModelVersions()", () => {
69+
beforeEach(() => {
70+
jest
71+
.spyOn(client, "request")
72+
.mockResolvedValue([
73+
{ id: "testversion0" },
74+
{ id: "testversion1" },
75+
{ id: "testversion2" },
76+
{ id: "testversion3" },
77+
{ id: "testversion4" },
78+
]);
79+
});
80+
81+
it("returns array of Models", async () => {
82+
const models = await client.getModelVersions("test-owner/test-name");
83+
84+
expect(models).toBeInstanceOf(Array);
85+
expect(models[0]).toBeInstanceOf(Model);
86+
});
87+
88+
it("returns array of Models with version set", async () => {
89+
const models = await client.getModelVersions("test-owner/test-name");
90+
91+
expect(models).toBeInstanceOf(Array);
92+
expect(models[0]).toBeInstanceOf(Model);
93+
expect(models[0].version).toBe("testversion0");
94+
});
95+
96+
it("parses name string", async () => {
97+
const models = await client.getModelVersions("test-owner/test-name");
98+
99+
expect(models[0].owner).toBe("test-owner");
100+
expect(models[0].name).toBe("test-name");
101+
});
102+
103+
it("handles complete params", async () => {
104+
const models = await client.getModelVersions({
105+
owner: "test-owner",
106+
name: "test-name",
107+
});
108+
109+
expect(models[0].owner).toBe("test-owner");
110+
expect(models[0].name).toBe("test-name");
111+
});
112+
113+
it("handles params with combined name", async () => {
114+
const models = await client.getModelVersions({
115+
name: "test-owner/test-name",
116+
});
117+
118+
expect(models[0].owner).toBe("test-owner");
119+
expect(models[0].name).toBe("test-name");
120+
});
121+
});
122+
68123
describe("model()", () => {
69124
it("returns Model", () => {
70125
const model = client.model("test-owner/test-name@testversion");

0 commit comments

Comments
 (0)