Skip to content

Commit

Permalink
enhance: add support for disabling the creation of file revisions
Browse files Browse the repository at this point in the history
Signed-off-by: Donnie Adams <[email protected]>
  • Loading branch information
thedadams committed Jan 27, 2025
1 parent 83490b5 commit 926b9da
Show file tree
Hide file tree
Showing 2 changed files with 181 additions and 6 deletions.
17 changes: 11 additions & 6 deletions workspace.go
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,8 @@ func (g *GPTScript) RemoveAll(ctx context.Context, opts ...RemoveAllOptions) err
}

type WriteFileInWorkspaceOptions struct {
WorkspaceID string
WorkspaceID string
CreateRevision *bool
}

func (g *GPTScript) WriteFileInWorkspace(ctx context.Context, filePath string, contents []byte, opts ...WriteFileInWorkspaceOptions) error {
Expand All @@ -130,18 +131,22 @@ func (g *GPTScript) WriteFileInWorkspace(ctx context.Context, filePath string, c
if o.WorkspaceID != "" {
opt.WorkspaceID = o.WorkspaceID
}
if o.CreateRevision != nil {
opt.CreateRevision = o.CreateRevision
}
}

if opt.WorkspaceID == "" {
opt.WorkspaceID = os.Getenv("GPTSCRIPT_WORKSPACE_ID")
}

_, err := g.runBasicCommand(ctx, "workspaces/write-file", map[string]any{
"id": opt.WorkspaceID,
"contents": base64.StdEncoding.EncodeToString(contents),
"filePath": filePath,
"workspaceTool": g.globalOpts.WorkspaceTool,
"env": g.globalOpts.Env,
"id": opt.WorkspaceID,
"contents": base64.StdEncoding.EncodeToString(contents),
"filePath": filePath,
"createRevision": opt.CreateRevision,
"workspaceTool": g.globalOpts.WorkspaceTool,
"env": g.globalOpts.Env,
})

return err
Expand Down
170 changes: 170 additions & 0 deletions workspace_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,89 @@ func TestRevisionsForFileInWorkspace(t *testing.T) {
}
}

func TestDisableCreateRevisionsForFileInWorkspace(t *testing.T) {
id, err := g.CreateWorkspace(context.Background(), "directory")
if err != nil {
t.Fatalf("Error creating workspace: %v", err)
}

t.Cleanup(func() {
err := g.DeleteWorkspace(context.Background(), id)
if err != nil {
t.Errorf("Error deleting workspace: %v", err)
}
})

err = g.WriteFileInWorkspace(context.Background(), "test.txt", []byte("test0"), WriteFileInWorkspaceOptions{WorkspaceID: id})
if err != nil {
t.Fatalf("Error creating file: %v", err)
}

err = g.WriteFileInWorkspace(context.Background(), "test.txt", []byte("test1"), WriteFileInWorkspaceOptions{WorkspaceID: id, CreateRevision: new(bool)})
if err != nil {
t.Fatalf("Error creating file: %v", err)
}

err = g.WriteFileInWorkspace(context.Background(), "test.txt", []byte("test2"), WriteFileInWorkspaceOptions{WorkspaceID: id})
if err != nil {
t.Fatalf("Error creating file: %v", err)
}

revisions, err := g.ListRevisionsForFileInWorkspace(context.Background(), "test.txt", ListRevisionsForFileInWorkspaceOptions{WorkspaceID: id})
if err != nil {
t.Errorf("Error reading file: %v", err)
}

if len(revisions) != 1 {
t.Errorf("Unexpected number of revisions: %d", len(revisions))
}

for i, rev := range revisions {
if rev.WorkspaceID != id {
t.Errorf("Unexpected file workspace ID: %v", rev.WorkspaceID)
}

if rev.Name != "test.txt" {
t.Errorf("Unexpected file name: %s", rev.Name)
}

if rev.Size != 5 {
t.Errorf("Unexpected file size: %d", rev.Size)
}

if rev.ModTime.IsZero() {
t.Errorf("Unexpected file mod time: %v", rev.ModTime)
}

if rev.MimeType != "text/plain" {
t.Errorf("Unexpected file mime type: %s", rev.MimeType)
}

if rev.RevisionID != fmt.Sprintf("%d", i+1) {
t.Errorf("Unexpected revision ID: %s", rev.RevisionID)
}
}

err = g.DeleteRevisionForFileInWorkspace(context.Background(), "test.txt", "1", DeleteRevisionForFileInWorkspaceOptions{WorkspaceID: id})
if err != nil {
t.Errorf("Error deleting revision for file: %v", err)
}

revisions, err = g.ListRevisionsForFileInWorkspace(context.Background(), "test.txt", ListRevisionsForFileInWorkspaceOptions{WorkspaceID: id})
if err != nil {
t.Errorf("Error reading file: %v", err)
}

if len(revisions) != 0 {
t.Errorf("Unexpected number of revisions: %d", len(revisions))
}

err = g.DeleteFileInWorkspace(context.Background(), "test.txt", DeleteFileInWorkspaceOptions{WorkspaceID: id})
if err != nil {
t.Errorf("Error deleting file: %v", err)
}
}

func TestLsComplexWorkspace(t *testing.T) {
id, err := g.CreateWorkspace(context.Background(), "directory")
if err != nil {
Expand Down Expand Up @@ -607,6 +690,93 @@ func TestRevisionsForFileInWorkspaceS3(t *testing.T) {
}
}

func TestDisableCreatingRevisionsForFileInWorkspaceS3(t *testing.T) {
if os.Getenv("AWS_ACCESS_KEY_ID") == "" || os.Getenv("AWS_SECRET_ACCESS_KEY") == "" || os.Getenv("WORKSPACE_PROVIDER_S3_BUCKET") == "" {
t.Skip("Skipping test because AWS credentials are not set")
}

id, err := g.CreateWorkspace(context.Background(), "s3")
if err != nil {
t.Fatalf("Error creating workspace: %v", err)
}

t.Cleanup(func() {
err := g.DeleteWorkspace(context.Background(), id)
if err != nil {
t.Errorf("Error deleting workspace: %v", err)
}
})

err = g.WriteFileInWorkspace(context.Background(), "test.txt", []byte("test0"), WriteFileInWorkspaceOptions{WorkspaceID: id})
if err != nil {
t.Fatalf("Error creating file: %v", err)
}

err = g.WriteFileInWorkspace(context.Background(), "test.txt", []byte("test1"), WriteFileInWorkspaceOptions{WorkspaceID: id, CreateRevision: new(bool)})
if err != nil {
t.Fatalf("Error creating file: %v", err)
}

err = g.WriteFileInWorkspace(context.Background(), "test.txt", []byte("test2"), WriteFileInWorkspaceOptions{WorkspaceID: id})
if err != nil {
t.Fatalf("Error creating file: %v", err)
}

revisions, err := g.ListRevisionsForFileInWorkspace(context.Background(), "test.txt", ListRevisionsForFileInWorkspaceOptions{WorkspaceID: id})
if err != nil {
t.Errorf("Error reading file: %v", err)
}

if len(revisions) != 1 {
t.Errorf("Unexpected number of revisions: %d", len(revisions))
}

for i, rev := range revisions {
if rev.WorkspaceID != id {
t.Errorf("Unexpected file workspace ID: %v", rev.WorkspaceID)
}

if rev.Name != "test.txt" {
t.Errorf("Unexpected file name: %s", rev.Name)
}

if rev.Size != 5 {
t.Errorf("Unexpected file size: %d", rev.Size)
}

if rev.ModTime.IsZero() {
t.Errorf("Unexpected file mod time: %v", rev.ModTime)
}

if rev.MimeType != "text/plain" {
t.Errorf("Unexpected file mime type: %s", rev.MimeType)
}

if rev.RevisionID != fmt.Sprintf("%d", i+1) {
t.Errorf("Unexpected revision ID: %s", rev.RevisionID)
}
}

err = g.DeleteRevisionForFileInWorkspace(context.Background(), "test.txt", "1", DeleteRevisionForFileInWorkspaceOptions{WorkspaceID: id})
if err != nil {
t.Errorf("Error deleting revision for file: %v", err)
}

revisions, err = g.ListRevisionsForFileInWorkspace(context.Background(), "test.txt", ListRevisionsForFileInWorkspaceOptions{WorkspaceID: id})
if err != nil {
t.Errorf("Error reading file: %v", err)
}

if len(revisions) != 0 {
t.Errorf("Unexpected number of revisions: %d", len(revisions))
}

err = g.DeleteFileInWorkspace(context.Background(), "test.txt", DeleteFileInWorkspaceOptions{WorkspaceID: id})
if err != nil {
t.Errorf("Error deleting file: %v", err)
}
}

func TestLsComplexWorkspaceS3(t *testing.T) {
if os.Getenv("AWS_ACCESS_KEY_ID") == "" || os.Getenv("AWS_SECRET_ACCESS_KEY") == "" || os.Getenv("WORKSPACE_PROVIDER_S3_BUCKET") == "" {
t.Skip("Skipping test because AWS credentials are not set")
Expand Down

0 comments on commit 926b9da

Please sign in to comment.