nandoc 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/README +5 -4
- data/Rakefile +1 -1
- data/bin/nandoc +2 -1
- data/doc/FAQ.md +3 -0
- data/doc/PROVISO.md +39 -0
- data/doc/commands/diff.md +49 -0
- data/doc/svg/less-fonts.svg +2 -2
- data/lib/nandoc/cli/README.md +6 -0
- data/lib/nandoc/cli/command-methods.rb +38 -0
- data/lib/nandoc/cli/option-methods/exclusive-options.rb +56 -0
- data/lib/nandoc/cli/option-methods/option-enum.rb +64 -0
- data/lib/nandoc/cli/option-methods.rb +35 -0
- data/lib/nandoc/cli.rb +3 -0
- data/lib/nandoc/commands/create-nandoc-site.rb +9 -12
- data/lib/nandoc/commands/diff.rb +14 -11
- data/lib/nandoc/commands.rb +9 -0
- data/lib/nandoc/{config.rb → core/config.rb} +18 -9
- data/lib/nandoc/core/project.rb +50 -0
- data/lib/nandoc/doc/hack-free-zone-defined.md +33 -0
- data/lib/nandoc/erb/agent.rb +5 -5
- data/lib/nandoc/{test/minitest-extlib.rb → extlib/minitest.rb} +1 -1
- data/lib/nandoc/filters/builtin-tags/fence/terminal.rb +24 -0
- data/lib/nandoc/filters/builtin-tags/fence-dispatcher.rb +43 -0
- data/lib/nandoc/filters/builtin-tags/fences.rb +4 -0
- data/lib/nandoc/filters/builtin-tags/see-test.rb +67 -0
- data/lib/nandoc/filters/builtin-tags.rb +11 -0
- data/lib/nandoc/filters/custom-tag.rb +43 -0
- data/lib/nandoc/filters/custom-tags.rb +19 -0
- data/lib/nandoc/filters/tag-parse-instance-methods.rb +11 -0
- data/lib/nandoc/filters/tag-parser.rb +206 -0
- data/lib/nandoc/filters.rb +11 -585
- data/lib/nandoc/{cri-hacks.rb → hacks/cri-hacks.rb} +4 -3
- data/lib/nandoc/{data-source.rb → hacks/data-source.rb} +5 -4
- data/lib/nandoc/{item-class-hacks.rb → hacks/item-class-hacks.rb} +3 -1
- data/lib/nandoc/hacks.rb +6 -0
- data/lib/nandoc/helpers/menu-bouncy.rb +1 -1
- data/lib/nandoc/helpers/site-map.rb +3 -0
- data/lib/nandoc/helpers.rb +1 -1
- data/lib/nandoc/html/tags.rb +65 -0
- data/lib/nandoc/html.rb +6 -0
- data/lib/nandoc/parse-readme.rb +4 -0
- data/lib/nandoc/spec-doc/agent-instance-methods.rb +24 -0
- data/lib/nandoc/spec-doc/code-snippet.rb +59 -0
- data/lib/nandoc/spec-doc/generic-agent.rb +40 -0
- data/lib/nandoc/spec-doc/mock-prompt.rb +3 -9
- data/lib/nandoc/spec-doc/parse-trace.rb +25 -0
- data/lib/nandoc/spec-doc/{mini-test/spec-instance-methods.rb → playback/html/foo-bar.rb} +0 -0
- data/lib/nandoc/spec-doc/playback/html.rb +2 -0
- data/lib/nandoc/spec-doc/playback/players/method.rb +64 -0
- data/lib/nandoc/spec-doc/playback/players/ruby.rb +158 -0
- data/lib/nandoc/spec-doc/playback/players/terminal.rb +93 -0
- data/lib/nandoc/spec-doc/playback/players.rb +4 -0
- data/lib/nandoc/spec-doc/playback/support/playback-methods.rb +44 -0
- data/lib/nandoc/spec-doc/playback/support/sexp-scanner.rb +61 -0
- data/lib/nandoc/spec-doc/playback/support.rb +3 -0
- data/lib/nandoc/spec-doc/playback/terminal/color-to-html.rb +100 -0
- data/lib/nandoc/spec-doc/playback.rb +3 -0
- data/lib/nandoc/spec-doc/recordings.rb +55 -0
- data/lib/nandoc/spec-doc/ruby2ruby-standin.rb +37 -0
- data/lib/nandoc/spec-doc/test-case-agent.rb +1 -1
- data/lib/nandoc/spec-doc/{mini-test.rb → test-framework/mini-test/proxy.rb} +9 -31
- data/lib/nandoc/spec-doc/{test-framework-proxy.rb → test-framework/proxy.rb} +27 -50
- data/lib/nandoc/spec-doc.rb +57 -13
- data/lib/nandoc/{test → support}/diff-to-string.rb +0 -0
- data/lib/nandoc/support/regexp-enhance.rb +6 -0
- data/lib/nandoc/support/regexp.rb +12 -0
- data/lib/nandoc/support/secret-parent.rb +21 -0
- data/lib/nandoc/support/shared-attr-reader.rb +32 -0
- data/lib/nandoc/support/site-merge.rb +1 -1
- data/lib/nandoc/support/site-methods.rb +4 -4
- data/lib/nandoc/support/stream-colorizer.rb +1 -1
- data/lib/nandoc/support/string-methods.rb +56 -0
- data/lib/nandoc.rb +12 -35
- data/proto/README.md +4 -2
- data/test/test.rb +1 -0
- metadata +58 -25
- data/doc/bar/baz.md +0 -4
- data/doc/bar/bliff.md +0 -8
- data/doc/foo.md +0 -5
- data/doc/getting-started.rb +0 -13
- data/lib/nandoc/spec-doc/support-modules.rb +0 -158
- data/lib/nandoc/spec-doc/test-framework-dispatcher.rb +0 -15
- data/lib/nandoc/support-modules.rb +0 -273
- data/lib/nandoc/treebis/NOGIT-DOCS/NEWS.md +0 -5
- data/lib/nandoc/treebis/NOGIT-README.md +0 -65
- data/lib/nandoc/treebis/nandoc.persistent.json +0 -3
@@ -0,0 +1,61 @@
|
|
1
|
+
module NanDoc::SpecDoc::Playback
|
2
|
+
class SexpScanner
|
3
|
+
def initialize sexp
|
4
|
+
@sexp = sexp
|
5
|
+
@offset = 0
|
6
|
+
@last = @sexp.size - 1
|
7
|
+
end
|
8
|
+
def chimp arr
|
9
|
+
arr.size == 1 ? arr.first : arr
|
10
|
+
end
|
11
|
+
def current
|
12
|
+
@sexp[@offset]
|
13
|
+
end
|
14
|
+
def eos?
|
15
|
+
@offset > @last
|
16
|
+
end
|
17
|
+
def rest
|
18
|
+
@sexp[@offset..-1]
|
19
|
+
end
|
20
|
+
attr_reader :sexp
|
21
|
+
def scan a, *b
|
22
|
+
current = self.current or return nil
|
23
|
+
search = [a,*b]
|
24
|
+
ret = nil
|
25
|
+
if current[0..search.size-1] == search
|
26
|
+
ret = current
|
27
|
+
@offset += 1
|
28
|
+
end
|
29
|
+
ret
|
30
|
+
end
|
31
|
+
def scan_assert a, *b
|
32
|
+
ret = scan(a, *b)
|
33
|
+
if ! ret
|
34
|
+
fail("expecting #{a.inspect} had #{current.inspect}")
|
35
|
+
end
|
36
|
+
ret
|
37
|
+
end
|
38
|
+
def skip_to_after a, *b
|
39
|
+
search = [a, *b]
|
40
|
+
last = search.size - 1
|
41
|
+
idx = @sexp.index{ |n| n[0..last] == search }
|
42
|
+
ret = false
|
43
|
+
if idx
|
44
|
+
@offset = idx + 1
|
45
|
+
ret = @offset
|
46
|
+
end
|
47
|
+
ret
|
48
|
+
end
|
49
|
+
def skip_to_after_assert a, *b
|
50
|
+
idx = skip_to_after(a, *b)
|
51
|
+
if ! idx
|
52
|
+
search = [a, *b]
|
53
|
+
last = search.size - 1
|
54
|
+
nn = @sexp.select{ |n| n[0..last] == search }
|
55
|
+
nn = nn.map{ |n| chimp(n[1..-1]).inspect }
|
56
|
+
fail("#{chimp(search).inspect} not found. had:(#{nn.join(', ')})")
|
57
|
+
end
|
58
|
+
idx
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
module NanDoc; end
|
2
|
+
module NanDoc::SpecDoc; end
|
3
|
+
module NanDoc::SpecDoc::Playback; end
|
4
|
+
class NanDoc::SpecDoc::Playback::Terminal; end
|
5
|
+
module NanDoc::SpecDoc::Playback::Terminal::ColorToHtml
|
6
|
+
|
7
|
+
|
8
|
+
include Nanoc3::Helpers::HTMLEscape
|
9
|
+
alias_method :h, :html_escape
|
10
|
+
|
11
|
+
|
12
|
+
# look for things that look like prompts and make them brighter
|
13
|
+
# @todo html escape vis-a-vis blah
|
14
|
+
def prompt_highlight str
|
15
|
+
lines = str.split("\n")
|
16
|
+
linez = lines.map do |line|
|
17
|
+
line.sub( %r!\A(~[^>]*>)?(.*)\Z! ) do
|
18
|
+
tags = [];
|
19
|
+
tags.push "<span class='prompt'>#{h($1)}</span>" if $1
|
20
|
+
tags.push "<span class='normal'>#{h($2)}</span>" unless $2.empty?
|
21
|
+
tags.join('')
|
22
|
+
end
|
23
|
+
end
|
24
|
+
html = linez.join("\n")
|
25
|
+
html
|
26
|
+
end
|
27
|
+
|
28
|
+
def prompt_highlight2 prompt, cmd
|
29
|
+
"<span class='prompt'>#{h(prompt)}</span>"<<
|
30
|
+
"<span class='normal'>#{h(cmd)}</span>\n"
|
31
|
+
end
|
32
|
+
|
33
|
+
# this sucks.
|
34
|
+
#
|
35
|
+
# the other side of these associations lives in trollop-subset.css
|
36
|
+
Code2CssClass = {
|
37
|
+
'1' => 'bright', '30' => 'black', '31' => 'red', '32' => 'green',
|
38
|
+
'33' => 'yellow', '34' => 'blue', '35' => 'magenta', '36' => 'cyan',
|
39
|
+
'37' => 'white'
|
40
|
+
}
|
41
|
+
def terminal_color_to_html str
|
42
|
+
return nil unless str.index("\e[") # save a whale
|
43
|
+
scn = StringScanner.new(str)
|
44
|
+
sexp = []
|
45
|
+
while true
|
46
|
+
foo = scn.scan(/(.*?)(?=\e\[)/m)
|
47
|
+
if ! foo
|
48
|
+
blork = scn.scan_until(/\Z/m) or fail("worglebezoik")
|
49
|
+
sexp.push([:content, blork]) unless blork.empty?
|
50
|
+
break;
|
51
|
+
end
|
52
|
+
foo or fail("oopfsh")
|
53
|
+
sexp.push([:content, foo]) unless foo.empty?
|
54
|
+
bar = scn.scan(/\e\[/) or fail("goff")
|
55
|
+
baz = scn.scan(/\d+(?:;\d+)*/)
|
56
|
+
baz or fail("narghh")
|
57
|
+
if '0'==baz
|
58
|
+
sexp.push([:pop])
|
59
|
+
else
|
60
|
+
sexp.push([:push, *baz.split(';')])
|
61
|
+
end
|
62
|
+
biff = scn.scan(/m/) or fail("noiflphh")
|
63
|
+
end
|
64
|
+
html = terminal_colorized_sexp_to_html sexp
|
65
|
+
html
|
66
|
+
end
|
67
|
+
private
|
68
|
+
def terminal_code_to_css_class code
|
69
|
+
Code2CssClass[code] or
|
70
|
+
fail("sorry, no known code for #{code.inspect}. "<<
|
71
|
+
"(maybe you should make one?)")
|
72
|
+
end
|
73
|
+
def terminal_colorized_sexp_to_html sexp
|
74
|
+
i = -1;
|
75
|
+
last = sexp.length - 1;
|
76
|
+
parts = []
|
77
|
+
catch(:done) do
|
78
|
+
while (i+=1) <= last
|
79
|
+
codes = nil
|
80
|
+
while i <= last && sexp[i].first == :push
|
81
|
+
codes ||= []
|
82
|
+
codes.concat sexp[i][1..-1]
|
83
|
+
i += 1
|
84
|
+
end
|
85
|
+
if codes
|
86
|
+
classes = codes.map{|c| terminal_code_to_css_class(c) }*' '
|
87
|
+
parts.push "<span class='#{classes}'>"
|
88
|
+
end
|
89
|
+
throw :done if i > last
|
90
|
+
case sexp[i].first
|
91
|
+
when :content; parts.push(sexp[i][1])
|
92
|
+
when :pop; parts.push('</span>')
|
93
|
+
else; fail('fook');
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
html = parts*''
|
98
|
+
html
|
99
|
+
end
|
100
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module NanDoc::SpecDoc
|
2
|
+
|
3
|
+
class Recordings < Array
|
4
|
+
#
|
5
|
+
# everything that nandoc does during test runs gets written
|
6
|
+
# to one of these. It's like a Sexp structure.
|
7
|
+
#
|
8
|
+
|
9
|
+
@for_test_case = {}
|
10
|
+
@for_key = {}
|
11
|
+
|
12
|
+
class << self
|
13
|
+
attr_accessor :for_test_case, :for_key
|
14
|
+
def get test_case
|
15
|
+
@for_test_case[test_case.class] ||= new(test_case.class)
|
16
|
+
end
|
17
|
+
def get_for_key key
|
18
|
+
@for_key[key] ||= new(key)
|
19
|
+
end
|
20
|
+
def report_test_case_not_found tc
|
21
|
+
msgs = ["no recordings found for #{tc}"]
|
22
|
+
msgs.join(' ')
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def add name, *data
|
27
|
+
# this might change if we need to group by method name
|
28
|
+
push [name, *data]
|
29
|
+
end
|
30
|
+
|
31
|
+
def get_first_sexp_for_test_method meth
|
32
|
+
first = index([:method, meth]) or return nil
|
33
|
+
last = (first+1..length-1).detect do |i|
|
34
|
+
self[i].first == :method && self[i][1] != meth
|
35
|
+
end
|
36
|
+
last = last ? (last - 1) : (length - 1)
|
37
|
+
ret = self[first..last]
|
38
|
+
ret
|
39
|
+
end
|
40
|
+
|
41
|
+
def initialize test_case
|
42
|
+
@test_case = test_case
|
43
|
+
end
|
44
|
+
|
45
|
+
def note &block
|
46
|
+
push [:note, block]
|
47
|
+
end
|
48
|
+
|
49
|
+
def report_recording_not_found meth_name
|
50
|
+
"no recordings found for #{meth_name}"
|
51
|
+
end
|
52
|
+
|
53
|
+
attr_reader :test_case
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module NanDoc::SpecDoc
|
2
|
+
module Ruby2RubyStandin
|
3
|
+
def leading_indent str
|
4
|
+
/\A([ \t]*)/ =~ str && $1
|
5
|
+
end
|
6
|
+
def re_for_line_with_same_indent_as str
|
7
|
+
ind = leading_indent(str)
|
8
|
+
re = /\A#{Regexp.escape(ind)}(?=[^ \t])/
|
9
|
+
re
|
10
|
+
end
|
11
|
+
def re_for_here here
|
12
|
+
/\A[ \t]*#{Regexp.escape(here)}[ \t]*\n?\Z/
|
13
|
+
end
|
14
|
+
def re_for_unindent_gsub indent
|
15
|
+
re = /\A#{Regexp.escape(indent)}/
|
16
|
+
re
|
17
|
+
end
|
18
|
+
def reindent_content raw_content, indent
|
19
|
+
return raw_content if indent == ''
|
20
|
+
# of all non-blank lines find the minimum indent.
|
21
|
+
x = raw_content.scan(/^[[:space:]]+(?=[^[:space:]])/).map(&:length).min
|
22
|
+
# if for some reason the content has less indent than the fences,
|
23
|
+
# don't alter any of it.
|
24
|
+
return raw_content if x < indent.length
|
25
|
+
re = /^#{Regexp.new(indent)}/
|
26
|
+
unindented_content = raw_content.gsub(re, '')
|
27
|
+
unindented_content
|
28
|
+
end
|
29
|
+
def string_diff_assert long, short
|
30
|
+
idx = long.index(short) or fail("short not found in long -- "<<
|
31
|
+
"#{short.inspect} in #{long.inspect}")
|
32
|
+
head = long[0,idx] # usu. ''
|
33
|
+
tail = long[idx + short.length..-1]
|
34
|
+
head + tail
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -1,16 +1,17 @@
|
|
1
|
-
require '
|
2
|
-
require File.expand_path('../../test/minitest-extlib.rb', __FILE__)
|
1
|
+
require 'nandoc/spec-doc/test-framework/proxy'
|
3
2
|
|
4
|
-
module NanDoc::SpecDoc::MiniTest
|
5
|
-
class Proxy < ::NanDoc::SpecDoc::
|
3
|
+
module NanDoc::SpecDoc::TestFramework::MiniTest
|
4
|
+
class Proxy < ::NanDoc::SpecDoc::TestFramework::Proxy
|
5
|
+
#
|
6
|
+
# our central nexus interflux for all interactions that require mini-test
|
7
|
+
#
|
8
|
+
|
9
|
+
private
|
6
10
|
|
7
|
-
def initialize
|
8
|
-
super(*a)
|
11
|
+
def initialize
|
9
12
|
@hacked_minitest = false
|
10
13
|
end
|
11
14
|
|
12
|
-
private
|
13
|
-
|
14
15
|
#
|
15
16
|
# given
|
16
17
|
# @param [String] the natural sounding string name as it appears in
|
@@ -79,27 +80,4 @@ module NanDoc::SpecDoc::MiniTest
|
|
79
80
|
return 0
|
80
81
|
end
|
81
82
|
end
|
82
|
-
|
83
|
-
|
84
|
-
#
|
85
|
-
# These are the methods that will be available to nandoc-enhanced tests.
|
86
|
-
# For now it is recommended to leave this as just the one method nandoc(),
|
87
|
-
# which will return the TestCaseAgent.
|
88
|
-
#
|
89
|
-
module SpecInstanceMethods
|
90
|
-
class << self
|
91
|
-
def include_to mod
|
92
|
-
unless mod.ancestors.include?(::MiniTest::Spec)
|
93
|
-
fail(
|
94
|
-
"Sorry, for now SpecDoc can only extend MiniTest::Spec "<<
|
95
|
-
" tests. Couldn't extend #{mod}."
|
96
|
-
)
|
97
|
-
end
|
98
|
-
mod.send(:include, self)
|
99
|
-
end
|
100
|
-
end
|
101
|
-
def nandoc
|
102
|
-
@nandoc_agent ||= ::NanDoc::SpecDoc::TestCaseAgent.new(self)
|
103
|
-
end
|
104
|
-
end
|
105
83
|
end
|
@@ -1,41 +1,14 @@
|
|
1
|
-
module NanDoc::SpecDoc
|
2
|
-
class
|
1
|
+
module NanDoc::SpecDoc::TestFramework
|
2
|
+
class Proxy
|
3
|
+
protected
|
3
4
|
# abstract baseclass, an agent that runs tests
|
4
5
|
|
5
|
-
def initialize gem_root
|
6
|
-
@gem_root = gem_root
|
7
|
-
end
|
8
|
-
|
9
|
-
def get_sexp testfile, testname
|
10
|
-
TestFrameworkProxy.sexp_cache[testfile][testname] ||= begin
|
11
|
-
build_sexp testfile, testname
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
def build_sexp testfile, testname
|
16
|
-
load_file testfile
|
17
|
-
test_case, meth_name = find_test testname
|
18
|
-
run_test_case_method testfile, testname, test_case, meth_name
|
19
|
-
recs = ::NanDoc::SpecDoc::Recordings.for_test_case[test_case] or
|
20
|
-
fail(::NanDoc::SpecDoc::Recordings.
|
21
|
-
report_test_case_not_found(test_case))
|
22
|
-
sexp = recs.get_first_sexp_for_test_method(meth_name) or
|
23
|
-
fail recs.report_recording_not_found(meth_name)
|
24
|
-
sexp
|
25
|
-
end
|
26
|
-
|
27
6
|
@sexp_cache = Hash.new{ |h,k| h[k] = {} }
|
28
7
|
class << self
|
29
8
|
attr_reader :sexp_cache
|
30
9
|
end
|
31
10
|
|
32
|
-
|
33
|
-
|
34
|
-
#
|
35
|
-
# the stream to write to when things like a specdoc test run fails
|
36
|
-
#
|
37
|
-
def err
|
38
|
-
$stderr
|
11
|
+
def initialize
|
39
12
|
end
|
40
13
|
|
41
14
|
def handle_failed_tests runner, testfile, testname
|
@@ -48,31 +21,35 @@ module NanDoc::SpecDoc
|
|
48
21
|
exit(1);
|
49
22
|
end
|
50
23
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
24
|
+
# the stream to write to when things like a specdoc test run fails
|
25
|
+
def err
|
26
|
+
$stderr
|
27
|
+
end
|
28
|
+
|
29
|
+
def sexp_build testfile, testname
|
30
|
+
NanDoc::Project.instance.require_test_file(testfile)
|
31
|
+
test_case, meth_name = find_test testname
|
32
|
+
run_test_case_method testfile, testname, test_case, meth_name
|
33
|
+
recs = ::NanDoc::SpecDoc::Recordings.for_test_case[test_case] or
|
34
|
+
fail(::NanDoc::SpecDoc::Recordings.
|
35
|
+
report_test_case_not_found(test_case))
|
36
|
+
sexp = recs.get_first_sexp_for_test_method(meth_name) or
|
37
|
+
fail recs.report_recording_not_found(meth_name)
|
38
|
+
sexp
|
39
|
+
end
|
40
|
+
|
41
|
+
public
|
42
|
+
def sexp_get testfile, testname
|
43
|
+
Proxy.sexp_cache[testfile][testname] ||= begin
|
44
|
+
sexp_build testfile, testname
|
45
|
+
end
|
56
46
|
end
|
57
47
|
|
58
|
-
|
48
|
+
protected
|
59
49
|
# default way to read what the test run wrote to stdout
|
60
|
-
#
|
61
50
|
def testout_str
|
62
51
|
@testout.rewind
|
63
52
|
@testout.read
|
64
53
|
end
|
65
|
-
|
66
|
-
#
|
67
|
-
# default way to deduce the root directory that holds the tests
|
68
|
-
#
|
69
|
-
def testdir
|
70
|
-
@testdir ||= begin
|
71
|
-
tries = [@gem_root+'/test', @gem_root+'/spec']
|
72
|
-
found = tries.detect{ |path| File.directory?(path) }
|
73
|
-
fail("Couldn't find test dir for gem at (#{tries*', '})") unless found
|
74
|
-
found
|
75
|
-
end
|
76
|
-
end
|
77
54
|
end
|
78
55
|
end
|
data/lib/nandoc/spec-doc.rb
CHANGED
@@ -4,10 +4,16 @@ unless Object.const_defined?('NanDoc')
|
|
4
4
|
require File.expand_path('../../nandoc.rb', __FILE__)
|
5
5
|
end
|
6
6
|
|
7
|
+
|
8
|
+
# @todo get this right
|
9
|
+
unless NanDoc.const_defined?('SpecDoc') # TO_HERE_HACK
|
10
|
+
|
7
11
|
me = File.dirname(__FILE__)+'/spec-doc'
|
8
|
-
require me + '/
|
12
|
+
require me + '/agent-instance-methods.rb'
|
13
|
+
require me + '/code-snippet.rb'
|
14
|
+
require me + '/parse-trace.rb'
|
15
|
+
require me + '/recordings.rb'
|
9
16
|
require me + '/test-case-agent.rb'
|
10
|
-
require me + '/test-framework-dispatcher.rb'
|
11
17
|
|
12
18
|
module NanDoc
|
13
19
|
module SpecDoc
|
@@ -20,27 +26,65 @@ module NanDoc
|
|
20
26
|
def include_to mod
|
21
27
|
if Object.const_defined?('MiniTest') &&
|
22
28
|
mod.ancestors.include?(::MiniTest::Spec)
|
23
|
-
require
|
24
|
-
|
29
|
+
require 'nandoc/extlib/minitest.rb'
|
30
|
+
SpecInstanceMethods.include_to mod
|
25
31
|
else
|
26
|
-
|
32
|
+
GenericInstanceMethods.include_to mod
|
27
33
|
end
|
28
34
|
end
|
35
|
+
|
36
|
+
#
|
37
|
+
# no reason not to use the conventional callback
|
38
|
+
# in cases where we are not passing parameters to the enhancement
|
39
|
+
#
|
40
|
+
alias_method :included, :include_to
|
29
41
|
end
|
30
42
|
|
31
|
-
|
32
|
-
|
33
|
-
|
43
|
+
#
|
44
|
+
# Experimental nandoc hook to give random ass objects a hook to some
|
45
|
+
# kind of SpecDoc agent thing that can a) not necessarily be a test case
|
46
|
+
# but b) still write recordings somehow. let's see what happens. hook.
|
47
|
+
#
|
48
|
+
module GenericInstanceMethods
|
49
|
+
class << self
|
50
|
+
def include_to mod
|
51
|
+
mod.send(:include, self)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
def nandoc
|
55
|
+
@nandoc_agent ||= begin
|
56
|
+
require File.dirname(__FILE__)+'/spec-doc/generic-agent'
|
57
|
+
GenericAgent.new(self)
|
58
|
+
end
|
59
|
+
end
|
34
60
|
end
|
35
61
|
|
36
62
|
#
|
37
|
-
#
|
63
|
+
# These are the methods that will be available to nandoc-enhanced tests.
|
64
|
+
# For now it is recommended to leave this as just the one method nandoc(),
|
65
|
+
# which will return the TestCaseAgent.
|
38
66
|
#
|
39
|
-
|
40
|
-
|
41
|
-
|
67
|
+
module SpecInstanceMethods
|
68
|
+
class << self
|
69
|
+
def include_to mod
|
70
|
+
#
|
71
|
+
# This used to be MiniTest::Spec-specific, now it's not, but here
|
72
|
+
# for reference:
|
73
|
+
#
|
74
|
+
# unless mod.ancestors.include?(::MiniTest::Spec)
|
75
|
+
# fail(
|
76
|
+
# "Sorry, for now SpecDoc can only extend MiniTest::Spec "<<
|
77
|
+
# " tests. Couldn't extend #{mod}."
|
78
|
+
# )
|
79
|
+
# end
|
80
|
+
mod.send(:include, self)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
def nandoc
|
84
|
+
@nandoc_agent ||= TestCaseAgent.new(self)
|
42
85
|
end
|
43
|
-
sexp
|
44
86
|
end
|
45
87
|
end
|
46
88
|
end
|
89
|
+
|
90
|
+
end # TO_HERE_HACK
|
File without changes
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module NanDoc
|
2
|
+
module SecretParent
|
3
|
+
#
|
4
|
+
# @dependencies: none
|
5
|
+
# @api private
|
6
|
+
# set parent attribute without it showing up in inspect() dumps
|
7
|
+
#
|
8
|
+
def parent= mixed
|
9
|
+
fail("no clear_parent() available yet.") unless mixed
|
10
|
+
@has_parent = !! mixed
|
11
|
+
class << self; self end.send(:define_method, :parent){mixed}
|
12
|
+
mixed # maybe chain assignmnet of 1 parent to several cx at once
|
13
|
+
end
|
14
|
+
def parent?
|
15
|
+
instance_variable_defined?('@has_parent') && @has_parent # no warnings
|
16
|
+
end
|
17
|
+
def parent
|
18
|
+
nil
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module NanDoc
|
2
|
+
module SharedAttrReader
|
3
|
+
#
|
4
|
+
# @api private
|
5
|
+
# @dependencies none
|
6
|
+
#
|
7
|
+
# this is a specialized form of delegator pattern: let one object
|
8
|
+
# use the responses from another object for a set of accessors
|
9
|
+
#
|
10
|
+
def shared_attr_reader *list
|
11
|
+
fail('no inehiritance yet') if method_defined?(:shared=)
|
12
|
+
sm = Module.new
|
13
|
+
name = self.to_s+'::SharedAttrReaders'
|
14
|
+
sing = class << sm; self end
|
15
|
+
sing.send(:define_method, :name){name}
|
16
|
+
sing.send(:alias_method, :inspect, :name)
|
17
|
+
list.each do |attrib|
|
18
|
+
sm.send(:define_method, attrib){ shared.send(attrib) }
|
19
|
+
end
|
20
|
+
fail('no') if method_defined?(:shared)
|
21
|
+
define_method(:shared){ self }
|
22
|
+
define_method(:shared=) do |source|
|
23
|
+
sing = class << self; self end
|
24
|
+
sing.send(:define_method, :shared){ source }
|
25
|
+
sing.send(:include, sm) # wow cool that this works w/o having
|
26
|
+
# to Module#undef_method
|
27
|
+
source
|
28
|
+
end
|
29
|
+
nil
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -11,7 +11,7 @@ module NanDoc
|
|
11
11
|
end
|
12
12
|
def site_merge opts, args
|
13
13
|
existing_site_path = args.first
|
14
|
-
|
14
|
+
command_abort("it's not exist: #{path}") unless
|
15
15
|
File.exist?(existing_site_path)
|
16
16
|
# nanoc writes to stdout so we do too, but here we want to write
|
17
17
|
# to stderr these notices, and write the diff to stdout
|
@@ -23,7 +23,7 @@ module NanDoc
|
|
23
23
|
end
|
24
24
|
path
|
25
25
|
else
|
26
|
-
|
26
|
+
command_abort <<-D.gsub(/^ */,'')
|
27
27
|
site path not found: #{args.first.inspect}
|
28
28
|
usage: #{usage}
|
29
29
|
#{invite_to_more_command_help}
|
@@ -37,14 +37,14 @@ module NanDoc
|
|
37
37
|
path
|
38
38
|
else
|
39
39
|
persistent_set('last_site_path',false)
|
40
|
-
|
40
|
+
command_abort <<-D.gsub(/^ */,'')
|
41
41
|
previous site path is stale (#{path.inspect}) and no site provided
|
42
42
|
usage: #{usage}
|
43
43
|
#{invite_to_more_command_help}
|
44
44
|
D
|
45
45
|
end
|
46
46
|
else
|
47
|
-
|
47
|
+
command_abort(
|
48
48
|
'no site path provided and no site path in persistent data file '<<
|
49
49
|
"(#{NanDoc.dotfile_path})\n"<<
|
50
50
|
<<-D.gsub(/^ */,'')
|
@@ -61,7 +61,7 @@ module NanDoc
|
|
61
61
|
#
|
62
62
|
def parse_config_for_site_path path
|
63
63
|
config_path = config_path_for_site_path( path )
|
64
|
-
|
64
|
+
command_abort("config file for app not found: #{config_path}") unless
|
65
65
|
File.exist?(config_path)
|
66
66
|
YAML.load_file config_path
|
67
67
|
end
|
@@ -72,7 +72,7 @@ module NanDoc
|
|
72
72
|
end
|
73
73
|
attr_reader :rule_list
|
74
74
|
def when(re_or_symbol, opts=nil, &block)
|
75
|
-
if re_or_symbol.kind_of?(Regexp) && Hash===opts && ! block_given?
|
75
|
+
if re_or_symbol.kind_of?(::Regexp) && Hash===opts && ! block_given?
|
76
76
|
add_regex_rule(re_or_symbol, opts)
|
77
77
|
elsif re_or_symbol.kind_of?(Symbol) && opts.nil? && block_given?
|
78
78
|
define_state(re_or_symbol, &block)
|