Modernize CI to OpenVox 8 / Ruby 3.2+4.0 and drop legacy Windows support - #136
Conversation
Replace the Puppet 6/7 CI matrix with OpenVox 8 on Ruby 3.2 and Ruby 4.0. This required replacing the Gemfile's per-Ruby-minor-version PDK meta-gems (which don't exist for Ruby 4.0, and were the root cause of the earlier patron/libcurl CI failures) with voxpupuli-test and an explicit openvox dependency, matching the pattern used by pupmod-simp-useradd and pupmod-voxpupuli-kmod. Rakefile, .rubocop.yml, and spec/spec_helper.rb are updated accordingly: - Rakefile now loads tasks via voxpupuli/test/rake - .rubocop.yml inherits voxpupuli-test's shared config instead of the frozen PDK-era cop list; the newer rubocop/rubocop-rspec versions surface ~70 pre-existing style offenses across vendored/spec code, grandfathered via a generated .rubocop_todo.yml rather than risk autocorrecting the vendored inifile.rb - spec_helper.rb shims PuppetlabsSpec::Fixtures#my_fixture (dropped by the new toolchain) and fixes a YAML.safe_load call broken by modern Psych's keyword-arg signature Also drop support for Windows 10, Server 2012, and Server 2012 R2, and add support for Windows Server 2025 (metadata.json, new win2025.yml nodeset). This is a breaking change, so bump to 2.0.0. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Applies safe and verified-safe autocorrections (whitespace, redundant syntax, string interpolation, RSpec equivalences like eq(false) -> be(false) and .exactly(1).times -> .once), each checked for behavioral equivalence and confirmed via the full test suite (69 examples, 0 failures, 2 pendings, unchanged throughout). A few offenses were deliberately kept as documented exceptions in .rubocop.yml rather than "fixed", because the fix would have been riskier than the offense: - has_section? in the vendored inifile.rb (Naming/PredicatePrefix) is unused internally but is synced/vendored public API - the character-escaping case/when in the same file (Style/HashLikeCase) - RSpec/MultipleMemoizedHelpers and the top-level `include` in spec_helper.rb (Style/MixinUsage) are legitimate existing conventions - two diagnostic puts/ap lines in a real (non-pending) spec, restored after autocorrect deleted them Also: replaced the leaky top-level provider_class local variable with RSpec's described_class idiom, removed a no-op empty after(:suite) block, and gave both pending `xit` tests real reasons instead of RSpec's generic default message -- verified empirically why each is skipped rather than guessing. Found but did not fix: IniFile#taint/#tainted? call Object#taint, which was removed entirely in Ruby 3.2 (our new target version). Dead code today -- nothing in this module calls .dup/.clone/.taint on an IniFile -- but will raise NoMethodError if ever exercised. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Review: Modernize CI to OpenVox 8 / Ruby 3.2+4.0 and drop legacy Windows supportOverviewSolid, well-scoped modernization. It swaps the Puppet 6/7 CI matrix (with its fragile per-Ruby-minor PDK meta-gems and the libcurl/patron workaround) for OpenVox 8 on Ruby 3.2 + 4.0 via Correctness — verified behavior-preserving
Issues / risks
Minor / non-blocking
Test coverageGood. The two VerdictApprove with minor changes. No correctness regressions found. Before merge I'd (1) fix the PR description's 🤖 Generated with Claude Code |
Per review feedback: confirm and record that this was intentional, not an accidental omission. That rake task no longer exists under the voxpupuli-test toolchain, unlike the other check: tasks kept alongside it. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Per review feedback on PR ayohrling#136: - my_fixture_dir raised a confusing NoMethodError on nil if ever called from a non-*_spec.rb frame. Now raises a clear error instead. Verified this doesn't affect the two files that actually use it. - Bumped actions/checkout@v2 -> @v4 in both CI jobs (flagged as minor polish; retires a Node 16 deprecation warning while touching CI anyway). Also verified and can confirm: `rake metadata_lint` passes cleanly with the openvox requirement name -- metadata-json-lint doesn't restrict requirements[].name to an allowlist, so the puppet -> openvox rename isn't a validation concern. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Replace the Puppet 6/7 CI matrix with OpenVox 8 on Ruby 3.2 and Ruby 4.0. This required replacing the Gemfile's per-Ruby-minor-version PDK meta-gems
(which don't exist for Ruby 4.0, and were the root cause of the earlier patron/libcurl CI failures) with voxpupuli-test and an explicit openvox
dependency, matching the pattern used by pupmod-simp-useradd and pupmod-voxpupuli-kmod. Rakefile, .rubocop.yml, and spec/spec_helper.rb are updated
accordingly:
keyword-arg signature
modernized toolchain (confirmed via bundle exec rake --tasks); the remaining checks (check:git_ignore, check:dot_underscore, check:test_file) are
unaffected
Also drop support for Windows 10, Server 2012, and Server 2012 R2, and add support for Windows Server 2025 (metadata.json, new win2025.yml nodeset). This
is a breaking change, so bump to 2.0.0.
Rubocop offenses: the newer rubocop/rubocop-rspec versions pulled in by voxpupuli-test surfaced ~70 pre-existing style offenses across vendored/spec code
that the old frozen PDK-era config never caught. These were initially grandfathered via a generated .rubocop_todo.yml so CI would pass, then fixed
properly in a follow-up commit and the todo file removed entirely — the repo now has zero rubocop offenses with no grandfathering. Each autocorrection was
individually reviewed for behavioral equivalence and the full test suite (69 examples) was confirmed unchanged throughout. A handful of offenses were
deliberately kept as documented exceptions in .rubocop.yml rather than "fixed", because the fix would have been riskier than the offense — see the second
commit message for details (vendored inifile.rb internals, legitimate existing conventions, and diagnostic test output).
Found but not fixed: IniFile#taint/#tainted? in the vendored inifile.rb call Object#taint, which was removed entirely in Ruby 3.2 (our new target
version). This is dead code today — nothing in this module calls .dup/.clone/.taint on an IniFile — but it will raise NoMethodError if ever exercised.
Left as-is since fixing it means rewriting vendored logic, flagging here for a maintainer decision.