< Summary - go-semantic-release Coverage

Line coverage
80%
Covered lines: 12
Uncovered lines: 3
Coverable lines: 15
Total lines: 76
Line coverage: 80%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
File 1: NewNoopPrompter0%00100%
File 2: NewTerminalPrompter0%00100%
File 2: NewTerminalPrompterWithIO0%00100%
File 2: IsTerminal0%0050%

File(s)

/home/runner/work/go-semantic-release/go-semantic-release/internal/adapters/prompt/noop.go

#LineLine coverage
 1package prompt
 2
 3import "github.com/jedi-knights/go-semantic-release/internal/ports"
 4
 5// Compile-time interface compliance check.
 6var _ ports.Prompter = (*NoopPrompter)(nil)
 7
 8// NoopPrompter always confirms without prompting (for CI or non-interactive mode).
 9type NoopPrompter struct{}
 10
 11// NewNoopPrompter creates a prompter that always returns true.
 212func NewNoopPrompter() *NoopPrompter {
 213  return &NoopPrompter{}
 214}
 15
 16// Confirm always returns true without prompting.
 17func (p *NoopPrompter) Confirm(_ string) (bool, error) {
 18  return true, nil
 19}

/home/runner/work/go-semantic-release/go-semantic-release/internal/adapters/prompt/terminal.go

#LineLine coverage
 1package prompt
 2
 3import (
 4  "bufio"
 5  "fmt"
 6  "io"
 7  "os"
 8  "strings"
 9
 10  "github.com/jedi-knights/go-semantic-release/internal/ports"
 11)
 12
 13// Compile-time interface compliance check.
 14var _ ports.Prompter = (*TerminalPrompter)(nil)
 15
 16// TerminalPrompter prompts the user via stdin/stdout.
 17type TerminalPrompter struct {
 18  reader io.Reader
 19  writer io.Writer
 20}
 21
 22// NewTerminalPrompter creates a prompter that reads from stdin and writes to stdout.
 123func NewTerminalPrompter() *TerminalPrompter {
 124  return &TerminalPrompter{reader: os.Stdin, writer: os.Stdout}
 125}
 26
 27// NewTerminalPrompterWithIO creates a prompter with custom reader/writer (for testing).
 728func NewTerminalPrompterWithIO(r io.Reader, w io.Writer) *TerminalPrompter {
 729  return &TerminalPrompter{reader: r, writer: w}
 730}
 31
 32// Confirm asks the user a yes/no question and returns their answer.
 33func (p *TerminalPrompter) Confirm(message string) (bool, error) {
 34  if _, err := fmt.Fprintf(p.writer, "%s [y/N] ", message); err != nil {
 35    return false, err
 36  }
 37
 38  scanner := bufio.NewScanner(p.reader)
 39  if !scanner.Scan() {
 40    if err := scanner.Err(); err != nil {
 41      return false, err
 42    }
 43    return false, nil // EOF
 44  }
 45
 46  answer := strings.TrimSpace(strings.ToLower(scanner.Text()))
 47  return answer == "y" || answer == "yes", nil
 48}
 49
 50// IsTerminal returns true if stdin appears to be a terminal.
 151func IsTerminal() bool {
 152  fi, err := os.Stdin.Stat()
 053  if err != nil {
 054    return false
 055  }
 156  return fi.Mode()&os.ModeCharDevice != 0
 57}