Class: Inquirex::Tools::Changelogs

Inherits:
Object
  • Object
show all
Defined in:
lib/inquirex/tools/changelogs.rb

Overview

Regenerates CHANGELOG.md across the ecosystem from merged GitHub PRs.

The generated files are disposable. inquirex/INQUIREX_VERSION_LOG.md is not, and is never touched here — a PR title records what merged, not what it means or what a consumer must do about it.

Constant Summary collapse

DEFAULT_RUBY =

The gem is not installed for every Ruby the repos pin (inquirex pins 4.0.5), so the generator runs under one that has it rather than being installed into each.

"4.0.6"
PROTECTED =

Never overwritten by generation, in any repo.

%w[INQUIREX_VERSION_LOG.md].freeze
DEFAULT_TOKEN_READER =

Reads a GitHub token from the gh session rather than a stored secret, so nothing here handles a credential in plain text.

-> { `gh auth token 2>/dev/null`.strip }
DEFAULT_RUNNER =

Runs the generator in one repository, discarding its very chatty output.

lambda { |dir, env|
  system(env, "github_changelog_generator", chdir: dir, out: File::NULL, err: File::NULL)
}

Instance Method Summary collapse

Constructor Details

#initialize(workspace: Workspace.new, out: $stdout, token_reader: DEFAULT_TOKEN_READER, runner: DEFAULT_RUNNER) ⇒ Changelogs

Returns a new instance of Changelogs.

Parameters:

  • workspace (Workspace) (defaults to: Workspace.new)
  • out (IO) (defaults to: $stdout)
  • token_reader (#call) (defaults to: DEFAULT_TOKEN_READER)

    returns a GitHub token, or "" when there is no session. Injected so a spec never needs one.

  • runner (#call) (defaults to: DEFAULT_RUNNER)

    invoked with (dir, env) to run the generator. Injected so a spec never shells out to it.



36
37
38
39
40
41
42
43
44
# File 'lib/inquirex/tools/changelogs.rb', line 36

def initialize(workspace: Workspace.new,
  out: $stdout,
  token_reader: DEFAULT_TOKEN_READER,
  runner: DEFAULT_RUNNER)
  @workspace = workspace
  @out = out
  @token_reader = token_reader
  @runner = runner
end

Instance Method Details

#generate(*names) ⇒ Boolean

Runs the generator in each repository.

The token comes from gh auth token rather than a stored secret, so nothing here handles a credential in plain text and there is none to leak from the source.

Parameters:

  • names (Array<String>)

    repositories, or all configured when empty

Returns:

  • (Boolean)

    true when every repository succeeded



61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/inquirex/tools/changelogs.rb', line 61

def generate(*names)
  token = @token_reader.call.to_s.strip
  if token.empty?
    @out.puts "ERROR: `gh auth token` returned nothing — run `gh auth login`"
    return false
  end

  targets = names.flatten.compact
  targets = repositories if targets.empty?
  failed = targets.reject { |name| generate_one(name, token) }

  report_failures(failed)
  failed.empty?
end

#repositoriesArray<String>

Returns every repo carrying a generator config.

Returns:

  • (Array<String>)

    every repo carrying a generator config



47
48
49
50
51
# File 'lib/inquirex/tools/changelogs.rb', line 47

def repositories
  (Workspace::LOCKSTEP.keys + Workspace::CHANGELOG_ONLY).uniq.select do |name|
    File.exist?(File.join(@workspace.root, name, ".github_changelog_generator"))
  end
end