Files
gh-action-readme/internal/progress.go
Ismo Vuorinen f94967713a refactor: major codebase improvements and test framework overhaul
This commit represents a comprehensive refactoring of the codebase focused on
improving code quality, testability, and maintainability.

Key improvements:
- Implement dependency injection and interface-based architecture
- Add comprehensive test framework with fixtures and test suites
- Fix all linting issues (errcheck, gosec, staticcheck, goconst, etc.)
- Achieve full EditorConfig compliance across all files
- Replace hardcoded test data with proper fixture files
- Add configuration loader with hierarchical config support
- Improve error handling with contextual information
- Add progress indicators for better user feedback
- Enhance Makefile with help system and improved editorconfig commands
- Consolidate constants and remove deprecated code
- Strengthen validation logic for GitHub Actions
- Add focused consumer interfaces for better separation of concerns

Testing improvements:
- Add comprehensive integration tests
- Implement test executor pattern for better test organization
- Create extensive YAML fixture library for testing
- Fix all failing tests and improve test coverage
- Add validation test fixtures to avoid embedded YAML in Go files

Build and tooling:
- Update Makefile to show help by default
- Fix editorconfig commands to use eclint properly
- Add comprehensive help documentation to all make targets
- Improve file selection patterns to avoid glob errors

This refactoring maintains backward compatibility while significantly
improving the internal architecture and developer experience.
2025-08-05 23:20:58 +03:00

90 lines
2.5 KiB
Go

// Package internal provides progress bar utilities for the gh-action-readme tool.
package internal
import (
"fmt"
"github.com/schollz/progressbar/v3"
)
// ProgressBarManager handles progress bar creation and management.
// It implements the ProgressManager interface.
type ProgressBarManager struct {
quiet bool
}
// Compile-time interface check.
var _ ProgressManager = (*ProgressBarManager)(nil)
// NewProgressBarManager creates a new progress bar manager.
func NewProgressBarManager(quiet bool) *ProgressBarManager {
return &ProgressBarManager{
quiet: quiet,
}
}
// CreateProgressBar creates a progress bar with standardized options.
func (pm *ProgressBarManager) CreateProgressBar(description string, total int) *progressbar.ProgressBar {
if total <= 1 || pm.quiet {
return nil
}
return progressbar.NewOptions(total,
progressbar.OptionSetDescription(description),
progressbar.OptionSetWidth(50),
progressbar.OptionShowCount(),
progressbar.OptionShowIts(),
progressbar.OptionSetTheme(progressbar.Theme{
Saucer: "=",
SaucerHead: ">",
SaucerPadding: " ",
BarStart: "[",
BarEnd: "]",
}))
}
// CreateProgressBarForFiles creates a progress bar for processing multiple files.
func (pm *ProgressBarManager) CreateProgressBarForFiles(description string, files []string) *progressbar.ProgressBar {
return pm.CreateProgressBar(description, len(files))
}
// FinishProgressBar completes the progress bar display.
func (pm *ProgressBarManager) FinishProgressBar(bar *progressbar.ProgressBar) {
if bar != nil {
_ = bar.Finish()
}
}
// FinishProgressBarWithNewline completes the progress bar display and adds a newline.
func (pm *ProgressBarManager) FinishProgressBarWithNewline(bar *progressbar.ProgressBar) {
pm.FinishProgressBar(bar)
if bar != nil {
fmt.Println()
}
}
// ProcessWithProgressBar executes a function for each item with progress tracking.
// The processFunc receives the item and the progress bar for updating.
func (pm *ProgressBarManager) ProcessWithProgressBar(
description string,
items []string,
processFunc func(item string, bar *progressbar.ProgressBar),
) {
bar := pm.CreateProgressBarForFiles(description, items)
defer pm.FinishProgressBarWithNewline(bar)
for _, item := range items {
processFunc(item, bar)
if bar != nil {
_ = bar.Add(1)
}
}
}
// UpdateProgressBar safely updates the progress bar if it exists.
func (pm *ProgressBarManager) UpdateProgressBar(bar *progressbar.ProgressBar) {
if bar != nil {
_ = bar.Add(1)
}
}