From 42bfe35457f8bfc79a0af40a9f51c8112903737e Mon Sep 17 00:00:00 2001 From: Marius Date: Tue, 11 Jun 2019 18:23:20 +0200 Subject: [PATCH] core: Move packages into pkg/ and internal/ folders --- .scripts/test_all.sh | 45 +++---------------- cmd/tusd/cli/composer.go | 14 +++--- cmd/tusd/cli/hooks.go | 14 +++--- cmd/tusd/cli/hooks/file.go | 4 +- cmd/tusd/cli/hooks/hooks.go | 6 +-- cmd/tusd/cli/hooks/http.go | 4 +- cmd/tusd/cli/hooks/plugin.go | 14 +++--- cmd/tusd/cli/log.go | 4 +- cmd/tusd/cli/metrics.go | 6 +-- cmd/tusd/cli/serve.go | 4 +- composer_test.go | 23 ---------- {uid => internal/uid}/uid.go | 0 {etcd3locker => pkg/etcd3locker}/lock.go | 4 +- {etcd3locker => pkg/etcd3locker}/locker.go | 6 +-- .../etcd3locker}/locker_options.go | 0 .../etcd3locker}/locker_test.go | 10 ++--- {filestore => pkg/filestore}/filestore.go | 22 ++++----- .../filestore}/filestore_test.go | 30 ++++++------- {gcsstore => pkg/gcsstore}/gcsservice.go | 0 {gcsstore => pkg/gcsstore}/gcsservice_test.go | 2 +- {gcsstore => pkg/gcsstore}/gcsstore.go | 18 ++++---- .../gcsstore}/gcsstore_mock_test.go | 4 +- {gcsstore => pkg/gcsstore}/gcsstore_test.go | 12 ++--- composer.go => pkg/handler/composer.go | 2 +- composer.mgo => pkg/handler/composer.mgo | 2 +- pkg/handler/composer_test.go | 23 ++++++++++ concat_test.go => pkg/handler/concat_test.go | 4 +- config.go => pkg/handler/config.go | 2 +- config_test.go => pkg/handler/config_test.go | 2 +- cors_test.go => pkg/handler/cors_test.go | 4 +- datastore.go => pkg/handler/datastore.go | 2 +- doc.go => pkg/handler/doc.go | 4 +- get_test.go => pkg/handler/get_test.go | 4 +- handler.go => pkg/handler/handler.go | 2 +- .../handler/handler_mock_test.go | 10 ++--- head_test.go => pkg/handler/head_test.go | 4 +- log.go => pkg/handler/log.go | 2 +- metrics.go => pkg/handler/metrics.go | 2 +- .../handler/options_test.go | 4 +- patch_test.go => pkg/handler/patch_test.go | 4 +- post_test.go => pkg/handler/post_test.go | 4 +- .../handler/subtest_test.go | 2 +- .../handler/terminate_test.go | 4 +- .../handler/unrouted_handler.go | 2 +- utils_test.go => pkg/handler/utils_test.go | 20 ++++----- .../memorylocker}/memorylocker.go | 8 ++-- .../memorylocker}/memorylocker_test.go | 6 +-- .../prometheuscollector.go | 8 ++-- {s3store => pkg/s3store}/calcpartsize_test.go | 0 {s3store => pkg/s3store}/multi_error.go | 0 {s3store => pkg/s3store}/s3store.go | 20 ++++----- {s3store => pkg/s3store}/s3store_mock_test.go | 2 +- {s3store => pkg/s3store}/s3store_test.go | 32 ++++++------- {s3store => pkg/s3store}/s3store_util_test.go | 0 tusd.code-workspace | 8 ---- 55 files changed, 199 insertions(+), 240 deletions(-) delete mode 100644 composer_test.go rename {uid => internal/uid}/uid.go (100%) rename {etcd3locker => pkg/etcd3locker}/lock.go (94%) rename {etcd3locker => pkg/etcd3locker}/locker.go (96%) rename {etcd3locker => pkg/etcd3locker}/locker_options.go (100%) rename {etcd3locker => pkg/etcd3locker}/locker_test.go (84%) rename {filestore => pkg/filestore}/filestore.go (89%) rename {filestore => pkg/filestore}/filestore_test.go (81%) rename {gcsstore => pkg/gcsstore}/gcsservice.go (100%) rename {gcsstore => pkg/gcsstore}/gcsservice_test.go (99%) rename {gcsstore => pkg/gcsstore}/gcsstore.go (93%) rename {gcsstore => pkg/gcsstore}/gcsstore_mock_test.go (97%) rename {gcsstore => pkg/gcsstore}/gcsstore_test.go (97%) rename composer.go => pkg/handler/composer.go (99%) rename composer.mgo => pkg/handler/composer.mgo (99%) create mode 100644 pkg/handler/composer_test.go rename concat_test.go => pkg/handler/concat_test.go (99%) rename config.go => pkg/handler/config.go (99%) rename config_test.go => pkg/handler/config_test.go (98%) rename cors_test.go => pkg/handler/cors_test.go (97%) rename datastore.go => pkg/handler/datastore.go (99%) rename doc.go => pkg/handler/doc.go (97%) rename get_test.go => pkg/handler/get_test.go (98%) rename handler.go => pkg/handler/handler.go (98%) rename handler_mock_test.go => pkg/handler/handler_mock_test.go (94%) rename head_test.go => pkg/handler/head_test.go (98%) rename log.go => pkg/handler/log.go (97%) rename metrics.go => pkg/handler/metrics.go (99%) rename options_test.go => pkg/handler/options_test.go (93%) rename patch_test.go => pkg/handler/patch_test.go (99%) rename post_test.go => pkg/handler/post_test.go (99%) rename subtest_test.go => pkg/handler/subtest_test.go (94%) rename terminate_test.go => pkg/handler/terminate_test.go (97%) rename unrouted_handler.go => pkg/handler/unrouted_handler.go (99%) rename utils_test.go => pkg/handler/utils_test.go (87%) rename {memorylocker => pkg/memorylocker}/memorylocker.go (90%) rename {memorylocker => pkg/memorylocker}/memorylocker_test.go (68%) rename {prometheuscollector => pkg/prometheuscollector}/prometheuscollector.go (94%) rename {s3store => pkg/s3store}/calcpartsize_test.go (100%) rename {s3store => pkg/s3store}/multi_error.go (100%) rename {s3store => pkg/s3store}/s3store.go (97%) rename {s3store => pkg/s3store}/s3store_mock_test.go (98%) rename {s3store => pkg/s3store}/s3store_test.go (98%) rename {s3store => pkg/s3store}/s3store_util_test.go (100%) delete mode 100644 tusd.code-workspace diff --git a/.scripts/test_all.sh b/.scripts/test_all.sh index fd065a1..d819962 100755 --- a/.scripts/test_all.sh +++ b/.scripts/test_all.sh @@ -2,27 +2,6 @@ set -e -# Find all packages containing Go source code inside the current directory -packages=$(find ./ -maxdepth 2 -name '*.go' -printf '%h\n' | sort | uniq) - -# Some packages only support Go1.10+ and therefore we will only run the -# corresponding tests on these versions. -goversion=$(go version) -if [[ "$goversion" == *"go1.5"* ]] || - [[ "$goversion" == *"go1.6"* ]] || - [[ "$goversion" == *"go1.7"* ]] || - [[ "$goversion" == *"go1.8"* ]] || - [[ "$goversion" == *"go1.9"* ]]; then - - echo "Skipping tests requiring GCSStore, which is not supported on $goversion" - packages=$(echo "$packages" | sed '/gcsstore/d') - - echo "Skipping tests requiring Prometheus, which is not supported on $goversion" - packages=$(echo "$packages" | sed '/prometheuscollector/d') -else - go get -u github.com/prometheus/client_golang/prometheus -fi - install_etcd_pkgs() { ETCD_VERSION="3.3.10" go get -u go.etcd.io/etcd/clientv3 @@ -32,26 +11,14 @@ install_etcd_pkgs() { export PATH="$PATH:/tmp/etcd-v$ETCD_VERSION-linux-amd64" } -# The etcd 3.3.x package only supports Go1.11+ and therefore -# we will only run the corresponding tests on these versions. -if [[ "$goversion" == *"go1.5"* ]] || - [[ "$goversion" == *"go1.6"* ]] || - [[ "$goversion" == *"go1.7"* ]] || - [[ "$goversion" == *"go1.8"* ]] || - [[ "$goversion" == *"go1.9"* ]] || - [[ "$goversion" == *"go1.10"* ]]; then - echo "Skipping tests requiring etcd3locker, which is not supported on $goversion" - packages=$(echo "$packages" | sed '/etcd3locker/d') -else - # Install the etcd packages which are not vendored. - install_etcd_pkgs -fi - # Install the AWS SDK which is explicitly not vendored go get -u github.com/aws/aws-sdk-go/service/s3 go get -u github.com/aws/aws-sdk-go/aws/... -# Test all packages which are allowed on all Go versions -go test $packages +go get -u github.com/prometheus/client_golang/prometheus -go vet $packages +# Install the etcd packages which are not vendored. +install_etcd_pkgs + +go test ./pkg/... +go vet ./pkg/... diff --git a/cmd/tusd/cli/composer.go b/cmd/tusd/cli/composer.go index 2927068..b774851 100644 --- a/cmd/tusd/cli/composer.go +++ b/cmd/tusd/cli/composer.go @@ -3,23 +3,23 @@ package cli import ( "os" - "github.com/tus/tusd" - "github.com/tus/tusd/filestore" - "github.com/tus/tusd/gcsstore" - "github.com/tus/tusd/memorylocker" - "github.com/tus/tusd/s3store" + "github.com/tus/tusd/pkg/filestore" + "github.com/tus/tusd/pkg/gcsstore" + "github.com/tus/tusd/pkg/handler" + "github.com/tus/tusd/pkg/memorylocker" + "github.com/tus/tusd/pkg/s3store" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/s3" ) -var Composer *tusd.StoreComposer +var Composer *handler.StoreComposer func CreateComposer() { // Attempt to use S3 as a backend if the -s3-bucket option has been supplied. // If not, we default to storing them locally on disk. - Composer = tusd.NewStoreComposer() + Composer = handler.NewStoreComposer() if Flags.S3Bucket != "" { s3Config := aws.NewConfig() diff --git a/cmd/tusd/cli/hooks.go b/cmd/tusd/cli/hooks.go index aadbd79..a96c107 100644 --- a/cmd/tusd/cli/hooks.go +++ b/cmd/tusd/cli/hooks.go @@ -4,17 +4,17 @@ import ( "fmt" "strconv" - "github.com/tus/tusd" "github.com/tus/tusd/cmd/tusd/cli/hooks" + "github.com/tus/tusd/pkg/handler" ) var hookHandler hooks.HookHandler = nil type hookDataStore struct { - tusd.DataStore + handler.DataStore } -func (store hookDataStore) NewUpload(info tusd.FileInfo) (id string, err error) { +func (store hookDataStore) NewUpload(info handler.FileInfo) (id string, err error) { if output, err := invokeHookSync(hooks.HookPreCreate, info, true); err != nil { if hookErr, ok := err.(hooks.HookError); ok { return "", hooks.NewHookError( @@ -36,7 +36,7 @@ func SetupHookMetrics() { MetricsHookErrorsTotal.WithLabelValues(string(hooks.HookPreCreate)).Add(0) } -func SetupPreHooks(composer *tusd.StoreComposer) error { +func SetupPreHooks(composer *handler.StoreComposer) error { if Flags.FileHooksDir != "" { hookHandler = &hooks.FileHook{ Directory: Flags.FileHooksDir, @@ -66,7 +66,7 @@ func SetupPreHooks(composer *tusd.StoreComposer) error { return nil } -func SetupPostHooks(handler *tusd.Handler) { +func SetupPostHooks(handler *handler.Handler) { go func() { for { select { @@ -83,14 +83,14 @@ func SetupPostHooks(handler *tusd.Handler) { }() } -func invokeHookAsync(typ hooks.HookType, info tusd.FileInfo) { +func invokeHookAsync(typ hooks.HookType, info handler.FileInfo) { go func() { // Error handling is taken care by the function. _, _ = invokeHookSync(typ, info, false) }() } -func invokeHookSync(typ hooks.HookType, info tusd.FileInfo, captureOutput bool) ([]byte, error) { +func invokeHookSync(typ hooks.HookType, info handler.FileInfo, captureOutput bool) ([]byte, error) { switch typ { case hooks.HookPostFinish: logEv(stdout, "UploadFinished", "id", info.ID, "size", strconv.FormatInt(info.Size, 10)) diff --git a/cmd/tusd/cli/hooks/file.go b/cmd/tusd/cli/hooks/file.go index 154279d..986c184 100644 --- a/cmd/tusd/cli/hooks/file.go +++ b/cmd/tusd/cli/hooks/file.go @@ -7,7 +7,7 @@ import ( "os/exec" "strconv" - "github.com/tus/tusd" + "github.com/tus/tusd/pkg/handler" ) type FileHook struct { @@ -18,7 +18,7 @@ func (_ FileHook) Setup() error { return nil } -func (h FileHook) InvokeHook(typ HookType, info tusd.FileInfo, captureOutput bool) ([]byte, int, error) { +func (h FileHook) InvokeHook(typ HookType, info handler.FileInfo, captureOutput bool) ([]byte, int, error) { hookPath := h.Directory + string(os.PathSeparator) + string(typ) cmd := exec.Command(hookPath) env := os.Environ() diff --git a/cmd/tusd/cli/hooks/hooks.go b/cmd/tusd/cli/hooks/hooks.go index 81a7ed4..0eb1f94 100644 --- a/cmd/tusd/cli/hooks/hooks.go +++ b/cmd/tusd/cli/hooks/hooks.go @@ -1,12 +1,12 @@ package hooks import ( - "github.com/tus/tusd" + "github.com/tus/tusd/pkg/handler" ) type HookHandler interface { Setup() error - InvokeHook(typ HookType, info tusd.FileInfo, captureOutput bool) ([]byte, int, error) + InvokeHook(typ HookType, info handler.FileInfo, captureOutput bool) ([]byte, int, error) } type HookType string @@ -20,7 +20,7 @@ const ( ) type hookDataStore struct { - tusd.DataStore + handler.DataStore } type HookError struct { diff --git a/cmd/tusd/cli/hooks/http.go b/cmd/tusd/cli/hooks/http.go index 24a3c3a..387f091 100644 --- a/cmd/tusd/cli/hooks/http.go +++ b/cmd/tusd/cli/hooks/http.go @@ -8,7 +8,7 @@ import ( "net/http" "time" - "github.com/tus/tusd" + "github.com/tus/tusd/pkg/handler" "github.com/sethgrid/pester" ) @@ -23,7 +23,7 @@ func (_ HttpHook) Setup() error { return nil } -func (h HttpHook) InvokeHook(typ HookType, info tusd.FileInfo, captureOutput bool) ([]byte, int, error) { +func (h HttpHook) InvokeHook(typ HookType, info handler.FileInfo, captureOutput bool) ([]byte, int, error) { jsonInfo, err := json.Marshal(info) if err != nil { return nil, 0, err diff --git a/cmd/tusd/cli/hooks/plugin.go b/cmd/tusd/cli/hooks/plugin.go index cc1d53a..f19ffed 100644 --- a/cmd/tusd/cli/hooks/plugin.go +++ b/cmd/tusd/cli/hooks/plugin.go @@ -4,15 +4,15 @@ import ( "fmt" "plugin" - "github.com/tus/tusd" + "github.com/tus/tusd/pkg/handler" ) type PluginHookHandler interface { - PreCreate(info tusd.FileInfo) error - PostCreate(info tusd.FileInfo) error - PostReceive(info tusd.FileInfo) error - PostFinish(info tusd.FileInfo) error - PostTerminate(info tusd.FileInfo) error + PreCreate(info handler.FileInfo) error + PostCreate(info handler.FileInfo) error + PostReceive(info handler.FileInfo) error + PostFinish(info handler.FileInfo) error + PostTerminate(info handler.FileInfo) error } type PluginHook struct { @@ -41,7 +41,7 @@ func (h *PluginHook) Setup() error { return nil } -func (h PluginHook) InvokeHook(typ HookType, info tusd.FileInfo, captureOutput bool) ([]byte, int, error) { +func (h PluginHook) InvokeHook(typ HookType, info handler.FileInfo, captureOutput bool) ([]byte, int, error) { var err error switch typ { case HookPostFinish: diff --git a/cmd/tusd/cli/log.go b/cmd/tusd/cli/log.go index 4bb7ba3..5475688 100644 --- a/cmd/tusd/cli/log.go +++ b/cmd/tusd/cli/log.go @@ -4,12 +4,12 @@ import ( "log" "os" - "github.com/tus/tusd" + "github.com/tus/tusd/pkg/handler" ) var stdout = log.New(os.Stdout, "[tusd] ", log.Ldate|log.Ltime) var stderr = log.New(os.Stderr, "[tusd] ", log.Ldate|log.Ltime) func logEv(logOutput *log.Logger, eventName string, details ...string) { - tusd.LogEvent(logOutput, eventName, details...) + handler.LogEvent(logOutput, eventName, details...) } diff --git a/cmd/tusd/cli/metrics.go b/cmd/tusd/cli/metrics.go index 6836c19..d632897 100644 --- a/cmd/tusd/cli/metrics.go +++ b/cmd/tusd/cli/metrics.go @@ -3,8 +3,8 @@ package cli import ( "net/http" - "github.com/tus/tusd" - "github.com/tus/tusd/prometheuscollector" + "github.com/tus/tusd/pkg/handler" + "github.com/tus/tusd/pkg/prometheuscollector" "github.com/prometheus/client_golang/prometheus" ) @@ -22,7 +22,7 @@ var MetricsHookErrorsTotal = prometheus.NewCounterVec( []string{"hooktype"}, ) -func SetupMetrics(handler *tusd.Handler) { +func SetupMetrics(handler *handler.Handler) { prometheus.MustRegister(MetricsOpenConnections) prometheus.MustRegister(MetricsHookErrorsTotal) prometheus.MustRegister(prometheuscollector.New(handler.Metrics)) diff --git a/cmd/tusd/cli/serve.go b/cmd/tusd/cli/serve.go index b96e0d8..c4525ef 100644 --- a/cmd/tusd/cli/serve.go +++ b/cmd/tusd/cli/serve.go @@ -5,7 +5,7 @@ import ( "net/http" "time" - "github.com/tus/tusd" + "github.com/tus/tusd/pkg/handler" ) // Setups the different components, starts a Listener and give it to @@ -19,7 +19,7 @@ func Serve() { stderr.Fatalf("Unable to setup hooks for handler: %s", err) } - handler, err := tusd.NewHandler(tusd.Config{ + handler, err := handler.NewHandler(handler.Config{ MaxSize: Flags.MaxSize, BasePath: Flags.Basepath, RespectForwardedHeaders: Flags.BehindProxy, diff --git a/composer_test.go b/composer_test.go deleted file mode 100644 index 19178aa..0000000 --- a/composer_test.go +++ /dev/null @@ -1,23 +0,0 @@ -package tusd_test - -import ( - "github.com/tus/tusd" - "github.com/tus/tusd/filestore" - "github.com/tus/tusd/memorylocker" -) - -func ExampleNewStoreComposer() { - composer := tusd.NewStoreComposer() - - fs := filestore.New("./data") - fs.UseIn(composer) - - ml := memorylocker.New() - ml.UseIn(composer) - - config := tusd.Config{ - StoreComposer: composer, - } - - _, _ = tusd.NewHandler(config) -} diff --git a/uid/uid.go b/internal/uid/uid.go similarity index 100% rename from uid/uid.go rename to internal/uid/uid.go diff --git a/etcd3locker/lock.go b/pkg/etcd3locker/lock.go similarity index 94% rename from etcd3locker/lock.go rename to pkg/etcd3locker/lock.go index e1babbe..e6dbf8a 100644 --- a/etcd3locker/lock.go +++ b/pkg/etcd3locker/lock.go @@ -6,7 +6,7 @@ import ( "context" "time" - "github.com/tus/tusd" + "github.com/tus/tusd/pkg/handler" "go.etcd.io/etcd/clientv3/concurrency" ) @@ -32,7 +32,7 @@ func (lock *etcd3Lock) Acquire() error { // the lock is most likely already taken if err := lock.Mutex.Lock(ctx); err != nil { if err == context.DeadlineExceeded { - return tusd.ErrFileLocked + return handler.ErrFileLocked } else { return err } diff --git a/etcd3locker/locker.go b/pkg/etcd3locker/locker.go similarity index 96% rename from etcd3locker/locker.go rename to pkg/etcd3locker/locker.go index 87a9e0d..f042f0a 100644 --- a/etcd3locker/locker.go +++ b/pkg/etcd3locker/locker.go @@ -17,7 +17,7 @@ // // The locker will need to be included in composer that is used by tusd: // -// composer := tusd.NewStoreComposer() +// composer := handler.NewStoreComposer() // locker.UseIn(composer) // // For a shared etcd3 cluster, you may want to modify the prefix that etcd3locker uses: @@ -47,7 +47,7 @@ import ( "sync" "time" - "github.com/tus/tusd" + "github.com/tus/tusd/pkg/handler" etcd3 "go.etcd.io/etcd/clientv3" "go.etcd.io/etcd/clientv3/concurrency" ) @@ -89,7 +89,7 @@ func NewWithLockerOptions(client *etcd3.Client, opts LockerOptions) (*Etcd3Locke } // UseIn adds this locker to the passed composer. -func (locker *Etcd3Locker) UseIn(composer *tusd.StoreComposer) { +func (locker *Etcd3Locker) UseIn(composer *handler.StoreComposer) { composer.UseLocker(locker) } diff --git a/etcd3locker/locker_options.go b/pkg/etcd3locker/locker_options.go similarity index 100% rename from etcd3locker/locker_options.go rename to pkg/etcd3locker/locker_options.go diff --git a/etcd3locker/locker_test.go b/pkg/etcd3locker/locker_test.go similarity index 84% rename from etcd3locker/locker_test.go rename to pkg/etcd3locker/locker_test.go index 912554b..8c56f70 100644 --- a/etcd3locker/locker_test.go +++ b/pkg/etcd3locker/locker_test.go @@ -8,7 +8,7 @@ import ( "time" "github.com/stretchr/testify/assert" - "github.com/tus/tusd" + "github.com/tus/tusd/pkg/handler" ) func TestEtcd3Locker(t *testing.T) { @@ -40,11 +40,11 @@ func TestEtcd3Locker(t *testing.T) { locker, err := NewWithLockerOptions(client, lockerOptions) a.NoError(err) a.NoError(locker.LockUpload("one")) - a.Equal(tusd.ErrFileLocked, locker.LockUpload("one")) + a.Equal(handler.ErrFileLocked, locker.LockUpload("one")) time.Sleep(5 * time.Second) // test that we can't take over the upload via a different etcd3 session // while an upload is already taking place; testing etcd3 session KeepAlive - a.Equal(tusd.ErrFileLocked, locker.LockUpload("one")) + a.Equal(handler.ErrFileLocked, locker.LockUpload("one")) a.NoError(locker.UnlockUpload("one")) a.Equal(ErrLockNotHeld, locker.UnlockUpload("one")) @@ -52,8 +52,8 @@ func TestEtcd3Locker(t *testing.T) { locker2, err := NewWithPrefix(client, testPrefix) a.NoError(err) a.NoError(locker2.LockUpload("one")) - a.Equal(tusd.ErrFileLocked, locker2.LockUpload("one")) - a.Equal(tusd.ErrFileLocked, locker2.LockUpload("one")) + a.Equal(handler.ErrFileLocked, locker2.LockUpload("one")) + a.Equal(handler.ErrFileLocked, locker2.LockUpload("one")) a.NoError(locker2.UnlockUpload("one")) a.Equal(ErrLockNotHeld, locker2.UnlockUpload("one")) } diff --git a/filestore/filestore.go b/pkg/filestore/filestore.go similarity index 89% rename from filestore/filestore.go rename to pkg/filestore/filestore.go index bef3ec1..4b0657b 100644 --- a/filestore/filestore.go +++ b/pkg/filestore/filestore.go @@ -1,6 +1,6 @@ // Package filestore provide a storage backend based on the local file system. // -// FileStore is a storage backend used as a tusd.DataStore in tusd.NewHandler. +// FileStore is a storage backend used as a handler.DataStore in handler.NewHandler. // It stores the uploads in a directory specified in two different files: The // `[id].info` files are used to store the fileinfo in JSON format. The // `[id].bin` files contain the raw binary data uploaded. @@ -11,7 +11,7 @@ // which are stored on disk. Each of them stores the PID of the process which // acquired the lock. This allows locks to be automatically freed when a process // is unable to release it on its own because the process is not alive anymore. -// For more information, consult the documentation for tusd.LockerDataStore +// For more information, consult the documentation for handler.LockerDataStore // interface, which is implemented by FileStore package filestore @@ -23,15 +23,15 @@ import ( "os" "path/filepath" - "github.com/tus/tusd" - "github.com/tus/tusd/uid" + "github.com/tus/tusd/internal/uid" + "github.com/tus/tusd/pkg/handler" "gopkg.in/Acconut/lockfile.v1" ) var defaultFilePerm = os.FileMode(0664) -// See the tusd.DataStore interface for documentation about the different +// See the handler.DataStore interface for documentation about the different // methods. type FileStore struct { // Relative or absolute path to store files in. FileStore does not check @@ -49,7 +49,7 @@ func New(path string) FileStore { // UseIn sets this store as the core data store in the passed composer and adds // all possible extension to it. -func (store FileStore) UseIn(composer *tusd.StoreComposer) { +func (store FileStore) UseIn(composer *handler.StoreComposer) { composer.UseCore(store) composer.UseGetReader(store) composer.UseTerminater(store) @@ -58,7 +58,7 @@ func (store FileStore) UseIn(composer *tusd.StoreComposer) { composer.UseLengthDeferrer(store) } -func (store FileStore) NewUpload(info tusd.FileInfo) (id string, err error) { +func (store FileStore) NewUpload(info handler.FileInfo) (id string, err error) { id = uid.Uid() info.ID = id @@ -97,8 +97,8 @@ func (store FileStore) WriteChunk(id string, offset int64, src io.Reader) (int64 return n, err } -func (store FileStore) GetInfo(id string) (tusd.FileInfo, error) { - info := tusd.FileInfo{} +func (store FileStore) GetInfo(id string) (handler.FileInfo, error) { + info := handler.FileInfo{} data, err := ioutil.ReadFile(store.infoPath(id)) if err != nil { return info, err @@ -170,7 +170,7 @@ func (store FileStore) LockUpload(id string) error { err = lock.TryLock() if err == lockfile.ErrBusy { - return tusd.ErrFileLocked + return handler.ErrFileLocked } return err @@ -218,7 +218,7 @@ func (store FileStore) infoPath(id string) string { } // writeInfo updates the entire information. Everything will be overwritten. -func (store FileStore) writeInfo(id string, info tusd.FileInfo) error { +func (store FileStore) writeInfo(id string, info handler.FileInfo) error { data, err := json.Marshal(info) if err != nil { return err diff --git a/filestore/filestore_test.go b/pkg/filestore/filestore_test.go similarity index 81% rename from filestore/filestore_test.go rename to pkg/filestore/filestore_test.go index 5f4c27d..99a6dec 100644 --- a/filestore/filestore_test.go +++ b/pkg/filestore/filestore_test.go @@ -9,16 +9,16 @@ import ( "github.com/stretchr/testify/assert" - "github.com/tus/tusd" + "github.com/tus/tusd/pkg/handler" ) // Test interface implementation of Filestore -var _ tusd.DataStore = FileStore{} -var _ tusd.GetReaderDataStore = FileStore{} -var _ tusd.TerminaterDataStore = FileStore{} -var _ tusd.LockerDataStore = FileStore{} -var _ tusd.ConcaterDataStore = FileStore{} -var _ tusd.LengthDeferrerDataStore = FileStore{} +var _ handler.DataStore = FileStore{} +var _ handler.GetReaderDataStore = FileStore{} +var _ handler.TerminaterDataStore = FileStore{} +var _ handler.LockerDataStore = FileStore{} +var _ handler.ConcaterDataStore = FileStore{} +var _ handler.LengthDeferrerDataStore = FileStore{} func TestFilestore(t *testing.T) { a := assert.New(t) @@ -29,7 +29,7 @@ func TestFilestore(t *testing.T) { store := FileStore{tmp} // Create new upload - id, err := store.NewUpload(tusd.FileInfo{ + id, err := store.NewUpload(handler.FileInfo{ Size: 42, MetaData: map[string]string{ "hello": "world", @@ -43,7 +43,7 @@ func TestFilestore(t *testing.T) { a.NoError(err) a.EqualValues(42, info.Size) a.EqualValues(0, info.Offset) - a.Equal(tusd.MetaData{"hello": "world"}, info.MetaData) + a.Equal(handler.MetaData{"hello": "world"}, info.MetaData) // Write data to upload bytesWritten, err := store.WriteChunk(id, 0, strings.NewReader("hello world")) @@ -78,7 +78,7 @@ func TestMissingPath(t *testing.T) { store := FileStore{"./path-that-does-not-exist"} - id, err := store.NewUpload(tusd.FileInfo{}) + id, err := store.NewUpload(handler.FileInfo{}) a.Error(err) a.Equal(err.Error(), "upload directory does not exist: ./path-that-does-not-exist") a.Equal(id, "") @@ -90,11 +90,11 @@ func TestFileLocker(t *testing.T) { dir, err := ioutil.TempDir("", "tusd-file-locker") a.NoError(err) - var locker tusd.LockerDataStore + var locker handler.LockerDataStore locker = FileStore{dir} a.NoError(locker.LockUpload("one")) - a.Equal(tusd.ErrFileLocked, locker.LockUpload("one")) + a.Equal(handler.ErrFileLocked, locker.LockUpload("one")) a.NoError(locker.UnlockUpload("one")) } @@ -107,7 +107,7 @@ func TestConcatUploads(t *testing.T) { store := FileStore{tmp} // Create new upload to hold concatenated upload - finId, err := store.NewUpload(tusd.FileInfo{Size: 9}) + finId, err := store.NewUpload(handler.FileInfo{Size: 9}) a.NoError(err) a.NotEqual("", finId) @@ -119,7 +119,7 @@ func TestConcatUploads(t *testing.T) { "ghi", } for i := 0; i < 3; i++ { - id, err := store.NewUpload(tusd.FileInfo{Size: 3}) + id, err := store.NewUpload(handler.FileInfo{Size: 3}) a.NoError(err) n, err := store.WriteChunk(id, 0, strings.NewReader(contents[i])) @@ -156,7 +156,7 @@ func TestDeclareLength(t *testing.T) { store := FileStore{tmp} - originalInfo := tusd.FileInfo{Size: 0, SizeIsDeferred: true} + originalInfo := handler.FileInfo{Size: 0, SizeIsDeferred: true} id, err := store.NewUpload(originalInfo) a.NoError(err) diff --git a/gcsstore/gcsservice.go b/pkg/gcsstore/gcsservice.go similarity index 100% rename from gcsstore/gcsservice.go rename to pkg/gcsstore/gcsservice.go diff --git a/gcsstore/gcsservice_test.go b/pkg/gcsstore/gcsservice_test.go similarity index 99% rename from gcsstore/gcsservice_test.go rename to pkg/gcsstore/gcsservice_test.go index 23953f8..eeffe15 100644 --- a/gcsstore/gcsservice_test.go +++ b/pkg/gcsstore/gcsservice_test.go @@ -8,7 +8,7 @@ import ( "gopkg.in/h2non/gock.v1" "cloud.google.com/go/storage" - . "github.com/tus/tusd/gcsstore" + . "github.com/tus/tusd/pkg/gcsstore" "google.golang.org/api/option" ) diff --git a/gcsstore/gcsstore.go b/pkg/gcsstore/gcsstore.go similarity index 93% rename from gcsstore/gcsstore.go rename to pkg/gcsstore/gcsstore.go index 78bf32e..eb5e5ac 100644 --- a/gcsstore/gcsstore.go +++ b/pkg/gcsstore/gcsstore.go @@ -22,11 +22,11 @@ import ( "sync/atomic" "cloud.google.com/go/storage" - "github.com/tus/tusd" - "github.com/tus/tusd/uid" + "github.com/tus/tusd/internal/uid" + "github.com/tus/tusd/pkg/handler" ) -// See the tusd.DataStore interface for documentation about the different +// See the handler.DataStore interface for documentation about the different // methods. type GCSStore struct { // Specifies the GCS bucket that uploads will be stored in @@ -51,14 +51,14 @@ func New(bucket string, service GCSAPI) GCSStore { } } -func (store GCSStore) UseIn(composer *tusd.StoreComposer) { +func (store GCSStore) UseIn(composer *handler.StoreComposer) { composer.UseCore(store) composer.UseTerminater(store) composer.UseFinisher(store) composer.UseGetReader(store) } -func (store GCSStore) NewUpload(info tusd.FileInfo) (id string, err error) { +func (store GCSStore) NewUpload(info handler.FileInfo) (id string, err error) { if info.ID == "" { info.ID = uid.Uid() } @@ -115,8 +115,8 @@ func (store GCSStore) WriteChunk(id string, offset int64, src io.Reader) (int64, const CONCURRENT_SIZE_REQUESTS = 32 -func (store GCSStore) GetInfo(id string) (tusd.FileInfo, error) { - info := tusd.FileInfo{} +func (store GCSStore) GetInfo(id string) (handler.FileInfo, error) { + info := handler.FileInfo{} i := fmt.Sprintf("%s.info", store.keyWithPrefix(id)) params := GCSObjectParams{ @@ -128,7 +128,7 @@ func (store GCSStore) GetInfo(id string) (tusd.FileInfo, error) { r, err := store.Service.ReadObject(ctx, params) if err != nil { if err == storage.ErrObjectNotExist { - return info, tusd.ErrNotFound + return info, handler.ErrNotFound } return info, err } @@ -213,7 +213,7 @@ func (store GCSStore) GetInfo(id string) (tusd.FileInfo, error) { return info, nil } -func (store GCSStore) writeInfo(ctx context.Context, id string, info tusd.FileInfo) error { +func (store GCSStore) writeInfo(ctx context.Context, id string, info handler.FileInfo) error { data, err := json.Marshal(info) if err != nil { return err diff --git a/gcsstore/gcsstore_mock_test.go b/pkg/gcsstore/gcsstore_mock_test.go similarity index 97% rename from gcsstore/gcsstore_mock_test.go rename to pkg/gcsstore/gcsstore_mock_test.go index 10da5b5..124d86e 100644 --- a/gcsstore/gcsstore_mock_test.go +++ b/pkg/gcsstore/gcsstore_mock_test.go @@ -1,12 +1,12 @@ // Automatically generated by MockGen. DO NOT EDIT! -// Source: github.com/tus/tusd/gcsstore (interfaces: GCSReader,GCSAPI) +// Source: github.com/tus/tusd/pkg/gcsstore (interfaces: GCSReader,GCSAPI) package gcsstore_test import ( context "context" gomock "github.com/golang/mock/gomock" - gcsstore "github.com/tus/tusd/gcsstore" + gcsstore "github.com/tus/tusd/pkg/gcsstore" io "io" ) diff --git a/gcsstore/gcsstore_test.go b/pkg/gcsstore/gcsstore_test.go similarity index 97% rename from gcsstore/gcsstore_test.go rename to pkg/gcsstore/gcsstore_test.go index 851f233..9be72e5 100644 --- a/gcsstore/gcsstore_test.go +++ b/pkg/gcsstore/gcsstore_test.go @@ -11,11 +11,11 @@ import ( "github.com/golang/mock/gomock" "github.com/stretchr/testify/assert" - "github.com/tus/tusd" - "github.com/tus/tusd/gcsstore" + "github.com/tus/tusd/pkg/gcsstore" + "github.com/tus/tusd/pkg/handler" ) -// go:generate mockgen -destination=./gcsstore_mock_test.go -package=gcsstore_test github.com/tus/tusd/gcsstore GCSReader,GCSAPI +// go:generate mockgen -destination=./gcsstore_mock_test.go -package=gcsstore_test github.com/tus/tusd/pkg/gcsstore GCSReader,GCSAPI const mockID = "123456789abcdefghijklmnopqrstuvwxyz" const mockBucket = "bucket" @@ -23,7 +23,7 @@ const mockSize = 1337 const mockReaderData = "helloworld" var mockTusdInfoJson = fmt.Sprintf(`{"ID":"%s","Size":%d,"MetaData":{"foo":"bar"}}`, mockID, mockSize) -var mockTusdInfo = tusd.FileInfo{ +var mockTusdInfo = handler.FileInfo{ ID: mockID, Size: mockSize, MetaData: map[string]string{ @@ -201,7 +201,7 @@ func TestGetInfoNotFound(t *testing.T) { ) _, err := store.GetInfo(mockID) - assert.Equal(tusd.ErrNotFound, err) + assert.Equal(handler.ErrNotFound, err) } type MockGetReader struct{} @@ -368,7 +368,7 @@ func TestFinishUpload(t *testing.T) { } var mockTusdChunk0InfoJson = fmt.Sprintf(`{"ID":"%s","Size":%d,"Offset":%d,"MetaData":{"foo":"bar"}}`, mockID, mockSize, mockSize/3) -var mockTusdChunk1Info = tusd.FileInfo{ +var mockTusdChunk1Info = handler.FileInfo{ ID: mockID, Size: mockSize, Offset: 455, diff --git a/composer.go b/pkg/handler/composer.go similarity index 99% rename from composer.go rename to pkg/handler/composer.go index 9ec8aa2..ff27086 100644 --- a/composer.go +++ b/pkg/handler/composer.go @@ -1,4 +1,4 @@ -package tusd +package handler // StoreComposer represents a composable data store. It consists of the core // data store and optional extensions. Please consult the package's overview diff --git a/composer.mgo b/pkg/handler/composer.mgo similarity index 99% rename from composer.mgo rename to pkg/handler/composer.mgo index 247cdb8..21fcac6 100644 --- a/composer.mgo +++ b/pkg/handler/composer.mgo @@ -1,4 +1,4 @@ -package tusd +package handler #define USE_FUNC(TYPE) \ func (store *StoreComposer) Use ## TYPE(ext TYPE ## DataStore) { \ diff --git a/pkg/handler/composer_test.go b/pkg/handler/composer_test.go new file mode 100644 index 0000000..dd31059 --- /dev/null +++ b/pkg/handler/composer_test.go @@ -0,0 +1,23 @@ +package handler_test + +import ( + "github.com/tus/tusd/pkg/filestore" + "github.com/tus/tusd/pkg/handler" + "github.com/tus/tusd/pkg/memorylocker" +) + +func ExampleNewStoreComposer() { + composer := handler.NewStoreComposer() + + fs := filestore.New("./data") + fs.UseIn(composer) + + ml := memorylocker.New() + ml.UseIn(composer) + + config := handler.Config{ + StoreComposer: composer, + } + + _, _ = handler.NewHandler(config) +} diff --git a/concat_test.go b/pkg/handler/concat_test.go similarity index 99% rename from concat_test.go rename to pkg/handler/concat_test.go index e223c42..d6745d6 100644 --- a/concat_test.go +++ b/pkg/handler/concat_test.go @@ -1,4 +1,4 @@ -package tusd_test +package handler_test import ( "net/http" @@ -8,7 +8,7 @@ import ( "github.com/golang/mock/gomock" "github.com/stretchr/testify/assert" - . "github.com/tus/tusd" + . "github.com/tus/tusd/pkg/handler" ) func TestConcat(t *testing.T) { diff --git a/config.go b/pkg/handler/config.go similarity index 99% rename from config.go rename to pkg/handler/config.go index 5a7326a..d427809 100644 --- a/config.go +++ b/pkg/handler/config.go @@ -1,4 +1,4 @@ -package tusd +package handler import ( "errors" diff --git a/config_test.go b/pkg/handler/config_test.go similarity index 98% rename from config_test.go rename to pkg/handler/config_test.go index 00736a6..c23a8b8 100644 --- a/config_test.go +++ b/pkg/handler/config_test.go @@ -1,4 +1,4 @@ -package tusd +package handler import ( "io" diff --git a/cors_test.go b/pkg/handler/cors_test.go similarity index 97% rename from cors_test.go rename to pkg/handler/cors_test.go index 2bb636f..913c1e4 100644 --- a/cors_test.go +++ b/pkg/handler/cors_test.go @@ -1,11 +1,11 @@ -package tusd_test +package handler_test import ( "net/http" "net/http/httptest" "testing" - . "github.com/tus/tusd" + . "github.com/tus/tusd/pkg/handler" ) func TestCORS(t *testing.T) { diff --git a/datastore.go b/pkg/handler/datastore.go similarity index 99% rename from datastore.go rename to pkg/handler/datastore.go index 079c367..14a2706 100644 --- a/datastore.go +++ b/pkg/handler/datastore.go @@ -1,4 +1,4 @@ -package tusd +package handler import ( "context" diff --git a/doc.go b/pkg/handler/doc.go similarity index 97% rename from doc.go rename to pkg/handler/doc.go index 9061237..7d1258b 100644 --- a/doc.go +++ b/pkg/handler/doc.go @@ -1,5 +1,5 @@ /* -Package tusd provides ways to accept tus 1.0 calls using HTTP. +Package handler provides ways to accept tus 1.0 calls using HTTP. tus is a protocol based on HTTP for resumable file uploads. Resumable means that an upload can be interrupted at any moment and can be resumed without @@ -66,4 +66,4 @@ This handler can then be mounted to a specific path, e.g. /files: http.Handle("/files/", http.StripPrefix("/files/", handler)) */ -package tusd +package handler diff --git a/get_test.go b/pkg/handler/get_test.go similarity index 98% rename from get_test.go rename to pkg/handler/get_test.go index ef7f208..dd8926c 100644 --- a/get_test.go +++ b/pkg/handler/get_test.go @@ -1,4 +1,4 @@ -package tusd_test +package handler_test import ( "net/http" @@ -6,7 +6,7 @@ import ( "testing" "github.com/golang/mock/gomock" - . "github.com/tus/tusd" + . "github.com/tus/tusd/pkg/handler" ) type closingStringReader struct { diff --git a/handler.go b/pkg/handler/handler.go similarity index 98% rename from handler.go rename to pkg/handler/handler.go index d8460b6..ad0aab2 100644 --- a/handler.go +++ b/pkg/handler/handler.go @@ -1,4 +1,4 @@ -package tusd +package handler import ( "net/http" diff --git a/handler_mock_test.go b/pkg/handler/handler_mock_test.go similarity index 94% rename from handler_mock_test.go rename to pkg/handler/handler_mock_test.go index 53c256a..c4edccf 100644 --- a/handler_mock_test.go +++ b/pkg/handler/handler_mock_test.go @@ -1,11 +1,11 @@ // Automatically generated by MockGen. DO NOT EDIT! // Source: utils_test.go -package tusd_test +package handler_test import ( gomock "github.com/golang/mock/gomock" - tusd "github.com/tus/tusd" + handler "github.com/tus/tusd/pkg/handler" io "io" ) @@ -30,7 +30,7 @@ func (_m *MockFullDataStore) EXPECT() *_MockFullDataStoreRecorder { return _m.recorder } -func (_m *MockFullDataStore) NewUpload(info tusd.FileInfo) (string, error) { +func (_m *MockFullDataStore) NewUpload(info handler.FileInfo) (string, error) { ret := _m.ctrl.Call(_m, "NewUpload", info) ret0, _ := ret[0].(string) ret1, _ := ret[1].(error) @@ -52,9 +52,9 @@ func (_mr *_MockFullDataStoreRecorder) WriteChunk(arg0, arg1, arg2 interface{}) return _mr.mock.ctrl.RecordCall(_mr.mock, "WriteChunk", arg0, arg1, arg2) } -func (_m *MockFullDataStore) GetInfo(id string) (tusd.FileInfo, error) { +func (_m *MockFullDataStore) GetInfo(id string) (handler.FileInfo, error) { ret := _m.ctrl.Call(_m, "GetInfo", id) - ret0, _ := ret[0].(tusd.FileInfo) + ret0, _ := ret[0].(handler.FileInfo) ret1, _ := ret[1].(error) return ret0, ret1 } diff --git a/head_test.go b/pkg/handler/head_test.go similarity index 98% rename from head_test.go rename to pkg/handler/head_test.go index ff58b53..8c19348 100644 --- a/head_test.go +++ b/pkg/handler/head_test.go @@ -1,4 +1,4 @@ -package tusd_test +package handler_test import ( "net/http" @@ -6,7 +6,7 @@ import ( "testing" "github.com/golang/mock/gomock" - . "github.com/tus/tusd" + . "github.com/tus/tusd/pkg/handler" ) func TestHead(t *testing.T) { diff --git a/log.go b/pkg/handler/log.go similarity index 97% rename from log.go rename to pkg/handler/log.go index ffef931..38b67d3 100644 --- a/log.go +++ b/pkg/handler/log.go @@ -1,4 +1,4 @@ -package tusd +package handler import ( "log" diff --git a/metrics.go b/pkg/handler/metrics.go similarity index 99% rename from metrics.go rename to pkg/handler/metrics.go index b52f7bf..7115b8f 100644 --- a/metrics.go +++ b/pkg/handler/metrics.go @@ -1,4 +1,4 @@ -package tusd +package handler import ( "errors" diff --git a/options_test.go b/pkg/handler/options_test.go similarity index 93% rename from options_test.go rename to pkg/handler/options_test.go index 2194035..325afa2 100644 --- a/options_test.go +++ b/pkg/handler/options_test.go @@ -1,10 +1,10 @@ -package tusd_test +package handler_test import ( "net/http" "testing" - . "github.com/tus/tusd" + . "github.com/tus/tusd/pkg/handler" ) func TestOptions(t *testing.T) { diff --git a/patch_test.go b/pkg/handler/patch_test.go similarity index 99% rename from patch_test.go rename to pkg/handler/patch_test.go index 5fd3762..96b32cc 100644 --- a/patch_test.go +++ b/pkg/handler/patch_test.go @@ -1,4 +1,4 @@ -package tusd_test +package handler_test import ( "io" @@ -12,7 +12,7 @@ import ( "github.com/golang/mock/gomock" "github.com/stretchr/testify/assert" - . "github.com/tus/tusd" + . "github.com/tus/tusd/pkg/handler" ) func TestPatch(t *testing.T) { diff --git a/post_test.go b/pkg/handler/post_test.go similarity index 99% rename from post_test.go rename to pkg/handler/post_test.go index d5915f1..0705f25 100644 --- a/post_test.go +++ b/pkg/handler/post_test.go @@ -1,4 +1,4 @@ -package tusd_test +package handler_test import ( "bytes" @@ -9,7 +9,7 @@ import ( "github.com/golang/mock/gomock" "github.com/stretchr/testify/assert" - . "github.com/tus/tusd" + . "github.com/tus/tusd/pkg/handler" ) func TestPost(t *testing.T) { diff --git a/subtest_test.go b/pkg/handler/subtest_test.go similarity index 94% rename from subtest_test.go rename to pkg/handler/subtest_test.go index d89a20d..0147f64 100644 --- a/subtest_test.go +++ b/pkg/handler/subtest_test.go @@ -1,4 +1,4 @@ -package tusd_test +package handler_test import ( "testing" diff --git a/terminate_test.go b/pkg/handler/terminate_test.go similarity index 97% rename from terminate_test.go rename to pkg/handler/terminate_test.go index 098d72c..d74c7a7 100644 --- a/terminate_test.go +++ b/pkg/handler/terminate_test.go @@ -1,11 +1,11 @@ -package tusd_test +package handler_test import ( "net/http" "testing" "github.com/golang/mock/gomock" - . "github.com/tus/tusd" + . "github.com/tus/tusd/pkg/handler" "github.com/stretchr/testify/assert" ) diff --git a/unrouted_handler.go b/pkg/handler/unrouted_handler.go similarity index 99% rename from unrouted_handler.go rename to pkg/handler/unrouted_handler.go index e14f132..6ff14e1 100644 --- a/unrouted_handler.go +++ b/pkg/handler/unrouted_handler.go @@ -1,4 +1,4 @@ -package tusd +package handler import ( "context" diff --git a/utils_test.go b/pkg/handler/utils_test.go similarity index 87% rename from utils_test.go rename to pkg/handler/utils_test.go index 6c52820..d896d6b 100644 --- a/utils_test.go +++ b/pkg/handler/utils_test.go @@ -1,4 +1,4 @@ -package tusd_test +package handler_test import ( "fmt" @@ -10,10 +10,10 @@ import ( "testing" "github.com/golang/mock/gomock" - "github.com/tus/tusd" + "github.com/tus/tusd/pkg/handler" ) -//go:generate mockgen -package tusd_test -source utils_test.go -aux_files tusd=datastore.go -destination=handler_mock_test.go +//go:generate mockgen -package handler_test -source utils_test.go -aux_files tusd=datastore.go -destination=handler_mock_test.go // FullDataStore is an interface combining most interfaces for data stores. // This is used by mockgen(1) to generate a mocked data store used for testing @@ -22,16 +22,16 @@ import ( // locking in every single test which would result in more verbose code. // Therefore it has been moved into its own type definition, the Locker. type FullDataStore interface { - tusd.DataStore - tusd.TerminaterDataStore - tusd.ConcaterDataStore - tusd.GetReaderDataStore - tusd.FinisherDataStore - tusd.LengthDeferrerDataStore + handler.DataStore + handler.TerminaterDataStore + handler.ConcaterDataStore + handler.GetReaderDataStore + handler.FinisherDataStore + handler.LengthDeferrerDataStore } type Locker interface { - tusd.LockerDataStore + handler.LockerDataStore } type httpTest struct { diff --git a/memorylocker/memorylocker.go b/pkg/memorylocker/memorylocker.go similarity index 90% rename from memorylocker/memorylocker.go rename to pkg/memorylocker/memorylocker.go index 280ee9f..b8853e4 100644 --- a/memorylocker/memorylocker.go +++ b/pkg/memorylocker/memorylocker.go @@ -13,7 +13,7 @@ package memorylocker import ( "sync" - "github.com/tus/tusd" + "github.com/tus/tusd/pkg/handler" ) // MemoryLocker persists locks using memory and therefore allowing a simple and @@ -27,7 +27,7 @@ type MemoryLocker struct { // NewMemoryLocker creates a new in-memory locker. The DataStore parameter // is only presented for back-wards compatibility and is ignored. Please // use the New() function instead. -func NewMemoryLocker(_ tusd.DataStore) *MemoryLocker { +func NewMemoryLocker(_ handler.DataStore) *MemoryLocker { return New() } @@ -39,7 +39,7 @@ func New() *MemoryLocker { } // UseIn adds this locker to the passed composer. -func (locker *MemoryLocker) UseIn(composer *tusd.StoreComposer) { +func (locker *MemoryLocker) UseIn(composer *handler.StoreComposer) { composer.UseLocker(locker) } @@ -50,7 +50,7 @@ func (locker *MemoryLocker) LockUpload(id string) error { // Ensure file is not locked if _, ok := locker.locks[id]; ok { - return tusd.ErrFileLocked + return handler.ErrFileLocked } locker.locks[id] = struct{}{} diff --git a/memorylocker/memorylocker_test.go b/pkg/memorylocker/memorylocker_test.go similarity index 68% rename from memorylocker/memorylocker_test.go rename to pkg/memorylocker/memorylocker_test.go index f2078c5..ddf2625 100644 --- a/memorylocker/memorylocker_test.go +++ b/pkg/memorylocker/memorylocker_test.go @@ -5,17 +5,17 @@ import ( "github.com/stretchr/testify/assert" - "github.com/tus/tusd" + "github.com/tus/tusd/pkg/handler" ) func TestMemoryLocker(t *testing.T) { a := assert.New(t) - var locker tusd.LockerDataStore + var locker handler.LockerDataStore locker = New() a.NoError(locker.LockUpload("one")) - a.Equal(tusd.ErrFileLocked, locker.LockUpload("one")) + a.Equal(handler.ErrFileLocked, locker.LockUpload("one")) a.NoError(locker.UnlockUpload("one")) a.NoError(locker.UnlockUpload("one")) } diff --git a/prometheuscollector/prometheuscollector.go b/pkg/prometheuscollector/prometheuscollector.go similarity index 94% rename from prometheuscollector/prometheuscollector.go rename to pkg/prometheuscollector/prometheuscollector.go index cfc4a0b..cdd6845 100644 --- a/prometheuscollector/prometheuscollector.go +++ b/pkg/prometheuscollector/prometheuscollector.go @@ -3,7 +3,7 @@ // Using the provided collector, you can easily expose metrics for tusd in the // Prometheus exposition format (https://prometheus.io/docs/instrumenting/exposition_formats/): // -// handler, err := tusd.NewHandler(…) +// handler, err := handler.NewHandler(…) // collector := prometheuscollector.New(handler.Metrics) // prometheus.MustRegister(collector) package prometheuscollector @@ -12,7 +12,7 @@ import ( "strconv" "sync/atomic" - "github.com/tus/tusd" + "github.com/tus/tusd/pkg/handler" "github.com/prometheus/client_golang/prometheus" ) @@ -45,11 +45,11 @@ var ( ) type Collector struct { - metrics tusd.Metrics + metrics handler.Metrics } // New creates a new collector which read froms the provided Metrics struct. -func New(metrics tusd.Metrics) Collector { +func New(metrics handler.Metrics) Collector { return Collector{ metrics: metrics, } diff --git a/s3store/calcpartsize_test.go b/pkg/s3store/calcpartsize_test.go similarity index 100% rename from s3store/calcpartsize_test.go rename to pkg/s3store/calcpartsize_test.go diff --git a/s3store/multi_error.go b/pkg/s3store/multi_error.go similarity index 100% rename from s3store/multi_error.go rename to pkg/s3store/multi_error.go diff --git a/s3store/s3store.go b/pkg/s3store/s3store.go similarity index 97% rename from s3store/s3store.go rename to pkg/s3store/s3store.go index a6d2c94..fd5e871 100644 --- a/s3store/s3store.go +++ b/pkg/s3store/s3store.go @@ -65,7 +65,7 @@ // consistency (https://docs.aws.amazon.com/AmazonS3/latest/dev/Introduction.html#ConsistencyModel). // Therefore, it is required to build additional measurements in order to // prevent concurrent access to the same upload resources which may result in -// data corruption. See tusd.LockerDataStore for more information. +// data corruption. See handler.LockerDataStore for more information. package s3store import ( @@ -80,8 +80,8 @@ import ( "strings" "sync" - "github.com/tus/tusd" - "github.com/tus/tusd/uid" + "github.com/tus/tusd/internal/uid" + "github.com/tus/tusd/pkg/handler" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/awserr" @@ -92,7 +92,7 @@ import ( // ASCII tables which range from 00 to 7F, inclusive. var nonASCIIRegexp = regexp.MustCompile(`([^\x00-\x7F])`) -// See the tusd.DataStore interface for documentation about the different +// See the handler.DataStore interface for documentation about the different // methods. type S3Store struct { // Bucket used to store the data in, e.g. "tusdstore.example.com" @@ -157,7 +157,7 @@ func New(bucket string, service S3API) S3Store { // UseIn sets this store as the core data store in the passed composer and adds // all possible extension to it. -func (store S3Store) UseIn(composer *tusd.StoreComposer) { +func (store S3Store) UseIn(composer *handler.StoreComposer) { composer.UseCore(store) composer.UseTerminater(store) composer.UseFinisher(store) @@ -166,7 +166,7 @@ func (store S3Store) UseIn(composer *tusd.StoreComposer) { composer.UseLengthDeferrer(store) } -func (store S3Store) NewUpload(info tusd.FileInfo) (id string, err error) { +func (store S3Store) NewUpload(info handler.FileInfo) (id string, err error) { // an upload larger than MaxObjectSize must throw an error if info.Size > store.MaxObjectSize { return "", fmt.Errorf("s3store: upload size of %v bytes exceeds MaxObjectSize of %v bytes", info.Size, store.MaxObjectSize) @@ -210,7 +210,7 @@ func (store S3Store) NewUpload(info tusd.FileInfo) (id string, err error) { return id, nil } -func (store S3Store) writeInfo(uploadId string, info tusd.FileInfo) error { +func (store S3Store) writeInfo(uploadId string, info handler.FileInfo) error { infoJson, err := json.Marshal(info) if err != nil { return err @@ -328,7 +328,7 @@ func (store S3Store) WriteChunk(id string, offset int64, src io.Reader) (int64, } } -func (store S3Store) GetInfo(id string) (info tusd.FileInfo, err error) { +func (store S3Store) GetInfo(id string) (info handler.FileInfo, err error) { uploadId, _ := splitIds(id) // Get file info stored in separate object @@ -338,7 +338,7 @@ func (store S3Store) GetInfo(id string) (info tusd.FileInfo, err error) { }) if err != nil { if isAwsError(err, "NoSuchKey") { - return info, tusd.ErrNotFound + return info, handler.ErrNotFound } return info, err @@ -418,7 +418,7 @@ func (store S3Store) GetReader(id string) (io.Reader, error) { if isAwsError(err, "NoSuchUpload") { // Neither the object nor the multipart upload exists, so we return a 404 - return nil, tusd.ErrNotFound + return nil, handler.ErrNotFound } return nil, err diff --git a/s3store/s3store_mock_test.go b/pkg/s3store/s3store_mock_test.go similarity index 98% rename from s3store/s3store_mock_test.go rename to pkg/s3store/s3store_mock_test.go index 3f52012..339cadb 100644 --- a/s3store/s3store_mock_test.go +++ b/pkg/s3store/s3store_mock_test.go @@ -1,5 +1,5 @@ // Automatically generated by MockGen. DO NOT EDIT! -// Source: github.com/tus/tusd/s3store (interfaces: S3API) +// Source: github.com/tus/tusd/pkg/s3store (interfaces: S3API) package s3store diff --git a/s3store/s3store_test.go b/pkg/s3store/s3store_test.go similarity index 98% rename from s3store/s3store_test.go rename to pkg/s3store/s3store_test.go index 463794a..7a317eb 100644 --- a/s3store/s3store_test.go +++ b/pkg/s3store/s3store_test.go @@ -13,17 +13,17 @@ import ( "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/awserr" "github.com/aws/aws-sdk-go/service/s3" - "github.com/tus/tusd" + "github.com/tus/tusd/pkg/handler" ) -//go:generate mockgen -destination=./s3store_mock_test.go -package=s3store github.com/tus/tusd/s3store S3API +//go:generate mockgen -destination=./s3store_mock_test.go -package=s3store github.com/tus/tusd/pkg/s3store S3API // Test interface implementations -var _ tusd.DataStore = S3Store{} -var _ tusd.GetReaderDataStore = S3Store{} -var _ tusd.TerminaterDataStore = S3Store{} -var _ tusd.FinisherDataStore = S3Store{} -var _ tusd.ConcaterDataStore = S3Store{} +var _ handler.DataStore = S3Store{} +var _ handler.GetReaderDataStore = S3Store{} +var _ handler.TerminaterDataStore = S3Store{} +var _ handler.FinisherDataStore = S3Store{} +var _ handler.ConcaterDataStore = S3Store{} func TestNewUpload(t *testing.T) { mockCtrl := gomock.NewController(t) @@ -58,7 +58,7 @@ func TestNewUpload(t *testing.T) { }), ) - info := tusd.FileInfo{ + info := handler.FileInfo{ ID: "uploadId", Size: 500, MetaData: map[string]string{ @@ -106,7 +106,7 @@ func TestNewUploadWithObjectPrefix(t *testing.T) { }), ) - info := tusd.FileInfo{ + info := handler.FileInfo{ ID: "uploadId", Size: 500, MetaData: map[string]string{ @@ -131,7 +131,7 @@ func TestNewUploadLargerMaxObjectSize(t *testing.T) { assert.Equal("bucket", store.Bucket) assert.Equal(s3obj, store.Service) - info := tusd.FileInfo{ + info := handler.FileInfo{ ID: "uploadId", Size: store.MaxObjectSize + 1, } @@ -156,7 +156,7 @@ func TestGetInfoNotFound(t *testing.T) { }).Return(nil, awserr.New("NoSuchKey", "The specified key does not exist.", nil)) _, err := store.GetInfo("uploadId+multipartId") - assert.Equal(tusd.ErrNotFound, err) + assert.Equal(handler.ErrNotFound, err) } func TestGetInfo(t *testing.T) { @@ -243,8 +243,8 @@ func TestGetInfoWithIncompletePart(t *testing.T) { Bucket: aws.String("bucket"), Key: aws.String("uploadId.part"), }).Return(&s3.GetObjectOutput{ - ContentLength: aws.Int64(10), - Body: ioutil.NopCloser(bytes.NewReader([]byte("0123456789"))), + ContentLength: aws.Int64(10), + Body: ioutil.NopCloser(bytes.NewReader([]byte("0123456789"))), }, nil), ) @@ -326,7 +326,7 @@ func TestGetReaderNotFound(t *testing.T) { content, err := store.GetReader("uploadId+multipartId") assert.Nil(content) - assert.Equal(tusd.ErrNotFound, err) + assert.Equal(handler.ErrNotFound, err) } func TestGetReaderNotFinished(t *testing.T) { @@ -730,8 +730,8 @@ func TestWriteChunkPrependsIncompletePart(t *testing.T) { Bucket: aws.String("bucket"), Key: aws.String("uploadId.part"), }).Return(&s3.GetObjectOutput{ - ContentLength: aws.Int64(3), - Body: ioutil.NopCloser(bytes.NewReader([]byte("123"))), + ContentLength: aws.Int64(3), + Body: ioutil.NopCloser(bytes.NewReader([]byte("123"))), }, nil), s3obj.EXPECT().ListParts(&s3.ListPartsInput{ Bucket: aws.String("bucket"), diff --git a/s3store/s3store_util_test.go b/pkg/s3store/s3store_util_test.go similarity index 100% rename from s3store/s3store_util_test.go rename to pkg/s3store/s3store_util_test.go diff --git a/tusd.code-workspace b/tusd.code-workspace deleted file mode 100644 index 5709732..0000000 --- a/tusd.code-workspace +++ /dev/null @@ -1,8 +0,0 @@ -{ - "folders": [ - { - "path": "." - } - ], - "settings": {} -}