Compare commits

...

6 commits

Author SHA1 Message Date
c17f23595c 🔀 Merge branch 'release/0.5.0' into stable 2025-03-19 14:38:34 -05:00
f20e737f2b 📝 Update CHANGELOG 2025-03-19 14:37:40 -05:00
1abfaa44d1 Config.AddOptions and Generator.MakeWithConfig 2025-03-18 09:22:30 -05:00
d7b14f804c 📝 Redo ts examples to use gen.Make 2025-03-16 15:56:31 -05:00
fee2e3cc2f ♻️ Modify UUID to allow for other versions. 2025-03-16 12:38:36 -05:00
f121b7dbce 🔀 Merge tag 'v0.4.0' into develop
🔖 0.4.0 Release is close to 1.0
2025-03-15 21:08:44 -05:00
8 changed files with 129 additions and 68 deletions

View file

@ -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!

View file

@ -14,10 +14,18 @@ func NewConfig(options ...Option) Config {
conf := Config{
extension: ".txt",
separator: "_",
generator: uuidGen,
generator: UUID(nil),
}
for _, opt := range options {
opt(&conf)
}
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
}

View file

@ -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)
}

View file

@ -8,17 +8,44 @@ import (
"github.com/google/uuid"
)
func uuidGen(*Config) (string, error) {
u, err := uuid.NewRandom()
// 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)
}
// 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 u.String(), nil
return uu.String(), nil
}
// UUID generates a UUIDv4.
func UUID() Generator {
return uuidGen
}
type randConf struct {

View file

@ -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)
}

View file

@ -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)
}

View file

@ -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
}

View file

@ -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