From 7bd55036138ddc0e5549650eadd6cfb6f8cbc0cd Mon Sep 17 00:00:00 2001 From: Dan Jones Date: Mon, 10 Mar 2025 14:52:50 -0500 Subject: [PATCH 1/3] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Export=20Config?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config.go | 20 ++++++++++++++++++++ config_test.go | 22 ++++++++++++++++++++++ generators.go | 2 +- generators_test.go | 2 +- options.go | 29 +++++++---------------------- options_test.go | 19 +++++-------------- 6 files changed, 56 insertions(+), 38 deletions(-) create mode 100644 config.go create mode 100644 config_test.go diff --git a/config.go b/config.go new file mode 100644 index 0000000..dc6af3d --- /dev/null +++ b/config.go @@ -0,0 +1,20 @@ +package nomino + +type Config struct { + original string + prefix string + suffix string + extension string + generator Generator +} + +func NewConfig(options ...Option) Config { + conf := Config{ + extension: ".txt", + generator: uuidGen, + } + for _, opt := range options { + opt(&conf) + } + return conf +} diff --git a/config_test.go b/config_test.go new file mode 100644 index 0000000..bb88b53 --- /dev/null +++ b/config_test.go @@ -0,0 +1,22 @@ +package nomino + +import ( + "testing" + + "github.com/google/uuid" + "github.com/stretchr/testify/assert" +) + +func TestNewConf(t *testing.T) { + c := NewConfig() + assert.Equal(t, ".txt", c.extension) + st, _ := c.generator() + _, parseErr := uuid.Parse(st) + assert.NoError(t, parseErr) +} + +func TestNewConfWithOpts(t *testing.T) { + c := NewConfig(WithoutExtension(), WithPrefix("foobar")) + assert.Equal(t, "", c.extension) + assert.Equal(t, "foobar_", c.prefix) +} diff --git a/generators.go b/generators.go index c409988..fdbdabd 100644 --- a/generators.go +++ b/generators.go @@ -14,7 +14,7 @@ type Generator func() (string, error) // WithGenerator sets the specified generator func WithGenerator(g Generator) Option { - return func(c *config) { + return func(c *Config) { c.generator = g } } diff --git a/generators_test.go b/generators_test.go index 210181f..7282656 100644 --- a/generators_test.go +++ b/generators_test.go @@ -11,7 +11,7 @@ import ( func TestWithGenerator(t *testing.T) { g := func() (string, error) { return "abc", nil } - var c config + var c Config WithGenerator(g)(&c) st, err := c.generator() assert.NoError(t, err) diff --git a/options.go b/options.go index 7f93d57..fa6c81c 100644 --- a/options.go +++ b/options.go @@ -2,56 +2,41 @@ package nomino import "strings" -type config struct { - original string - prefix string - suffix string - extension string - generator Generator -} - -func defaultConf() config { - return config{ - extension: ".txt", - generator: uuidGen, - } -} - -// Option is an option for nomino -type Option func(c *config) +// Option sets configuration parameters for Config. +type Option func(c *Config) // WithOriginal sets the original filename. // This will be included in the generated name after the generated string and before the suffix. func WithOriginal(o string) Option { - return func(c *config) { + return func(c *Config) { c.original = "_" + o } } // WithPrefix sets a prefix for the generated name. func WithPrefix(p string) Option { - return func(c *config) { + return func(c *Config) { c.prefix = p + "_" } } // WithSuffix sets a suffix for the generated name. It will be included in the base name before the suffix. func WithSuffix(s string) Option { - return func(c *config) { + return func(c *Config) { c.suffix = "_" + s } } // WithoutExtension sets no extension for the generated filename. By default, it will be txt func WithoutExtension() Option { - return func(c *config) { + return func(c *Config) { c.extension = "" } } // WithExtension sets the extension for the generated filename. func WithExtension(ext string) Option { - return func(c *config) { + return func(c *Config) { c.extension = "." + strings.TrimPrefix(ext, ".") } } diff --git a/options_test.go b/options_test.go index ea9ed47..12a2bb5 100644 --- a/options_test.go +++ b/options_test.go @@ -3,47 +3,38 @@ package nomino import ( "testing" - "github.com/google/uuid" "github.com/stretchr/testify/assert" ) -func TestDefaultConf(t *testing.T) { - c := defaultConf() - assert.Equal(t, ".txt", c.extension) - st, _ := c.generator() - _, parseErr := uuid.Parse(st) - assert.NoError(t, parseErr) -} - func TestWithOriginal(t *testing.T) { - var c config + var c Config name := "foobar" WithOriginal(name)(&c) assert.Equal(t, "_"+name, c.original) } func TestWithPrefix(t *testing.T) { - var c config + var c Config pref := "draft" WithPrefix(pref)(&c) assert.Equal(t, pref+"_", c.prefix) } func TestWithSuffix(t *testing.T) { - var c config + var c Config suff := "out" WithSuffix(suff)(&c) assert.Equal(t, "_"+suff, c.suffix) } func TestWithoutExtension(t *testing.T) { - c := config{extension: ".foobar"} + c := Config{extension: ".foobar"} WithoutExtension()(&c) assert.Equal(t, "", c.extension) } func TestWithExtension(t *testing.T) { - var c config + var c Config ext := "yaml" WithExtension(ext)(&c) assert.Equal(t, "."+ext, c.extension) From 7126ef97a4e24eeeaa69be9b506870128662857e Mon Sep 17 00:00:00 2001 From: Dan Jones Date: Mon, 10 Mar 2025 14:53:59 -0500 Subject: [PATCH 2/3] =?UTF-8?q?=E2=9C=A8=20Add=20Make=20function?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is the important one --- make.go | 15 +++++++++++++++ make_test.go | 23 +++++++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 make.go create mode 100644 make_test.go diff --git a/make.go b/make.go new file mode 100644 index 0000000..3cd537a --- /dev/null +++ b/make.go @@ -0,0 +1,15 @@ +package nomino + +import "fmt" + +// Make generates a random filename. The behavior can be controlled by specifying Options +// In general, the final filename will be [prefix]_[generated_string]_[original_filename]_[suffix].[extension]. +// If the name generator returns an error (generally, it shouldn't), that will be returned instead. +func Make(conf Config) (string, error) { + name, err := conf.generator() + if err != nil { + return "", err + } + + return fmt.Sprintf("%s%s%s%s%s", conf.prefix, name, conf.original, conf.suffix, conf.original), nil +} diff --git a/make_test.go b/make_test.go new file mode 100644 index 0000000..e9cc006 --- /dev/null +++ b/make_test.go @@ -0,0 +1,23 @@ +package nomino + +import ( + "errors" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestMake(t *testing.T) { + conf := NewConfig(WithGenerator(func() (string, error) { return "abc", nil })) + st, err := Make(conf) + assert.NoError(t, err) + assert.Equal(t, "abc", st) +} + +func TestMakeErr(t *testing.T) { + retErr := errors.New("oops") + conf := NewConfig(WithGenerator(func() (string, error) { return "foobar", retErr })) + st, err := Make(conf) + assert.Zero(t, st) + assert.ErrorIs(t, err, retErr) +} From 899fbedd9a14c3e6487147c0d1d06ce6f1ddaa40 Mon Sep 17 00:00:00 2001 From: Dan Jones Date: Mon, 10 Mar 2025 17:03:52 -0500 Subject: [PATCH 3/3] =?UTF-8?q?=F0=9F=94=96=20Version=200.0.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 14 ++++++++++++++ LICENSE | 21 +++++++++++++++++++++ README.md | 11 +++++++++++ 3 files changed, 46 insertions(+) create mode 100644 CHANGELOG.md create mode 100644 LICENSE create mode 100644 README.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..b47e994 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,14 @@ +# Changelog + +## [0.0.1] - 2025-03-10 + +Initial Release! Hope you like it! + +### Added + +- nomino.Make +- nomino.Config +- nomino.Generator + + We needs more of these until I'm ready +- Lots of tests! + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..9f61e2e --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2025, Dan Jones . + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..e364bfc --- /dev/null +++ b/README.md @@ -0,0 +1,11 @@ +# nomino - A filename generator + +The purpose of nomino is to generate (probably random) filenames, for example, if you want to save an uploaded file to storage under a new name. + +It takes a lot of inspiration (although no actual code) from [Onym](https://github.com/Blaspsoft/onym). + +## TODO + +I'll fill this out more in depth later. + +For now, add it to a new project, and run `go doc codeberg.org/danjones000/nomino`