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
|
$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
require 'yard'
require 'yard/mruby'
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("<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 }
end
Registry = YARD::Registry
|