From 63bd86d8046949e80e5b1122a1fcf717f51915c6 Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Fri, 3 Apr 2026 08:03:05 +0300 Subject: tasks 00d, 006, 007: move test seams to struct fields, centralize Viper config, extract shared card-dir logic MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit task 00d: remove package-level var test seams from processor and gui packages; factory functions (newAudioProvider, newOpenAIImageClient, newNanoBananaImageClient) are now struct fields on Processor and Application, initialized with production defaults in constructors and replaced in tests without global mutation. task 006: add viperConfig struct captured once in NewProcessor; no method body calls viper.GetString/IsSet/GetFloat64 directly any more — all config-file values are accessed via p.viperCfg fields. task 007: extract FindCardDirectory and FindOrCreateCardDirectory into internal/utils.go; both Processor.findCardDirectory and Application.findCardDirectory now delegate to the shared implementation, which also handles the legacy _word.txt backward-compat fallback. Co-Authored-By: Claude Sonnet 4.6 --- internal/gui/generator.go | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) (limited to 'internal/gui/generator.go') diff --git a/internal/gui/generator.go b/internal/gui/generator.go index 4763149..4b55608 100644 --- a/internal/gui/generator.go +++ b/internal/gui/generator.go @@ -22,16 +22,6 @@ type promptAwareImageClient interface { SetPromptCallback(func(prompt string)) } -var newOpenAIImageClient = func(config *image.OpenAIConfig) promptAwareImageClient { - return image.NewOpenAIClient(config) -} - -var newNanoBananaImageClient = func(config *image.NanoBananaConfig) promptAwareImageClient { - return image.NewNanoBananaClient(config) -} - -var newAudioProvider = audio.NewProvider - func randomVoice(voices []string) string { rng := rand.New(rand.NewSource(time.Now().UnixNano())) return voices[rng.Intn(len(voices))] @@ -123,7 +113,7 @@ func (a *Application) audioConfigForGeneration(voice string, speed float64) audi func (a *Application) generateAudioFile(ctx context.Context, text, outputFile, voice string, speed float64) error { audioConfig := a.audioConfigForGeneration(voice, speed) - provider, err := newAudioProvider(&audioConfig) + provider, err := a.newAudioProvider(&audioConfig) if err != nil { return err } @@ -410,7 +400,7 @@ func (a *Application) newImageSearcher() (promptAwareImageClient, error) { Style: "natural", } - return newOpenAIImageClient(openaiConfig), nil + return a.newOpenAIImageClient(openaiConfig), nil case imageProviderNanoBanana: config := a.config if config == nil { @@ -426,7 +416,7 @@ func (a *Application) newImageSearcher() (promptAwareImageClient, error) { TextModel: config.NanoBananaTextModel, } - return newNanoBananaImageClient(nanoBananaConfig), nil + return a.newNanoBananaImageClient(nanoBananaConfig), nil default: return nil, fmt.Errorf("unknown image provider: %s", a.config.ImageProvider) } -- cgit v1.2.3