From fee2e3cc2f3dbc274ad0cdea48253bacd47efea4 Mon Sep 17 00:00:00 2001 From: Dan Jones Date: Sun, 16 Mar 2025 12:38:36 -0500 Subject: [PATCH 1/4] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Modify=20UUID=20to=20a?= =?UTF-8?q?llow=20for=20other=20versions.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config.go | 2 +- gen_rand.go | 45 +++++++++++++++++++++++++++++++-------- gen_rand_examples_test.go | 28 +++++++++++++----------- gen_rand_test.go | 4 ++-- 4 files changed, 55 insertions(+), 24 deletions(-) diff --git a/config.go b/config.go index a7da5f5..945e588 100644 --- a/config.go +++ b/config.go @@ -14,7 +14,7 @@ func NewConfig(options ...Option) Config { conf := Config{ extension: ".txt", separator: "_", - generator: uuidGen, + generator: UUID(nil), } for _, opt := range options { opt(&conf) diff --git a/gen_rand.go b/gen_rand.go index 8b4ce5a..de71723 100644 --- a/gen_rand.go +++ b/gen_rand.go @@ -8,17 +8,44 @@ import ( "github.com/google/uuid" ) -func uuidGen(*Config) (string, error) { - u, err := uuid.NewRandom() - if err != nil { - return "", err - } - return u.String(), nil +// UUIDer is an interface for generating UUIDs. +// It is recommended that you use either the UUIDv4 or UUIDv7 variables. +type UUIDer interface { + UUID() (uuid.UUID, error) } -// UUID generates a UUIDv4. -func UUID() Generator { - return uuidGen +// UUIDFunc is a function that generates a UUID. +type UUIDFunc func() (uuid.UUID, error) + +// UUID allows UUIDFunc to be used as a UUIDer. +func (u UUIDFunc) UUID() (uuid.UUID, error) { + return u() +} + +var ( + // UUIDv1. You probably don't want to use this. It is included for completeness sake. + UUIDv1 = UUIDFunc(uuid.NewUUID) + // UUIDv4 is the default. + UUIDv4 = UUIDFunc(uuid.NewRandom) + // UUIDv6 is primarily a replacement for UUIDv1. You probably should use 4 or 7. + UUIDv6 = UUIDFunc(uuid.NewV6) + // UUIDv7 should be used if you want it sortable by time. + UUIDv7 = UUIDFunc(uuid.NewV7) +) + +// UUID generates a UUID. If nil.is passed as an argument, +// a UUIDv4 is generated. +func UUID(u UUIDer) Generator { + if u == nil { + u = UUIDv4 + } + return func(*Config) (string, error) { + uu, err := u.UUID() + if err != nil { + return "", err + } + return uu.String(), nil + } } type randConf struct { diff --git a/gen_rand_examples_test.go b/gen_rand_examples_test.go index 45cb7fe..29737fa 100644 --- a/gen_rand_examples_test.go +++ b/gen_rand_examples_test.go @@ -7,30 +7,34 @@ import ( ) func ExampleUUID() { - option := nomino.WithGenerator(nomino.UUID()) + gen := nomino.UUID(nil) - str, _ := nomino.Make(nomino.NewConfig(option)) + str, _ := gen.Make() fmt.Println(str) - str, _ = nomino.Make(nomino.NewConfig(option)) + str, _ = gen.Make() + fmt.Println(str) +} + +func ExampleUUID_v7() { + gen := nomino.UUID(nomino.UUIDv7) + + str, _ := gen.Make() fmt.Println(str) - str, _ = nomino.Make(nomino.NewConfig(option)) + str, _ = gen.Make() + fmt.Println(str) + + str, _ = gen.Make() fmt.Println(str) } func ExampleRandom() { - option := nomino.WithGenerator(nomino.Random()) - - str, _ := nomino.Make(nomino.NewConfig(option)) + str, _ := nomino.Random().Make() fmt.Println(str) } func ExampleRandomLength() { - option := nomino.WithGenerator(nomino.Random( - nomino.RandomLength(32), - )) - - str, _ := nomino.Make(nomino.NewConfig(option)) + str, _ := nomino.Random(nomino.RandomLength(32)).Make() fmt.Println(str) } diff --git a/gen_rand_test.go b/gen_rand_test.go index 832275b..51fc73f 100644 --- a/gen_rand_test.go +++ b/gen_rand_test.go @@ -9,7 +9,7 @@ import ( ) func TestUUID(t *testing.T) { - st, err := UUID()(nil) + st, err := UUID(nil)(nil) assert.NoError(t, err) _, parseErr := uuid.Parse(st) assert.NoError(t, parseErr) @@ -25,7 +25,7 @@ func TestUUIDFail(t *testing.T) { uuid.SetRand(badRead{}) defer uuid.SetRand(nil) - _, err := UUID()(nil) + _, err := UUID(nil)(nil) assert.Equal(t, errors.New("sorry"), err) } From d7b14f804ca99355764b73e1032ec576afd16c2d Mon Sep 17 00:00:00 2001 From: Dan Jones Date: Sun, 16 Mar 2025 15:56:31 -0500 Subject: [PATCH 2/4] =?UTF-8?q?=F0=9F=93=9D=20Redo=20ts=20examples=20to=20?= =?UTF-8?q?use=20gen.Make?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gen_ts_examples_test.go | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/gen_ts_examples_test.go b/gen_ts_examples_test.go index 2f49392..26f8a91 100644 --- a/gen_ts_examples_test.go +++ b/gen_ts_examples_test.go @@ -9,8 +9,7 @@ import ( func ExampleTimestamp() { gen := nomino.Timestamp() - conf := nomino.NewConfig(nomino.WithGenerator(gen)) - s, _ := nomino.Make(conf) + s, _ := gen.Make() fmt.Println(s) } @@ -18,8 +17,7 @@ func ExampleTimestampTime() { tz, _ := time.LoadLocation("America/New_York") ts := time.Date(2009, time.January, 20, 12, 5, 0, 0, tz) gen := nomino.Timestamp(nomino.TimestampTime(ts)) - conf := nomino.NewConfig(nomino.WithGenerator(gen)) - s, _ := nomino.Make(conf) + s, _ := gen.Make() fmt.Println(s) // Output: 2009-01-20T12-05-00-0500.txt } @@ -28,8 +26,7 @@ func ExampleTimestampFormat() { tz, _ := time.LoadLocation("America/New_York") ts := time.Date(2009, time.January, 20, 12, 5, 0, 0, tz) gen := nomino.Timestamp(nomino.TimestampTime(ts), nomino.TimestampFormat("2006#01#02<>15|04|05-0700")) - conf := nomino.NewConfig(nomino.WithGenerator(gen)) - s, _ := nomino.Make(conf) + s, _ := gen.Make() fmt.Println(s) // Output: 2009#01#20<>12|05|00-0500.txt } @@ -38,8 +35,7 @@ func ExampleTimestampUTC() { tz, _ := time.LoadLocation("America/New_York") ts := time.Date(2009, time.January, 20, 12, 5, 0, 0, tz) gen := nomino.Timestamp(nomino.TimestampTime(ts), nomino.TimestampUTC()) - conf := nomino.NewConfig(nomino.WithGenerator(gen)) - s, _ := nomino.Make(conf) + s, _ := gen.Make() fmt.Println(s) // Output: 2009-01-20T17-05-00.txt } From 1abfaa44d117533a5b46c1f31d0046cdd87e133a Mon Sep 17 00:00:00 2001 From: Dan Jones Date: Tue, 18 Mar 2025 09:22:30 -0500 Subject: [PATCH 3/4] =?UTF-8?q?=E2=9C=A8=20Config.AddOptions=20and=20Gener?= =?UTF-8?q?ator.MakeWithConfig?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config.go | 8 ++++++++ config_test.go | 9 +++++++++ generators.go | 11 ++++++++--- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/config.go b/config.go index 945e588..c889a06 100644 --- a/config.go +++ b/config.go @@ -21,3 +21,11 @@ func NewConfig(options ...Option) Config { } return conf } + +// AddOptions creates a new Config with options added. +func (c Config) AddOptions(options ...Option) Config { + for _, opt := range options { + opt(&c) + } + return c +} diff --git a/config_test.go b/config_test.go index adc35e6..f6ed21d 100644 --- a/config_test.go +++ b/config_test.go @@ -20,3 +20,12 @@ func TestNewConfWithOpts(t *testing.T) { assert.Equal(t, "", c.extension) assert.Equal(t, "foobar", c.prefix) } + +func TestConfAddOpts(t *testing.T) { + c := Config{original: "hi"} + c2 := c.AddOptions(WithOriginalSlug("Hello, my dear"), WithPrefix("yo")) + assert.Equal(t, "", c.prefix) + assert.Equal(t, "hi", c.original) + assert.Equal(t, "hello-my-dear", c2.original) + assert.Equal(t, "yo", c2.prefix) +} diff --git a/generators.go b/generators.go index c7ad4e8..e01ccc6 100644 --- a/generators.go +++ b/generators.go @@ -10,10 +10,15 @@ import ( // for example. type Generator func(conf *Config) (string, error) -// Make allows you to generate a new string directly from a generator. +// Make allows you to generate a new string directly from a Generator. func (g Generator) Make(opts ...Option) (string, error) { - opts = append(opts, WithGenerator(g)) - return Make(NewConfig(opts...)) + return g.MakeWithConfig(NewConfig(opts...)) +} + +// MakeWithConfig allows you to generate a new string directly from a Generator +// with a pre-existing Config. +func (g Generator) MakeWithConfig(c Config) (string, error) { + return Make(c.AddOptions(WithGenerator(g))) } // WithGenerator sets the specified generator From f20e737f2b4211053456eade0d1f6d29333d412a Mon Sep 17 00:00:00 2001 From: Dan Jones Date: Wed, 19 Mar 2025 14:37:40 -0500 Subject: [PATCH 4/4] =?UTF-8?q?=F0=9F=93=9D=20Update=20CHANGELOG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 78 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 45 insertions(+), 33 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c2674b9..c21a656 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,84 +1,96 @@ # Changelog -### [0.4.0] - 2025-03-15 +### [0.5.0] - 2025-03-19 - ✨ Different types of UUIDs #### Features -- Add Random Generator -- Add Make method to Generator -- Add MultiGeneratorRandomOrder - -#### Changes - -- Replace HashType with Hasher: This supports all crypto.Hash +- ✨ Allow for different types of UUIDs in the UUID `Generator` +- ✨ `Config.AddOptions` method +- ✨ `Generator.MakeWithConfig` method #### Support -- Add some missing doc comments +- 📝 Some better examples` -### [0.3.0] - 2025-03-14 +### [0.4.0] - 2025-03-15 - ✨ More Generators, and `Generator.Make` method #### Features -- Simplified multiple Generator functions to single function with options -- Added a lot of examples for docs -- Can add extra Options to Make +- ✨ Add Random Generator +- ✨ Add Make method to Generator +- ✨ Add MultiGeneratorRandomOrder + +#### Changes + +- 💔 Breaking changes: Replace HashType with Hasher: This supports all crypto.Hash + +#### Support + +- 📝 Add some missing doc comments + +### [0.3.0] - 2025-03-14 - ♻️ Refactor multiple Generators into one + +#### Features + +- ♻️ Simplified multiple `Generator` functions to single function with options +- 📝 Added a lot of examples for docs +- ✨ Can add extra `Option`s to `Make` Multiple breaking changes around Generators. #### Bugs -- Fixed date formats +- 🐛 Fixed date formats -### [0.2.1] - 2025-03-14 +### [0.2.1] - 2025-03-14 - ✨ New Hash Generator #### Features -- Add Hash Generator +- ✨ Add Hash Generator #### Dev Tooling -- Added a task to serve docs -- Added tasts to check code complexity +- 🛠 Added a task to serve docs +- 🛠 Added tasts to check code complexity #### Miscellaneous -- Fixed some `go vet` complaints +- 💚 Fixed some `go vet` complaints -### [0.2.0] - 2025-03-14 +### [0.2.0] - 2025-03-14 - ✨ New `Generator`s #### Features -- Add `IncrementalFormat`* Generators -- Add `Slug`* Generators -- Add `WithOriginalSlug`* Options -- Change signature of `Generator` function +- ✨ Add `IncrementalFormat`* Generators +- ✨ Add `Slug`* Generators +- ✨ Add `WithOriginalSlug`* Options +- 💔 Change signature of `Generator` function Note that this last change **is** a breaking change from 0.0.3, but only for custom Generators. -## [0.0.3] - 2025-03-11 +## [0.0.3] - 2025-03-11 - ✨ `WithSeparator` ### Features -- Added `WithSeparator` to allow for different separators between the parts of the generated filename. +- ✨ Added `WithSeparator` to allow for different separators between the parts of the generated filename. -## [0.0.2] - 2025-03-11 +## [0.0.2] - 2025-03-11 - 🐛 Bugfix Bugfix release ### Fixes -- Extension being ignored. Original included twice. +- 🐛 Extension being ignored. Original included twice. -## [0.0.1] - 2025-03-10 +## [0.0.1] - 2025-03-10 - 🚀 Initial Release Initial Release! Hope you like it! ### Added -- nomino.Make -- nomino.Config -- nomino.Generator +- ✨ `nomino.Make`` +- ✨ `nomino.Config` +- ✨ `nomino.Generator` + We needs more of these until I'm ready -- Lots of tests! +- ✅ Lots of tests!