Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .stats.yml
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
configured_endpoints: 12
configured_endpoints: 15
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/writerai%2Fwriter-2aa0ec0ea99873da5dac6ecf610efdd6ccfe5601d2400f8c475d994cd47c2c36.yml
4 changes: 4 additions & 0 deletions api.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,12 @@ Methods:
Types:

- <code><a href="./src/resources/files.ts">File</a></code>
- <code><a href="./src/resources/files.ts">FileDeleteResponse</a></code>

Methods:

- <code title="get /v1/files/{file_id}">client.files.<a href="./src/resources/files.ts">retrieve</a>(fileId) -> File</code>
- <code title="get /v1/files">client.files.<a href="./src/resources/files.ts">list</a>({ ...params }) -> FilesCursorPage</code>
- <code title="delete /v1/files/{file_id}">client.files.<a href="./src/resources/files.ts">delete</a>(fileId) -> FileDeleteResponse</code>
- <code title="get /v1/files/{file_id}/download">client.files.<a href="./src/resources/files.ts">download</a>(fileId) -> Response</code>
- <code title="post /v1/files">client.files.<a href="./src/resources/files.ts">upload</a>({ ...params }) -> File</code>
1 change: 1 addition & 0 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -218,6 +218,7 @@ export namespace Writer {

export import Files = API.Files;
export import File = API.File;
export import FileDeleteResponse = API.FileDeleteResponse;
export import FilesCursorPage = API.FilesCursorPage;
export import FileListParams = API.FileListParams;
export import FileUploadParams = API.FileUploadParams;
Expand Down
35 changes: 35 additions & 0 deletions src/resources/files.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,16 @@ import { isRequestOptions } from '../core';
import * as Core from '../core';
import * as FilesAPI from './files';
import { CursorPage, type CursorPageParams } from '../pagination';
import { type Response } from '../_shims/index';

export class Files extends APIResource {
/**
* Retrieve file
*/
retrieve(fileId: string, options?: Core.RequestOptions): Core.APIPromise<File> {
return this._client.get(`/v1/files/${fileId}`, options);
}

/**
* List files
*/
Expand All @@ -22,6 +30,20 @@ export class Files extends APIResource {
return this._client.getAPIList('/v1/files', FilesCursorPage, { query, ...options });
}

/**
* Delete file
*/
delete(fileId: string, options?: Core.RequestOptions): Core.APIPromise<FileDeleteResponse> {
return this._client.delete(`/v1/files/${fileId}`, options);
}

/**
* Download file
*/
download(fileId: string, options?: Core.RequestOptions): Core.APIPromise<Response> {
return this._client.get(`/v1/files/${fileId}/download`, { ...options, __binaryResponse: true });
}

/**
* Upload file
*/
Expand Down Expand Up @@ -70,6 +92,18 @@ export interface File {
name: string;
}

export interface FileDeleteResponse {
/**
* A unique identifier of the deleted graph.
*/
id: string;

/**
* Indicates whether the graph was successfully deleted.
*/
deleted: boolean;
}

export interface FileListParams extends CursorPageParams {
/**
* The unique identifier of the graph to which the files belong.
Expand Down Expand Up @@ -114,6 +148,7 @@ export interface FileUploadParams {

export namespace Files {
export import File = FilesAPI.File;
export import FileDeleteResponse = FilesAPI.FileDeleteResponse;
export import FilesCursorPage = FilesAPI.FilesCursorPage;
export import FileListParams = FilesAPI.FileListParams;
export import FileUploadParams = FilesAPI.FileUploadParams;
Expand Down
2 changes: 1 addition & 1 deletion src/resources/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ export {
CompletionCreateParamsStreaming,
Completions,
} from './completions';
export { File, FileListParams, FileUploadParams, FilesCursorPage, Files } from './files';
export { File, FileDeleteResponse, FileListParams, FileUploadParams, FilesCursorPage, Files } from './files';
export {
Graph,
GraphCreateResponse,
Expand Down
44 changes: 44 additions & 0 deletions tests/api-resources/files.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,24 @@ const writer = new Writer({
});

describe('resource files', () => {
test('retrieve', async () => {
const responsePromise = writer.files.retrieve('file_id');
const rawResponse = await responsePromise.asResponse();
expect(rawResponse).toBeInstanceOf(Response);
const response = await responsePromise;
expect(response).not.toBeInstanceOf(Response);
const dataAndResponse = await responsePromise.withResponse();
expect(dataAndResponse.data).toBe(response);
expect(dataAndResponse.response).toBe(rawResponse);
});

test('retrieve: request options instead of params are passed correctly', async () => {
// ensure the request options are being passed correctly by passing an invalid HTTP method in order to cause an error
await expect(writer.files.retrieve('file_id', { path: '/_stainless_unknown_path' })).rejects.toThrow(
Writer.NotFoundError,
);
});

test('list', async () => {
const responsePromise = writer.files.list();
const rawResponse = await responsePromise.asResponse();
Expand Down Expand Up @@ -43,6 +61,32 @@ describe('resource files', () => {
).rejects.toThrow(Writer.NotFoundError);
});

test('delete', async () => {
const responsePromise = writer.files.delete('file_id');
const rawResponse = await responsePromise.asResponse();
expect(rawResponse).toBeInstanceOf(Response);
const response = await responsePromise;
expect(response).not.toBeInstanceOf(Response);
const dataAndResponse = await responsePromise.withResponse();
expect(dataAndResponse.data).toBe(response);
expect(dataAndResponse.response).toBe(rawResponse);
});

test('delete: request options instead of params are passed correctly', async () => {
// ensure the request options are being passed correctly by passing an invalid HTTP method in order to cause an error
await expect(writer.files.delete('file_id', { path: '/_stainless_unknown_path' })).rejects.toThrow(
Writer.NotFoundError,
);
});

// requests with binary data not yet supported in test environment
test.skip('download: request options instead of params are passed correctly', async () => {
// ensure the request options are being passed correctly by passing an invalid HTTP method in order to cause an error
await expect(writer.files.download('file_id', { path: '/_stainless_unknown_path' })).rejects.toThrow(
Writer.NotFoundError,
);
});

// requests with binary data not yet supported in test environment
test.skip('upload: only required params', async () => {
const responsePromise = writer.files.upload({
Expand Down