Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add excel tools #63

Merged
merged 1 commit into from
Oct 1, 2024
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
3 changes: 3 additions & 0 deletions apis/excel/code/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
.idea/
.vscode/
bin/
3 changes: 3 additions & 0 deletions apis/excel/code/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
.PHONY: build
build:
go build -o bin/gptscript-go-tool .
34 changes: 34 additions & 0 deletions apis/excel/code/go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
module github.com/gptscript-ai/tools/apis/excel/code

go 1.23.1

require (
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.14.0
github.com/microsoftgraph/msgraph-sdk-go v1.48.0
)

require (
github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 // indirect
github.com/cjlapao/common-go v0.0.39 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/go-logr/logr v1.4.1 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/microsoft/kiota-abstractions-go v1.7.0 // indirect
github.com/microsoft/kiota-authentication-azure-go v1.1.0 // indirect
github.com/microsoft/kiota-http-go v1.4.4 // indirect
github.com/microsoft/kiota-serialization-form-go v1.0.0 // indirect
github.com/microsoft/kiota-serialization-json-go v1.0.8 // indirect
github.com/microsoft/kiota-serialization-multipart-go v1.0.0 // indirect
github.com/microsoft/kiota-serialization-text-go v1.0.0 // indirect
github.com/microsoftgraph/msgraph-sdk-go-core v1.2.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/std-uritemplate/std-uritemplate/go v0.0.57 // indirect
github.com/stretchr/testify v1.9.0 // indirect
go.opentelemetry.io/otel v1.24.0 // indirect
go.opentelemetry.io/otel/metric v1.24.0 // indirect
go.opentelemetry.io/otel/trace v1.24.0 // indirect
golang.org/x/net v0.27.0 // indirect
golang.org/x/text v0.16.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
62 changes: 62 additions & 0 deletions apis/excel/code/go.sum
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.14.0 h1:nyQWyZvwGTvunIMxi1Y9uXkcyr+I7TeNrr/foo4Kpk8=
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.14.0/go.mod h1:l38EPgmsp71HHLq9j7De57JcKOWPyhrsW1Awm1JS6K0=
github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 h1:ywEEhmNahHBihViHepv3xPBn1663uRv2t2q/ESv9seY=
github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0/go.mod h1:iZDifYGJTIgIIkYRNWPENUnqx6bJ2xnSDFI2tjwZNuY=
github.com/cjlapao/common-go v0.0.39 h1:bAAUrj2B9v0kMzbAOhzjSmiyDy+rd56r2sy7oEiQLlA=
github.com/cjlapao/common-go v0.0.39/go.mod h1:M3dzazLjTjEtZJbbxoA5ZDiGCiHmpwqW9l4UWaddwOA=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=
github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/microsoft/kiota-abstractions-go v1.7.0 h1:/0OKSSEe94Z1qgpcGE7ZFI9P+4iAnsDQo9v9UOk+R8E=
github.com/microsoft/kiota-abstractions-go v1.7.0/go.mod h1:FI1I2OHg0E7bK5t8DPnw+9C/CHVyLP6XeqDBT+95pTE=
github.com/microsoft/kiota-authentication-azure-go v1.1.0 h1:HudH57Enel9zFQ4TEaJw6lMiyZ5RbBdrRHwdU0NP2RY=
github.com/microsoft/kiota-authentication-azure-go v1.1.0/go.mod h1:zfPFOiLdEqM77Hua5B/2vpcXrVaGqSWjHSRzlvAWEgc=
github.com/microsoft/kiota-http-go v1.4.4 h1:HM0KT/Q7o+JsGatFkkbTIqJL24Jzo5eMI5NNe9N4TQ4=
github.com/microsoft/kiota-http-go v1.4.4/go.mod h1:Kup5nMDD3a9sjdgRKHCqZWqtrv3FbprjcPaGjLR6FzM=
github.com/microsoft/kiota-serialization-form-go v1.0.0 h1:UNdrkMnLFqUCccQZerKjblsyVgifS11b3WCx+eFEsAI=
github.com/microsoft/kiota-serialization-form-go v1.0.0/go.mod h1:h4mQOO6KVTNciMF6azi1J9QB19ujSw3ULKcSNyXXOMA=
github.com/microsoft/kiota-serialization-json-go v1.0.8 h1:+aViv9k6wqaw1Fx6P49fl5GIB1hN3b6CG0McNTcUYBc=
github.com/microsoft/kiota-serialization-json-go v1.0.8/go.mod h1:O8+v11U0EUwHlCz7hrW38KxDmdhKAHfv4Q89uvsBalY=
github.com/microsoft/kiota-serialization-multipart-go v1.0.0 h1:3O5sb5Zj+moLBiJympbXNaeV07K0d46IfuEd5v9+pBs=
github.com/microsoft/kiota-serialization-multipart-go v1.0.0/go.mod h1:yauLeBTpANk4L03XD985akNysG24SnRJGaveZf+p4so=
github.com/microsoft/kiota-serialization-text-go v1.0.0 h1:XOaRhAXy+g8ZVpcq7x7a0jlETWnWrEum0RhmbYrTFnA=
github.com/microsoft/kiota-serialization-text-go v1.0.0/go.mod h1:sM1/C6ecnQ7IquQOGUrUldaO5wj+9+v7G2W3sQ3fy6M=
github.com/microsoftgraph/msgraph-sdk-go v1.48.0 h1:JYKXW90/rjMzbD9kIzD+PzoBBbiNh4dRW6riKg+Bm94=
github.com/microsoftgraph/msgraph-sdk-go v1.48.0/go.mod h1:ghZjDbiV52URFLjZGFZckbLqMW1IgWvQKW4AqLgOm5E=
github.com/microsoftgraph/msgraph-sdk-go-core v1.2.1 h1:P1wpmn3xxfPMFJHg+PJPcusErfRkl63h6OdAnpDbkS8=
github.com/microsoftgraph/msgraph-sdk-go-core v1.2.1/go.mod h1:vFmWQGWyLlhxCESNLv61vlE4qesBU+eWmEVH7DJSESA=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=
github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=
github.com/std-uritemplate/std-uritemplate/go v0.0.57 h1:GHGjptrsmazP4IVDlUprssiEf9ESVkbjx15xQXXzvq4=
github.com/std-uritemplate/std-uritemplate/go v0.0.57/go.mod h1:rG/bqh/ThY4xE5de7Rap3vaDkYUT76B0GPJ0loYeTTc=
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo=
go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo=
go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI=
go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco=
go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI=
go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU=
golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys=
golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE=
golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4=
golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
42 changes: 42 additions & 0 deletions apis/excel/code/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package main

import (
"context"
"fmt"
"os"

"github.com/gptscript-ai/tools/apis/excel/code/pkg/commands"
)

func main() {
if len(os.Args) != 2 {
fmt.Println("Usage: gptscript-go-tool <command>")
os.Exit(1)
}

command := os.Args[1]

var err error
switch command {
case "listWorkbooks":
err = commands.ListWorkbooks(context.Background())
case "listWorksheets":
err = commands.ListWorksheets(context.Background(), os.Getenv("WORKBOOK_ID"))
case "getWorksheetData":
err = commands.GetWorksheetData(context.Background(), os.Getenv("WORKBOOK_ID"), os.Getenv("WORKSHEET_ID"))
case "addWorksheetRow":
err = commands.AddWorksheetRow(context.Background(), os.Getenv("WORKBOOK_ID"), os.Getenv("WORKSHEET_ID"), os.Getenv("CONTENTS"))
case "createWorkbook":
err = commands.CreateWorkbook(context.Background(), os.Getenv("NAME"))
case "createWorksheet":
err = commands.CreateWorksheet(context.Background(), os.Getenv("WORKBOOK_ID"), os.Getenv("NAME"))
default:
fmt.Printf("Unknown command: %s\n", command)
os.Exit(1)
}

if err != nil {
fmt.Println(err)
os.Exit(1)
}
}
26 changes: 26 additions & 0 deletions apis/excel/code/pkg/client/client.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package client

import (
"context"
"os"

"github.com/Azure/azure-sdk-for-go/sdk/azcore"
"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy"
"github.com/gptscript-ai/tools/apis/excel/code/pkg/global"
msgraphsdkgo "github.com/microsoftgraph/msgraph-sdk-go"
)

// StaticTokenCredential is taken from https://github.com/gptscript-ai/mail-assistant/blob/10944805801bbb6f71eccefd1bea5f114fded164/pkg/mstoken/auth.go
type StaticTokenCredential struct {
token string
}

func (s StaticTokenCredential) GetToken(_ context.Context, options policy.TokenRequestOptions) (azcore.AccessToken, error) {
return azcore.AccessToken{Token: s.token}, nil
}

func NewClient(scopes []string) (*msgraphsdkgo.GraphServiceClient, error) {
return msgraphsdkgo.NewGraphServiceClientWithCredentials(StaticTokenCredential{
token: os.Getenv(global.CredentialEnv),
}, scopes)
}
24 changes: 24 additions & 0 deletions apis/excel/code/pkg/commands/addWorksheetRow.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package commands

import (
"context"
"fmt"
"strings"

"github.com/gptscript-ai/tools/apis/excel/code/pkg/client"
"github.com/gptscript-ai/tools/apis/excel/code/pkg/global"
"github.com/gptscript-ai/tools/apis/excel/code/pkg/graph"
)

func AddWorksheetRow(ctx context.Context, workbookID, worksheetID, contents string) error {
c, err := client.NewClient(global.AllScopes)
if err != nil {
return err
}

if err := graph.AddWorksheetRow(ctx, c, workbookID, worksheetID, strings.Split(contents, ",")); err != nil {
return err
}
fmt.Println("Row added successfully")
return nil
}
22 changes: 22 additions & 0 deletions apis/excel/code/pkg/commands/createWorkbook.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package commands

import (
"context"
"fmt"

"github.com/gptscript-ai/tools/apis/excel/code/pkg/graph"
)

func CreateWorkbook(ctx context.Context, name string) error {
if name == "" {
return fmt.Errorf("name cannot be empty")
}

id, err := graph.CreateWorkbook(ctx, name)
if err != nil {
return err
}

fmt.Printf("Workbook created with ID: %s\n", id)
return nil
}
25 changes: 25 additions & 0 deletions apis/excel/code/pkg/commands/createWorksheet.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package commands

import (
"context"
"fmt"

"github.com/gptscript-ai/tools/apis/excel/code/pkg/client"
"github.com/gptscript-ai/tools/apis/excel/code/pkg/global"
"github.com/gptscript-ai/tools/apis/excel/code/pkg/graph"
)

func CreateWorksheet(ctx context.Context, workbookID, name string) error {
c, err := client.NewClient(global.AllScopes)
if err != nil {
return err
}

id, err := graph.CreateWorksheet(ctx, c, workbookID, name)
if err != nil {
return err
}

fmt.Printf("Worksheet created with ID: %s\n", id)
return nil
}
27 changes: 27 additions & 0 deletions apis/excel/code/pkg/commands/getWorksheetData.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package commands

import (
"context"
"encoding/json"
"fmt"

"github.com/gptscript-ai/tools/apis/excel/code/pkg/client"
"github.com/gptscript-ai/tools/apis/excel/code/pkg/global"
"github.com/gptscript-ai/tools/apis/excel/code/pkg/graph"
)

func GetWorksheetData(ctx context.Context, workbookID, worksheetID string) error {
c, err := client.NewClient(global.ReadOnlyScopes)
if err != nil {
return err
}

data, _, err := graph.GetWorksheetData(ctx, c, workbookID, worksheetID)
dataBytes, err := json.Marshal(data)
if err != nil {
return err
}

fmt.Println(string(dataBytes))
return nil
}
26 changes: 26 additions & 0 deletions apis/excel/code/pkg/commands/listWorkbooks.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package commands

import (
"context"
"fmt"

"github.com/gptscript-ai/tools/apis/excel/code/pkg/client"
"github.com/gptscript-ai/tools/apis/excel/code/pkg/global"
"github.com/gptscript-ai/tools/apis/excel/code/pkg/graph"
"github.com/gptscript-ai/tools/apis/excel/code/pkg/printers"
)

func ListWorkbooks(ctx context.Context) error {
c, err := client.NewClient(global.ReadOnlyScopes)
if err != nil {
return err
}

workbookInfos, err := graph.ListWorkbooks(ctx, c)
if err != nil {
return fmt.Errorf("failed to list spreadsheets: %w", err)
}

printers.PrintWorkbookInfos(workbookInfos)
return nil
}
25 changes: 25 additions & 0 deletions apis/excel/code/pkg/commands/listWorksheets.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package commands

import (
"context"

"github.com/gptscript-ai/tools/apis/excel/code/pkg/client"
"github.com/gptscript-ai/tools/apis/excel/code/pkg/global"
"github.com/gptscript-ai/tools/apis/excel/code/pkg/graph"
"github.com/gptscript-ai/tools/apis/excel/code/pkg/printers"
)

func ListWorksheets(ctx context.Context, workbookID string) error {
c, err := client.NewClient(global.ReadOnlyScopes)
if err != nil {
return err
}

infos, err := graph.ListWorksheetsInWorkbook(ctx, c, workbookID)
if err != nil {
return err
}

printers.PrintWorksheetInfos(infos)
return nil
}
8 changes: 8 additions & 0 deletions apis/excel/code/pkg/global/global.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package global

const CredentialEnv = "GPTSCRIPT_MICROSOFT_EXCEL_TOKEN"

var (
ReadOnlyScopes = []string{"Files.Read", "User.Read"}
AllScopes = []string{"Files.Read", "Files.ReadWrite", "User.Read"}
)
Loading