From 993b2efe63e221cee550756770894c9c58474d25 Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Thu, 2 Apr 2026 21:47:12 +0300 Subject: task 00g/00k/00h/008: gofmt, remove ProviderWithFallback, stdlib helpers, shared prompt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - task 00g: fix gofmt violations (trailing whitespace, missing newlines, indentation) in 8 files; all pass gofmt -l now - task 00k: remove unused ProviderWithFallback and its tests (YAGNI — no production caller existed; voice-level fallback via RunWithVoiceFallbacks already covers the real use case) - task 00h: replace private splitLines/trimSpace/isSpace helpers in internal/batch/processor.go with strings.Split+ReplaceAll and strings.TrimSpace from the stdlib; remove the now-redundant tests - task 008: extract buildEducationalPrompt into internal/image/prompt.go so the prompt-assembly policy (scene truncation cascade, char limit) lives in one place; both OpenAIClient and NanoBananaClient delegate to it Co-Authored-By: Claude Sonnet 4.6 --- internal/audio/provider.go | 51 ----------------------- internal/audio/provider_test.go | 92 ----------------------------------------- internal/audio/validate.go | 8 ++-- 3 files changed, 4 insertions(+), 147 deletions(-) (limited to 'internal/audio') diff --git a/internal/audio/provider.go b/internal/audio/provider.go index 31b1180..0e863bf 100644 --- a/internal/audio/provider.go +++ b/internal/audio/provider.go @@ -75,54 +75,3 @@ func NewProvider(config *Config) (Provider, error) { } } -// Compile-time check that ProviderWithFallback implements the Provider interface. -var _ Provider = (*ProviderWithFallback)(nil) - -// ProviderWithFallback wraps a primary provider with a fallback option -type ProviderWithFallback struct { - primary Provider - fallback Provider -} - -// NewProviderWithFallback creates a provider that falls back to secondary if primary fails -func NewProviderWithFallback(primary, fallback Provider) Provider { - return &ProviderWithFallback{ - primary: primary, - fallback: fallback, - } -} - -// GenerateAudio tries primary provider first, falls back to secondary on error -func (p *ProviderWithFallback) GenerateAudio(ctx context.Context, text string, outputFile string) error { - err := p.primary.GenerateAudio(ctx, text, outputFile) - if err != nil { - // Log the primary error - fmt.Printf("Primary provider (%s) failed: %v. Falling back to %s\n", - p.primary.Name(), err, p.fallback.Name()) - - // Try fallback - return p.fallback.GenerateAudio(ctx, text, outputFile) - } - return nil -} - -// Name returns the provider name -func (p *ProviderWithFallback) Name() string { - return fmt.Sprintf("%s (fallback: %s)", p.primary.Name(), p.fallback.Name()) -} - -// IsAvailable checks if at least one provider is available -func (p *ProviderWithFallback) IsAvailable() error { - primaryErr := p.primary.IsAvailable() - if primaryErr == nil { - return nil - } - - fallbackErr := p.fallback.IsAvailable() - if fallbackErr == nil { - return nil - } - - return fmt.Errorf("both providers unavailable: primary=%v, fallback=%v", - primaryErr, fallbackErr) -} diff --git a/internal/audio/provider_test.go b/internal/audio/provider_test.go index a08b7a6..5702016 100644 --- a/internal/audio/provider_test.go +++ b/internal/audio/provider_test.go @@ -2,7 +2,6 @@ package audio import ( "context" - "errors" "path/filepath" "strings" "testing" @@ -153,94 +152,3 @@ func TestNewProvider(t *testing.T) { } } -func TestProviderWithFallback(t *testing.T) { - primary := &mockProvider{name: "primary"} - fallback := &mockProvider{name: "fallback"} - - provider := NewProviderWithFallback(primary, fallback) - - // Test successful primary - ctx := context.Background() - err := provider.GenerateAudio(ctx, "test", "output.mp3") - if err != nil { - t.Errorf("GenerateAudio() unexpected error: %v", err) - } - if primary.generateCalls != 1 { - t.Errorf("Expected 1 primary call, got %d", primary.generateCalls) - } - if fallback.generateCalls != 0 { - t.Errorf("Expected 0 fallback calls, got %d", fallback.generateCalls) - } - - // Test primary failure, fallback success - primary.generateErr = errors.New("primary failed") - primary.generateCalls = 0 - - err = provider.GenerateAudio(ctx, "test", "output.mp3") - if err != nil { - t.Errorf("GenerateAudio() unexpected error: %v", err) - } - if primary.generateCalls != 1 { - t.Errorf("Expected 1 primary call, got %d", primary.generateCalls) - } - if fallback.generateCalls != 1 { - t.Errorf("Expected 1 fallback call, got %d", fallback.generateCalls) - } - - // Test both fail - fallback.generateErr = errors.New("fallback failed") - primary.generateCalls = 0 - fallback.generateCalls = 0 - - err = provider.GenerateAudio(ctx, "test", "output.mp3") - if err == nil { - t.Error("GenerateAudio() expected error when both providers fail") - } -} - -func TestProviderWithFallbackName(t *testing.T) { - primary := &mockProvider{name: "primary"} - fallback := &mockProvider{name: "fallback"} - - provider := NewProviderWithFallback(primary, fallback) - - expected := "primary (fallback: fallback)" - if provider.Name() != expected { - t.Errorf("Name() = %v, want %v", provider.Name(), expected) - } -} - -func TestProviderWithFallbackIsAvailable(t *testing.T) { - primary := &mockProvider{name: "primary"} - fallback := &mockProvider{name: "fallback"} - - provider := NewProviderWithFallback(primary, fallback) - - // Both available - err := provider.IsAvailable() - if err != nil { - t.Errorf("IsAvailable() unexpected error: %v", err) - } - - // Primary unavailable, fallback available - primary.availableErr = errors.New("primary unavailable") - err = provider.IsAvailable() - if err != nil { - t.Errorf("IsAvailable() unexpected error when fallback available: %v", err) - } - - // Primary available, fallback unavailable - primary.availableErr = nil - fallback.availableErr = errors.New("fallback unavailable") - err = provider.IsAvailable() - if err != nil { - t.Errorf("IsAvailable() unexpected error when primary available: %v", err) - } - - // Both unavailable - primary.availableErr = errors.New("primary unavailable") - err = provider.IsAvailable() - if err == nil { - t.Error("IsAvailable() expected error when both providers unavailable") - } -} diff --git a/internal/audio/validate.go b/internal/audio/validate.go index db042bd..e200cfa 100644 --- a/internal/audio/validate.go +++ b/internal/audio/validate.go @@ -11,7 +11,7 @@ func ValidateBulgarianText(text string) error { if strings.TrimSpace(text) == "" { return fmt.Errorf("text cannot be empty") } - + hasCyrillic := false for _, r := range text { if unicode.In(r, unicode.Cyrillic) { @@ -19,10 +19,10 @@ func ValidateBulgarianText(text string) error { break } } - + if !hasCyrillic { return fmt.Errorf("text must contain Cyrillic characters") } - + return nil -} \ No newline at end of file +} -- cgit v1.2.3