require "rubygems" begin require "rspec" rescue LoadError require "spec" end begin require 'bundler' Bundler.setup rescue LoadError end begin require 'simplecov' SimpleCov.start # TODO: hide some rb files from cov report # hide = '_spec\.rb$,spec_helper\.rb$,ruby_lex\.rb$,autoload\.rb$' # if YARD::Parser::SourceParser.parser_type == :ruby # hide += ',legacy\/.+_handler' # else # hide += ',ruby_parser\.rb$,ast_node\.rb$,handlers\/ruby\/[^\/]+\.rb$' # end rescue LoadError end if ENV['COVERAGE'] require File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib', 'yard')) unless defined?(HAVE_RIPPER) begin require 'ripper'; rescue LoadError; end HAVE_RIPPER = defined?(::Ripper) && !ENV['LEGACY'] ? true : false LEGACY_PARSER = !HAVE_RIPPER class YARD::Parser::SourceParser def self.parser_type; :ruby18 end end if ENV['LEGACY'] end 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('::', '/') $".find_all {|p| p.include? underscore }.each do |filename| next unless File.exist? filename YARD::Parser::SourceParser.new.parse(filename) 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('::', '/') $".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} }") hash.keys.first.should == 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("
\n") args.first end def puts(str = '') STDOUT.puts str + "
\n" str end end if ENV['TM_APP_PATH'] RSpec.configure do |config| config.before(:each) { log.io = StringIO.new } end include YARD