Update for Ruby 3, modernize RSpec setup

Also updated my gem-signing cert.
40 files changed, 67 insertions(+), 61 deletions(-)

M .hgignore
M .ruby-version
M certs/ged.pem
M spec/helpers.rb
M spec/inversion/mixins_spec.rb
M spec/inversion/monkeypatches_spec.rb
M spec/inversion/parser_spec.rb
M spec/inversion/renderstate_spec.rb
M spec/inversion/sinatra_spec.rb
M spec/inversion/template/attrtag_spec.rb
M spec/inversion/template/begintag_spec.rb
M spec/inversion/template/calltag_spec.rb
M spec/inversion/template/codetag_spec.rb
M spec/inversion/template/commenttag_spec.rb
M spec/inversion/template/configtag_spec.rb
M spec/inversion/template/containertag_spec.rb
M spec/inversion/template/defaulttag_spec.rb
M spec/inversion/template/elsetag_spec.rb
M spec/inversion/template/elsiftag_spec.rb
M spec/inversion/template/endtag_spec.rb
M spec/inversion/template/escapetag_spec.rb
M spec/inversion/template/fortag_spec.rb
M spec/inversion/template/fragmenttag_spec.rb
M spec/inversion/template/iftag_spec.rb
M spec/inversion/template/importtag_spec.rb
M spec/inversion/template/includetag_spec.rb
M spec/inversion/template/node_spec.rb
M spec/inversion/template/pptag_spec.rb
M spec/inversion/template/publishtag_spec.rb
M spec/inversion/template/rescuetag_spec.rb
M spec/inversion/template/subscribetag_spec.rb
M spec/inversion/template/tag_spec.rb
M spec/inversion/template/textnode_spec.rb
M spec/inversion/template/timedeltatag_spec.rb
M spec/inversion/template/unlesstag_spec.rb
M spec/inversion/template/uriencodetag_spec.rb
M spec/inversion/template/yieldtag_spec.rb
M spec/inversion/template_spec.rb
M spec/inversion/tilt_spec.rb
M spec/inversion_spec.rb
M .hgignore +1 -0
@@ 8,3 8,4 @@ 
 ^pkg/
 \.lock$
 spec/\.state$
+^spec/\.status$

          
M .ruby-version +1 -1
@@ 1,1 1,1 @@ 
-2.7
+3.0

          
M certs/ged.pem +14 -15
@@ 1,7 1,7 @@ 
 -----BEGIN CERTIFICATE-----
-MIIENDCCApygAwIBAgIBATANBgkqhkiG9w0BAQsFADAiMSAwHgYDVQQDDBdnZWQv
-REM9RmFlcmllTVVEL0RDPW9yZzAeFw0xOTEwMDkwMDM2NTdaFw0yMDEwMDgwMDM2
-NTdaMCIxIDAeBgNVBAMMF2dlZC9EQz1GYWVyaWVNVUQvREM9b3JnMIIBojANBgkq
+MIID+DCCAmCgAwIBAgIBAzANBgkqhkiG9w0BAQsFADAiMSAwHgYDVQQDDBdnZWQv
+REM9RmFlcmllTVVEL0RDPW9yZzAeFw0yMDEyMjQyMDU1MjlaFw0yMTEyMjQyMDU1
+MjlaMCIxIDAeBgNVBAMMF2dlZC9EQz1GYWVyaWVNVUQvREM9b3JnMIIBojANBgkq
 hkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAvyVhkRzvlEs0fe7145BYLfN6njX9ih5H
 L60U0p0euIurpv84op9CNKF9tx+1WKwyQvQP7qFGuZxkSUuWcP/sFhDXL1lWUuIl
 M4uHbGCRmOshDrF4dgnBeOvkHr1fIhPlJm5FO+Vew8tSQmlDsosxLUx+VB7DrVFO

          
@@ 10,16 10,15 @@ Sl6phTvgBrG8GExHbNZpLARd3xrBYLEFsX7RvBn2
 vQ66lts4alKC69TE5cuKasWBm+16A4aEe3XdZBRNmtOu/g81gvwA7fkJHKllJuaI
 dXzdHqq+zbGZVSQ7pRYHYomD0IiDe1DbIouFnPWmagaBnGHwXkDT2bKKP+s2v21m
 ozilJg4aar2okb/RA6VS87o+d7g6LpDDMMQjH4G9OPnJENLdhu8KnPw/ivSVvQw7
-N2I4L/ZOIe2DIVuYH7aLHfjZDQv/mNgpAgMBAAGjdTBzMAkGA1UdEwQCMAAwCwYD
-VR0PBAQDAgSwMB0GA1UdDgQWBBRyjf55EbrHagiRLqt5YAd3yb8k4DAcBgNVHREE
-FTATgRFnZWRARmFlcmllTVVELm9yZzAcBgNVHRIEFTATgRFnZWRARmFlcmllTVVE
-Lm9yZzANBgkqhkiG9w0BAQsFAAOCAYEAFqsr6o0SvQRgjQVmhbQvExRnCMCoW1yb
-FJiN7A5RA2Iy2E61OG1Ul5nGmaDmx/PNB/6JIbIV3B9Uq8aTZx4uOjK7r8vMl1/t
-ZfY7r6HejJfXlcO2m6JDMbpdyEVv916LncBkzZRz6vnnNCx+31f15FKddxujpAFd
-qpn3JRQY+oj7ZkoccL/IUiDpxQWeS3oOoz9qr2kVTp8R50InZimt79FqCl/1m66W
-kdOuf+wM3DDx7Rt4IVNHrhGlyfMr7xjKW1Q3gll+pMN1DT6Ajx/t3JDSEg7BnnEW
-r7AciSO6J4ApUdqyG+coLFlGdtgFTgRHv7ihbQtDI7Z/LV7A4Spn1j2PK3j0Omri
-kSl1hPVigRytfgdVGiLXzvkkrkgj9EknCaj5UHbac7XvVBrljXj9hsnnqTANaKsg
-jBZSA+N+xUTgUWpXjjwsLZjzJkhWATJWq+krNXcqpwXo6HsjmdUxoFMt63RBb+sI
-XrxOxp8o0uOkU7FdLSGsyqJ2LzsR4obN
+N2I4L/ZOIe2DIVuYH7aLHfjZDQv/mNgpAgMBAAGjOTA3MAkGA1UdEwQCMAAwCwYD
+VR0PBAQDAgSwMB0GA1UdDgQWBBRyjf55EbrHagiRLqt5YAd3yb8k4DANBgkqhkiG
+9w0BAQsFAAOCAYEAMYegZanJi8zq7QKPT7wqXefX4C88I5JWeBHR3PvvWK0CwyMV
+peyiu5I13w/lYX+HUZjE4qsSpJMJFXWl4WZCOo+AMprOcf0PxfuJpxCej5D4tavf
+vRfhahSw7XJrcZih/3J+/UgoH7R05MJ+8LTcy3HGrB3a0vTafjm8OY7Xpa0LJDoN
+JDqxK321VIHyTibbKeA1hWSE6ljlQDvFbTqiCj3Ulp1jTv3TOlvRl8fqcfhxUJI0
++5Q82jJODjEN+GaWs0V+NlrbU94cXwS2PH5dXogftB5YYA5Ex8A0ikZ73xns4Hdo
+XxdLdd92F5ovxA23j/rKe/IDwqr6FpDkU3nPXH/Qp0TVGv9zZnVJc/Z6ChkuWj8z
+pW7JAyyiiHZgKKDReDrA2LA7Zs3o/7KA6UtUH0FHf8LYhcK+pfHk6RtjRe65ffw+
+MCh97sQ/Z/MOusb5+QddBmB+k8EicXyGNl4b5L4XpL7fIQu+Y96TB3JEJlShxFD9
+k9FjI4d9EP54gS/4
 -----END CERTIFICATE-----

          
M spec/helpers.rb +15 -9
@@ 37,19 37,25 @@ end
 
 
 ### Mock with RSpec
-RSpec.configure do |c|
+RSpec.configure do |config|
 
-	c.run_all_when_everything_filtered = true
-	c.filter_run :focus
-	c.order = 'random'
-	c.mock_with( :rspec ) do |mock|
+	config.mock_with( :rspec ) do |mock|
 		mock.syntax = :expect
 	end
-	c.wait_timeout = 3
-	c.example_status_persistence_file_path = 'spec/.state'
 
-	c.include( Inversion::SpecHelpers )
-	c.include( Loggability::SpecHelpers )
+	config.disable_monkey_patching!
+	config.example_status_persistence_file_path = "spec/.status"
+	config.filter_run :focus
+	config.filter_run_when_matching :focus
+	config.order = :random
+	config.profile_examples = 5
+	config.run_all_when_everything_filtered = true
+	config.shared_context_metadata_behavior = :apply_to_host_groups
+	config.wait_timeout = 3
+	# config.warnings = true
+
+	config.include( Inversion::SpecHelpers )
+	config.include( Loggability::SpecHelpers )
 end
 
 # vim: set nosta noet ts=4 sw=4:

          
M spec/inversion/mixins_spec.rb +1 -1
@@ 7,7 7,7 @@ require 'set'
 require 'inversion/mixins'
 
 
-describe Inversion, "mixins" do
+RSpec.describe Inversion, "mixins" do
 
 	describe Inversion::HashUtilities do
 		it "includes a function for stringifying Hash keys" do

          
M spec/inversion/monkeypatches_spec.rb +1 -1
@@ 8,7 8,7 @@ require 'ripper'
 require 'inversion/monkeypatches'
 
 
-describe Inversion, "monkeypatches" do
+RSpec.describe Inversion, "monkeypatches" do
 
 	describe Inversion::RipperAdditions do
 

          
M spec/inversion/parser_spec.rb +1 -1
@@ 5,7 5,7 @@ require_relative '../helpers'
 
 require 'inversion/parser'
 
-describe Inversion::Parser do
+RSpec.describe Inversion::Parser do
 
 	before( :all ) do
 		Inversion::Template::Tag.load_all

          
M spec/inversion/renderstate_spec.rb +1 -1
@@ 11,7 11,7 @@ require 'inversion/template/fragmenttag'
 require 'inversion/template/subscribetag'
 require 'inversion/template/publishtag'
 
-describe Inversion::RenderState do
+RSpec.describe Inversion::RenderState do
 
 
 	it "provides access to the block it was constructed with if there was one" do

          
M spec/inversion/sinatra_spec.rb +1 -1
@@ 13,7 13,7 @@ rescue LoadError => err
 	$sinatra_support = false
 end
 
-describe "Sinatra support", :if => $sinatra_support do
+RSpec.describe "Sinatra support", :if => $sinatra_support do
 	include Rack::Test::Methods if defined?( ::Rack )
 
 	before( :each ) do

          
M spec/inversion/template/attrtag_spec.rb +1 -1
@@ 5,7 5,7 @@ require_relative '../../helpers'
 
 require 'inversion/template/attrtag'
 
-describe Inversion::Template::AttrTag do
+RSpec.describe Inversion::Template::AttrTag do
 
 	describe "parsing" do
 

          
M spec/inversion/template/begintag_spec.rb +1 -1
@@ 11,7 11,7 @@ require 'inversion/template/rescuetag'
 require 'inversion/template/endtag'
 require 'inversion/renderstate'
 
-describe Inversion::Template::BeginTag do
+RSpec.describe Inversion::Template::BeginTag do
 
 
 	context "without any rescue clauses" do

          
M spec/inversion/template/calltag_spec.rb +1 -1
@@ 5,7 5,7 @@ require_relative '../../helpers'
 
 require 'inversion/template/calltag'
 
-describe Inversion::Template::CallTag do
+RSpec.describe Inversion::Template::CallTag do
 
 	# Since call is just an alias, the attrtag_spec already tests all of
 	# this.

          
M spec/inversion/template/codetag_spec.rb +1 -1
@@ 5,7 5,7 @@ require_relative '../../helpers'
 
 require 'inversion/template/codetag'
 
-describe Inversion::Template::CodeTag do
+RSpec.describe Inversion::Template::CodeTag do
 
 
 	it "is an abstract class" do

          
M spec/inversion/template/commenttag_spec.rb +1 -1
@@ 8,7 8,7 @@ require 'inversion/template/attrtag'
 require 'inversion/template/textnode'
 require 'inversion/renderstate'
 
-describe Inversion::Template::CommentTag do
+RSpec.describe Inversion::Template::CommentTag do
 
 	it "allows any free-form text in its body" do
 		# <?comment Disabled for now ?>...<?end?>

          
M spec/inversion/template/configtag_spec.rb +1 -1
@@ 5,7 5,7 @@ require_relative '../../helpers'
 
 require 'inversion/template/configtag'
 
-describe Inversion::Template::ConfigTag do
+RSpec.describe Inversion::Template::ConfigTag do
 
 	# <?config comment_start: /* ?>
 	# <?config comment_end: */ ?>

          
M spec/inversion/template/containertag_spec.rb +1 -1
@@ 5,7 5,7 @@ require_relative '../../helpers'
 
 require 'inversion/template/containertag'
 
-describe Inversion::Template::ContainerTag do
+RSpec.describe Inversion::Template::ContainerTag do
 
 	context "instances of including classes" do
 

          
M spec/inversion/template/defaulttag_spec.rb +1 -1
@@ 5,7 5,7 @@ require_relative '../../helpers'
 
 require 'inversion/template/defaulttag'
 
-describe Inversion::Template::DefaultTag do
+RSpec.describe Inversion::Template::DefaultTag do
 
 
 	it "sets a template attribute to a default value" do

          
M spec/inversion/template/elsetag_spec.rb +1 -1
@@ 10,7 10,7 @@ require 'inversion/template/commenttag'
 require 'inversion/template/fortag'
 require 'inversion/renderstate'
 
-describe Inversion::Template::ElseTag do
+RSpec.describe Inversion::Template::ElseTag do
 
 	it "handles a non-existant body" do
 		Inversion::Template::ElseTag.new( nil )

          
M spec/inversion/template/elsiftag_spec.rb +1 -1
@@ 9,7 9,7 @@ require 'inversion/template/unlesstag'
 require 'inversion/template/textnode'
 require 'inversion/renderstate'
 
-describe Inversion::Template::ElsifTag do
+RSpec.describe Inversion::Template::ElsifTag do
 
 
 	it "can be appended to an 'if' tag" do

          
M spec/inversion/template/endtag_spec.rb +1 -1
@@ 8,7 8,7 @@ require 'inversion/template/textnode'
 require 'inversion/template/endtag'
 require 'inversion/renderstate'
 
-describe Inversion::Template::EndTag do
+RSpec.describe Inversion::Template::EndTag do
 
 	before( :each ) do
 		@tag = Inversion::Template::EndTag.new

          
M spec/inversion/template/escapetag_spec.rb +1 -1
@@ 5,7 5,7 @@ require_relative '../../helpers'
 
 require 'inversion/template/escapetag'
 
-describe Inversion::Template::EscapeTag do
+RSpec.describe Inversion::Template::EscapeTag do
 
 	before( :each ) do
 		@attribute_object = double( "template attribute" )

          
M spec/inversion/template/fortag_spec.rb +1 -1
@@ 9,7 9,7 @@ require 'inversion/template/attrtag'
 require 'inversion/template/textnode'
 require 'inversion/renderstate'
 
-describe Inversion::Template::ForTag do
+RSpec.describe Inversion::Template::ForTag do
 
 	it "knows which identifiers should be added to the template" do
 		tag = Inversion::Template::ForTag.new( 'foo in bar' )

          
M spec/inversion/template/fragmenttag_spec.rb +1 -1
@@ 8,7 8,7 @@ require 'inversion/template/attrtag'
 require 'inversion/template/textnode'
 require 'inversion/renderstate'
 
-describe Inversion::Template::FragmentTag do
+RSpec.describe Inversion::Template::FragmentTag do
 
 	it "raises a parse error if the body isn't a simple attribute" do
 		expect {

          
M spec/inversion/template/iftag_spec.rb +1 -1
@@ 7,7 7,7 @@ require 'inversion/template/iftag'
 require 'inversion/template/textnode'
 require 'inversion/renderstate'
 
-describe Inversion::Template::IfTag do
+RSpec.describe Inversion::Template::IfTag do
 
 
 	it "renders its contents if its attribute is true" do

          
M spec/inversion/template/importtag_spec.rb +1 -1
@@ 5,7 5,7 @@ require_relative '../../helpers'
 
 require 'inversion/template/importtag'
 
-describe Inversion::Template::ImportTag do
+RSpec.describe Inversion::Template::ImportTag do
 
 	it "can import a single attribute" do
 		tag = Inversion::Template::ImportTag.new( 'txn ' )

          
M spec/inversion/template/includetag_spec.rb +1 -1
@@ 7,7 7,7 @@ require 'timeout'
 require 'inversion/template'
 require 'inversion/template/includetag'
 
-describe Inversion::Template::IncludeTag do
+RSpec.describe Inversion::Template::IncludeTag do
 
 	it "renders the IncludeTag as an empty string" do
 		included_path = Pathname.pwd + 'included.tmpl'

          
M spec/inversion/template/node_spec.rb +1 -1
@@ 5,7 5,7 @@ require_relative '../../helpers'
 
 require 'inversion/template/node'
 
-describe Inversion::Template::Node do
+RSpec.describe Inversion::Template::Node do
 
 	let( :concrete_subclass ) { Class.new(Inversion::Template::Node) }
 

          
M spec/inversion/template/pptag_spec.rb +1 -1
@@ 5,7 5,7 @@ require_relative '../../helpers'
 
 require 'inversion/template/pptag'
 
-describe Inversion::Template::PpTag do
+RSpec.describe Inversion::Template::PpTag do
 
 	before( :each ) do
 		@attribute_object = double( "template attribute" )

          
M spec/inversion/template/publishtag_spec.rb +1 -1
@@ 5,7 5,7 @@ require_relative '../../helpers'
 
 require 'inversion/template/publishtag'
 
-describe Inversion::Template::PublishTag do
+RSpec.describe Inversion::Template::PublishTag do
 
 	class TestSubscriber
 		def initialize

          
M spec/inversion/template/rescuetag_spec.rb +1 -1
@@ 9,7 9,7 @@ require 'inversion/template/commenttag'
 require 'inversion/template/fortag'
 require 'inversion/renderstate'
 
-describe Inversion::Template::RescueTag do
+RSpec.describe Inversion::Template::RescueTag do
 
 	it "handles a non-existant body" do
 		tag = Inversion::Template::RescueTag.new( nil )

          
M spec/inversion/template/subscribetag_spec.rb +1 -1
@@ 7,7 7,7 @@ require 'inversion/template'
 require 'inversion/template/textnode'
 require 'inversion/template/subscribetag'
 
-describe Inversion::Template::SubscribeTag do
+RSpec.describe Inversion::Template::SubscribeTag do
 
 
 	it "raises a parse error if the key isn't a simple attribute" do

          
M spec/inversion/template/tag_spec.rb +1 -1
@@ 5,7 5,7 @@ require_relative '../../helpers'
 
 require 'inversion/template/tag'
 
-describe Inversion::Template::Tag do
+RSpec.describe Inversion::Template::Tag do
 
 	before( :all ) do
 		@real_derivatives = Inversion::Template::Tag.derivatives.dup

          
M spec/inversion/template/textnode_spec.rb +1 -1
@@ 5,7 5,7 @@ require_relative '../../helpers'
 
 require 'inversion/template/textnode'
 
-describe Inversion::Template::TextNode do
+RSpec.describe Inversion::Template::TextNode do
 
 	before( :each ) do
 		@state = Inversion::RenderState.new

          
M spec/inversion/template/timedeltatag_spec.rb +1 -1
@@ 5,7 5,7 @@ require_relative '../../helpers'
 
 require 'inversion/template/timedeltatag'
 
-describe Inversion::Template::TimeDeltaTag do
+RSpec.describe Inversion::Template::TimeDeltaTag do
 
 	MINUTES = 60
 	HOURS   = 60  * MINUTES

          
M spec/inversion/template/unlesstag_spec.rb +1 -1
@@ 7,7 7,7 @@ require 'inversion/template/unlesstag'
 require 'inversion/template/textnode'
 require 'inversion/renderstate'
 
-describe Inversion::Template::UnlessTag do
+RSpec.describe Inversion::Template::UnlessTag do
 
 
 	it "renders its contents if its attribute is false" do

          
M spec/inversion/template/uriencodetag_spec.rb +1 -1
@@ 5,7 5,7 @@ require_relative '../../helpers'
 
 require 'inversion/template/uriencodetag'
 
-describe Inversion::Template::UriencodeTag do
+RSpec.describe Inversion::Template::UriencodeTag do
 
 	before( :each ) do
 		@attribute_object = double( "template attribute" )

          
M spec/inversion/template/yieldtag_spec.rb +1 -1
@@ 5,7 5,7 @@ require_relative '../../helpers'
 
 require 'inversion/template/yieldtag'
 
-describe Inversion::Template::YieldTag do
+RSpec.describe Inversion::Template::YieldTag do
 
 
 	it "calls the renderstate's block before rendering, and renders as its return value" do

          
M spec/inversion/template_spec.rb +1 -1
@@ 7,7 7,7 @@ require 'stringio'
 
 require 'inversion/template'
 
-describe Inversion::Template do
+RSpec.describe Inversion::Template do
 
 	before( :all ) do
 		@default_template_path = Inversion::Template.template_paths

          
M spec/inversion/tilt_spec.rb +1 -1
@@ 12,7 12,7 @@ rescue LoadError => err
 	$tilt_support = false
 end
 
-describe "Tilt support", :if => $tilt_support do
+RSpec.describe "Tilt support", :if => $tilt_support do
 
 	before( :all ) do
 		setup_logging( :fatal )

          
M spec/inversion_spec.rb +1 -1
@@ 5,7 5,7 @@ require_relative 'helpers'
 
 require 'inversion'
 
-describe Inversion do
+RSpec.describe Inversion do
 
 	it "defines a version" do
 		expect( described_class::VERSION ).to match( /^\d+(\.\d+)*$/ )