1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206
|
# frozen_string_literal: true
require "rubygems"
begin
require "rspec"
rescue LoadError
require "spec"
end
require 'yard'
unless defined?(HAVE_RIPPER)
begin require 'ripper'; rescue LoadError; nil end
HAVE_RIPPER = defined?(::Ripper) && !ENV['LEGACY'] ? true : false
LEGACY_PARSER = !HAVE_RIPPER
class YARD::Parser::SourceParser
def self.parser_type; @parser_type == :ruby ? :ruby18 : @parser_type end
end if ENV['LEGACY']
end
begin
require 'coveralls'
Coveralls.wear!
end if ENV['CI'] && HAVE_RIPPER
NAMED_OPTIONAL_ARGUMENTS = RUBY_VERSION >= '2.1.0'
def parse_file(file, thisfile = __FILE__, log_level = log.level, ext = '.rb.txt')
Registry.clear
path = File.join(File.dirname(thisfile), 'examples', file.to_s + ext)
YARD::Parser::SourceParser.parse(path, [], log_level)
end
def described_in_docs(klass, meth, file = nil)
YARD::Tags::Library.define_tag "RSpec Specification", :it, :with_raw_title_and_text
# Parse the file (could be multiple files)
if file
filename = File.join(YARD::ROOT, file)
YARD::Parser::SourceParser.new.parse(filename)
else
underscore = klass.class_name.gsub(/([a-z])([A-Z])/, '\1_\2').downcase.gsub('::', '/')
$LOADED_FEATURES.find_all {|p| p.include? underscore }.each do |found_fname|
next unless File.exist? found_fname
YARD::Parser::SourceParser.new.parse(found_fname)
end
end
# Get the object
objname = klass.name + (meth[0, 1] == '#' ? meth : '::' + meth)
obj = Registry.at(objname)
raise "Cannot find object #{objname} described by spec." unless obj
raise "#{obj.path} has no @it tags to spec." unless obj.has_tag? :it
# Run examples
describe(klass, meth) do
obj.tags(:it).each do |it|
path = File.relative_path(YARD::ROOT, obj.file)
it(it.name + " (from #{path}:#{obj.line})") do
begin
eval(it.text)
rescue => e
e.set_backtrace(["#{path}:#{obj.line}:in @it tag specification"])
raise e
end
end
end
end
end
def docspec(objname = self.class.description, klass = self.class.described_type)
# Parse the file (could be multiple files)
underscore = klass.class_name.gsub(/([a-z])([A-Z])/, '\1_\2').downcase.gsub('::', '/')
$LOADED_FEATURES.find_all {|p| p.include? underscore }.each do |filename|
filename = File.join(YARD::ROOT, filename)
next unless File.exist? filename
YARD::Parser::SourceParser.new.parse(filename)
end
# Get the object
objname = klass.name + objname if objname =~ /^[^A-Z]/
obj = Registry.at(objname)
raise "Cannot find object #{objname} described by spec." unless obj
raise "#{obj.path} has no @example tags to spec." unless obj.has_tag? :example
# Run examples
obj.tags(:example).each do |exs|
exs.text.split(/\n/).each do |ex|
begin
hash = eval("{ #{ex} }")
expect(hash.keys.first).to eq hash.values.first
rescue => e
raise e, "#{e.message}\nInvalid spec example in #{objname}:\n\n\t#{ex}\n"
end
end
end
end
module Kernel
require 'cgi'
def p(*args)
puts args.map {|arg| CGI.escapeHTML(arg.inspect) }.join("<br/>\n")
args.first
end
def puts(str = '')
STDOUT.puts str + "<br/>\n"
str
end
end if ENV['TM_APP_PATH']
RSpec.configure do |config|
config.before(:each) { log.io = StringIO.new }
# isolate environment of each test
# any other global settings which might be modified by a test should also
# be saved and restored here
config.around(:each) do |example|
saved_level = log.level
example.run
log.level = saved_level
end
# rspec-expectations config goes here. You can use an alternate
# assertion/expectation library such as wrong or the stdlib/minitest
# assertions if you prefer.
config.expect_with :rspec do |expectations|
# This option will default to `true` in RSpec 4. It makes the `description`
# and `failure_message` of custom matchers include text for helper methods
# defined using `chain`, e.g.:
# be_bigger_than(2).and_smaller_than(4).description
# # => "be bigger than 2 and smaller than 4"
# ...rather than:
# # => "be bigger than 2"
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
end
# rspec-mocks config goes here. You can use an alternate test double
# library (such as bogus or mocha) by changing the `mock_with` option here.
config.mock_with :rspec do |mocks|
# Prevents you from mocking or stubbing a method that does not exist on
# a real object. This is generally recommended, and will default to
# `true` in RSpec 4.
# mocks.verify_partial_doubles = true # FIXME: Not yet working
end
# This option will default to `:apply_to_host_groups` in RSpec 4 (and will
# have no way to turn it off -- the option exists only for backwards
# compatibility in RSpec 3). It causes shared context metadata to be
# inherited by the metadata hash of host groups and examples, rather than
# triggering implicit auto-inclusion in groups with matching metadata.
config.shared_context_metadata_behavior = :apply_to_host_groups
# This allows you to limit a spec run to individual examples or groups
# you care about by tagging them with `:focus` metadata. When nothing
# is tagged with `:focus`, all examples get run. RSpec also provides
# aliases for `it`, `describe`, and `context` that include `:focus`
# metadata: `fit`, `fdescribe` and `fcontext`, respectively.
config.filter_run_when_matching :focus
# Allows RSpec to persist some state between runs in order to support
# the `--only-failures` and `--next-failure` CLI options. We recommend
# you configure your source control system to ignore this file.
config.example_status_persistence_file_path = "debian/examples.txt"
# Limits the available syntax to the non-monkey patched syntax that is
# recommended. For more details, see:
# - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/
# - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
# - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode
config.disable_monkey_patching!
# This setting enables warnings. It's recommended, but in some cases may
# be too noisy due to issues in dependencies.
config.warnings = false
# Many RSpec users commonly either run the entire suite or an individual
# file, and it's useful to allow more verbose output when running an
# individual spec file.
if config.files_to_run.one?
# Use the documentation formatter for detailed output,
# unless a formatter has already been configured
# (e.g. via a command-line flag).
config.default_formatter = 'doc'
end
# Print the N slowest examples and example groups at the
# end of the spec run, to help surface which specs are running
# particularly slow.
config.profile_examples = 5
# Run specs in random order to surface order dependencies. If you find an
# order dependency and want to debug it, you can fix the order by providing
# the seed, which is printed after each run.
# --seed 1234
# config.order = :random # FIXME: Not yet working
# Seed global randomization in this process using the `--seed` CLI option.
# Setting this allows you to use `--seed` to deterministically reproduce
# test failures related to randomization by passing the same `--seed` value
# as the one that triggered the failure.
Kernel.srand config.seed
end
include YARD
|