resources/asciidoctor/spec/spec_helper.rb (65 lines of code) (raw):
# frozen_string_literal: true
RSpec.configure do |config|
# Enable flags like --only-failures and --next-failure
config.example_status_persistence_file_path = '.rspec_status'
# Disable RSpec exposing methods globally on `Module` and `main`
config.disable_monkey_patching!
config.expect_with :rspec do |c|
c.syntax = :expect
end
end
# Put asciidoctor into verbose mode so it'll log reference errors
$VERBOSE = true
##
# Used by the `convert with logs` and `convert without logs` contexts
def internal_convert(
input, convert_logger, standalone, extra_attributes
)
attributes = { 'docdir' => File.dirname(__FILE__) }
attributes.merge! extra_attributes
args = internal_convert_args convert_logger, standalone, attributes
Asciidoctor.convert input, args
end
def internal_convert_args(convert_logger, standalone, attributes)
{
safe: :unsafe, # Used to include "funny" files.
logger: convert_logger,
standalone: standalone,
doctype: :book,
attributes: attributes,
sourcemap: true, # Required by many of our plugins
}
end
##
# Converts asciidoc to docbook and sets logs to `logs`
#
# In:
# input - asciidoc text to convert
# extra_attributes - attributes added to the conversion - defaults to {}
#
# Out:
# converted - converted docbook text
# logs - lines logged
RSpec.shared_context 'convert with logs' do
let(:convert_logger) { Asciidoctor::MemoryLogger.new }
let(:converted) do
# Using let! here would stop us from having to explicitly evaluate
# `converted` in the let for `logs` but it'd cause `converted` to be
# evaluated before `before(:example)` blocks
extra_attributes = defined?(convert_attributes) ? convert_attributes : {}
explicit_standalone = defined?(standalone) ? standalone : false
internal_convert(
input,
convert_logger,
explicit_standalone,
extra_attributes
)
end
let(:logs) do
# Evaluate converted because it populates the logger as a side effect.
converted
# Now render the logs.
convert_logger.messages
.map { |l| "#{l[:severity]}: #{l[:message].inspect}" }
.join("\n")
end
end
##
# Converts asciidoc to docbook, asserting that nothing is logged during the
# conversion.
#
# In:
# input - asciidoc text to convert
# extra_attributes - attributes added to the conversion - defaults to {}
#
# Out:
# converted - converted docbook text
RSpec.shared_context 'convert without logs' do
let(:converted) do
convert_logger = Asciidoctor::MemoryLogger.new
extra_attributes = defined?(convert_attributes) ? convert_attributes : {}
explicit_standalone = defined?(standalone) ? standalone : false
converted = internal_convert(
input,
convert_logger,
explicit_standalone,
extra_attributes
)
if convert_logger.messages.empty? == false
raise "Expected no logs but got:\n" +
convert_logger.messages
.map { |l| "#{l[:severity]}: #{l[:message].inspect}" }
.join("\n")
end
converted
end
end