Details
-
Bug
-
Status: Resolved
-
Normal
-
Resolution: Fixed
-
PUP 7.0.0
-
None
-
Coremunity
-
Platform Core KANBAN
-
Bug Fix
-
The puppet gem now depends on scanf which is necessary when running on ruby 2.7. This makes it possible to run module tests against the puppet gem on ruby 2.7.
-
Needs Assessment
Description
Ruby 2.7 removed the scanf implementation (in Kernel, IO and String) from core ruby to a separate gem. Puppet's scanf function depends on that ruby method, but only expresses the scanf runtime dependency in its Gemfile, but not in the gem that is pushed to rubygems. See https://rubygems.org/gems/puppet/versions/7.0.0.
As a result, if a module calls the puppet scanf function using puppet 7 (gem) and ruby 2.7, such as when running rspec tests, then you'll see (for example in https://github.com/puppetlabs/puppetlabs-puppetdb/pull/317)
LoadError:
|
cannot load such file -- scanf
|
This doesn't affect module functionality when testing or running against puppet-agent 7 packages, because the scanf gem is included.
AFAIK rubygems doesn't have a way to express conditional runtime dependencies (i.e. only add this dependency when running on ruby 2.7 and up). So the best thing may be to always add the runtime dependency for the puppet 7.x collection? If you're running the puppet 7 gem with ruby 2.5.0, then things will still work (the scanf gem is ignored).
$ rbenv shell 2.5.8
|
$ gem install scanf --no-document
|
Fetching: scanf-1.0.0.gem (100%)
|
Successfully installed scanf-1.0.0
|
1 gem installed
|
$ irb
|
irb(main):001:0> require 'scanf'
|
=> true
|
irb(main):002:0> $LOADED_FEATURES.grep /scanf/
|
=> ["/usr/local/Cellar/rbenv/1.1.2/versions/2.5.8/lib/ruby/2.5.0/scanf.rb"]
|