rundoc 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +5 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +38 -0
- data/README.md +309 -0
- data/Rakefile +16 -0
- data/bin/rundoc +82 -0
- data/lib/rundoc.rb +76 -0
- data/lib/rundoc/code_command.rb +32 -0
- data/lib/rundoc/code_command/bash.rb +57 -0
- data/lib/rundoc/code_command/bash/cd.rb +18 -0
- data/lib/rundoc/code_command/file_command/append.rb +74 -0
- data/lib/rundoc/code_command/file_command/remove.rb +32 -0
- data/lib/rundoc/code_command/no_such_command.rb +6 -0
- data/lib/rundoc/code_command/pipe.rb +37 -0
- data/lib/rundoc/code_command/repl.rb +37 -0
- data/lib/rundoc/code_command/rundoc_command.rb +22 -0
- data/lib/rundoc/code_command/write.rb +34 -0
- data/lib/rundoc/code_section.rb +145 -0
- data/lib/rundoc/parser.rb +53 -0
- data/lib/rundoc/version.rb +3 -0
- data/rundoc.gemspec +28 -0
- data/test/fixtures/play/source.md +231 -0
- data/test/fixtures/rails_4/rundoc.md +504 -0
- data/test/rundoc/code_commands/append_file_test.rb +55 -0
- data/test/rundoc/code_commands/bash_test.rb +29 -0
- data/test/rundoc/code_commands/pipe_test.rb +15 -0
- data/test/rundoc/code_commands/remove_contents_test.rb +42 -0
- data/test/rundoc/code_section_test.rb +42 -0
- data/test/rundoc/parser_test.rb +104 -0
- data/test/rundoc/regex_test.rb +200 -0
- data/test/rundoc/test_parse_java.rb +8 -0
- data/test/test_helper.rb +15 -0
- metadata +144 -0
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class AppendFileTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def test_appends_to_a_file
|
6
|
+
Dir.mktmpdir do |dir|
|
7
|
+
Dir.chdir(dir) do
|
8
|
+
|
9
|
+
file = "foo.rb"
|
10
|
+
`echo 'foo' >> #{file}`
|
11
|
+
|
12
|
+
cc = Rundoc::CodeCommand::FileCommand::Append.new(file)
|
13
|
+
cc << "bar"
|
14
|
+
cc.call
|
15
|
+
|
16
|
+
result = File.read(file)
|
17
|
+
|
18
|
+
assert_match /foo/, result
|
19
|
+
assert_match /bar/, result
|
20
|
+
|
21
|
+
cc = Rundoc::CodeCommand::FileCommand::Append.new(file)
|
22
|
+
cc << "baz"
|
23
|
+
cc.call
|
24
|
+
|
25
|
+
actual = File.read(file)
|
26
|
+
expected = "foo\nbar\nbaz\n"
|
27
|
+
assert_equal expected, actual
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_appends_to_a_file_at_line_number
|
33
|
+
Dir.mktmpdir do |dir|
|
34
|
+
Dir.chdir(dir) do
|
35
|
+
|
36
|
+
contents = <<-CONTENTS
|
37
|
+
source 'https://rubygems.org'
|
38
|
+
gem 'rails', '4.0.0'
|
39
|
+
CONTENTS
|
40
|
+
|
41
|
+
file = "foo.rb"
|
42
|
+
line = 2
|
43
|
+
`echo '#{contents}' >> #{file}`
|
44
|
+
|
45
|
+
cc = Rundoc::CodeCommand::FileCommand::Append.new("#{file}##{line}")
|
46
|
+
cc << "gem 'pg'"
|
47
|
+
cc.call
|
48
|
+
|
49
|
+
expected = "source https://rubygems.org\ngem 'pg'\ngem rails, 4.0.0\n\n"
|
50
|
+
assert_equal expected, File.read(file)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class BashTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def test_bash_returns_cd
|
6
|
+
original_dir = `pwd`
|
7
|
+
Rundoc::CodeCommand::Bash.new("cd ..").call
|
8
|
+
now_dir = `pwd`
|
9
|
+
refute_equal original_dir, now_dir
|
10
|
+
ensure
|
11
|
+
Dir.chdir(original_dir.strip)
|
12
|
+
end
|
13
|
+
|
14
|
+
|
15
|
+
def test_bash_shells_and_shows_correctly
|
16
|
+
["pwd", "ls"].each do |command|
|
17
|
+
bash = Rundoc::CodeCommand::Bash.new(command)
|
18
|
+
assert_equal "$ #{command}", bash.to_md
|
19
|
+
assert_equal `#{command}`, bash.call
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_stdin
|
24
|
+
command = "tail -n 2"
|
25
|
+
bash = Rundoc::CodeCommand::Bash.new(command)
|
26
|
+
bash << "foo\nbar\nbaz\n"
|
27
|
+
assert_equal "bar\nbaz\n", bash.call
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class PipeTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def test_pipe
|
6
|
+
pipe_cmd = "tail -n 2"
|
7
|
+
cmd = "ls"
|
8
|
+
out = `#{cmd}`
|
9
|
+
pipe = Rundoc::CodeCommand::Pipe.new(pipe_cmd)
|
10
|
+
actual = pipe.call(commands: [{command: cmd, output: out}])
|
11
|
+
|
12
|
+
expected = `#{cmd} | #{pipe_cmd}`
|
13
|
+
assert_equal expected, actual
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class RemoveContentsTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def setup
|
6
|
+
@gemfile = <<-RUBY
|
7
|
+
|
8
|
+
source 'https://rubygems.org'
|
9
|
+
|
10
|
+
# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
|
11
|
+
gem 'rails', '4.0.0'
|
12
|
+
|
13
|
+
gem 'sqlite3'
|
14
|
+
RUBY
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_appends_to_a_file
|
18
|
+
Dir.mktmpdir do |dir|
|
19
|
+
Dir.chdir(dir) do
|
20
|
+
|
21
|
+
@file = "foo.rb"
|
22
|
+
`echo "#{@gemfile}" >> #{@file}`
|
23
|
+
|
24
|
+
assert_match /sqlite3/, File.read(@file)
|
25
|
+
|
26
|
+
cc = Rundoc::CodeCommand::FileCommand::Remove.new(@file)
|
27
|
+
cc << "gem 'sqlite3'"
|
28
|
+
cc.call
|
29
|
+
|
30
|
+
result = File.read(@file)
|
31
|
+
refute_match /sqlite3/, File.read(@file)
|
32
|
+
|
33
|
+
env = {}
|
34
|
+
env[:commands] = []
|
35
|
+
env[:before] = "```ruby"
|
36
|
+
cc.to_md(env)
|
37
|
+
|
38
|
+
assert_equal "In file `foo.rb` remove:\n\n```ruby", env[:before]
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class CodeSectionTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def setup
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_does_not_render_if_all_contents_hidden
|
9
|
+
contents = <<-RUBY
|
10
|
+
sup
|
11
|
+
|
12
|
+
```
|
13
|
+
:::- $ mkdir foo
|
14
|
+
```
|
15
|
+
|
16
|
+
yo
|
17
|
+
RUBY
|
18
|
+
|
19
|
+
|
20
|
+
Dir.mktmpdir do |dir|
|
21
|
+
Dir.chdir(dir) do
|
22
|
+
match = contents.match(Rundoc::Parser::CODEBLOCK_REGEX)
|
23
|
+
result = Rundoc::CodeSection.new(match, keyword: ":::").render
|
24
|
+
assert_equal "", result
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
def test_no_code
|
31
|
+
contents = <<-RUBY
|
32
|
+
```ruby
|
33
|
+
gem 'sqlite3'
|
34
|
+
```
|
35
|
+
RUBY
|
36
|
+
|
37
|
+
match = contents.match(Rundoc::Parser::CODEBLOCK_REGEX)
|
38
|
+
result = Rundoc::CodeSection.new(match, keyword: ":::").render
|
39
|
+
assert_equal contents, result
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
@@ -0,0 +1,104 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class ParserTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def setup
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_parse_bash
|
9
|
+
contents = <<-RUBY
|
10
|
+
sup
|
11
|
+
|
12
|
+
```
|
13
|
+
::: $ mkdir foo
|
14
|
+
:::= $ ls
|
15
|
+
```
|
16
|
+
|
17
|
+
yo
|
18
|
+
RUBY
|
19
|
+
|
20
|
+
|
21
|
+
Dir.mktmpdir do |dir|
|
22
|
+
Dir.chdir(dir) do
|
23
|
+
expected = "sup\n\n```\n$ mkdir foo\n$ ls\nfoo\n```\n\nyo\n"
|
24
|
+
parsed = Rundoc::Parser.new(contents)
|
25
|
+
actual = parsed.to_md
|
26
|
+
assert_equal expected, actual
|
27
|
+
|
28
|
+
parsed = Rundoc::Parser.new("\n```\n:::= $ ls\n```\n")
|
29
|
+
actual = parsed.to_md
|
30
|
+
expected = "\n```\n$ ls\nfoo\n```\n"
|
31
|
+
assert_equal expected, actual
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
def test_parse_write_commands
|
38
|
+
contents = <<-RUBY
|
39
|
+
sup
|
40
|
+
|
41
|
+
```
|
42
|
+
:::= write foo/code.rb
|
43
|
+
a = 1 + 1
|
44
|
+
b = a * 2
|
45
|
+
```
|
46
|
+
yo
|
47
|
+
RUBY
|
48
|
+
|
49
|
+
Dir.mktmpdir do |dir|
|
50
|
+
Dir.chdir(dir) do
|
51
|
+
|
52
|
+
expected = "sup\n\nIn file `foo/code.rb` write:\n\n```\na = 1 + 1\nb = a * 2\n```\nyo\n"
|
53
|
+
parsed = Rundoc::Parser.new(contents)
|
54
|
+
actual = parsed.to_md
|
55
|
+
assert_equal expected, actual
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
|
60
|
+
contents = <<-RUBY
|
61
|
+
|
62
|
+
```
|
63
|
+
:::= write foo/newb.rb
|
64
|
+
puts 'hello world'
|
65
|
+
:::= $ cat foo/newb.rb
|
66
|
+
```
|
67
|
+
RUBY
|
68
|
+
|
69
|
+
Dir.mktmpdir do |dir|
|
70
|
+
Dir.chdir(dir) do
|
71
|
+
|
72
|
+
expected = "\nIn file `foo/newb.rb` write:\n\n```\nputs 'hello world'\n$ cat foo/newb.rb\nputs 'hello world'\n```\n"
|
73
|
+
parsed = Rundoc::Parser.new(contents)
|
74
|
+
actual = parsed.to_md
|
75
|
+
assert_equal expected, actual
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def test_irb
|
81
|
+
|
82
|
+
contents = <<-RUBY
|
83
|
+
```
|
84
|
+
:::= irb --simple-prompt
|
85
|
+
a = 3
|
86
|
+
b = "foo" * a
|
87
|
+
puts b
|
88
|
+
```
|
89
|
+
RUBY
|
90
|
+
|
91
|
+
|
92
|
+
Dir.mktmpdir do |dir|
|
93
|
+
Dir.chdir(dir) do
|
94
|
+
|
95
|
+
parsed = Rundoc::Parser.new(contents)
|
96
|
+
actual = parsed.to_md
|
97
|
+
expected = "```\n$ irb --simple-prompt\na = 3\n=> 3\r\nb = \"foo\" * a\n=> \"foofoofoo\"\r\nputs b\nfoofoofoo\r\n=> nil\n```\n"
|
98
|
+
assert_equal expected, actual
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
@@ -0,0 +1,200 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class RegexTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def setup
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_indent_regex
|
9
|
+
|
10
|
+
contents = <<-RUBY
|
11
|
+
foo
|
12
|
+
|
13
|
+
$ cd
|
14
|
+
yo
|
15
|
+
sup
|
16
|
+
|
17
|
+
bar
|
18
|
+
RUBY
|
19
|
+
|
20
|
+
regex = Rundoc::Parser::INDENT_BLOCK
|
21
|
+
parsed = contents.match(/#{regex}/).to_s
|
22
|
+
assert_equal "\n $ cd\n yo\n sup\n", parsed
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_github_regex
|
26
|
+
|
27
|
+
contents = <<-RUBY
|
28
|
+
foo
|
29
|
+
|
30
|
+
```
|
31
|
+
$ cd
|
32
|
+
yo
|
33
|
+
sup
|
34
|
+
```
|
35
|
+
|
36
|
+
bar
|
37
|
+
RUBY
|
38
|
+
|
39
|
+
regex = Rundoc::Parser::GITHUB_BLOCK
|
40
|
+
parsed = contents.match(/#{regex}/m).to_s
|
41
|
+
assert_equal "```\n$ cd\nyo\nsup\n```\n", parsed
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_github_tagged_regex
|
45
|
+
contents = <<-RUBY
|
46
|
+
foo
|
47
|
+
|
48
|
+
```ruby
|
49
|
+
$ cd
|
50
|
+
yo
|
51
|
+
sup
|
52
|
+
```
|
53
|
+
|
54
|
+
bar
|
55
|
+
RUBY
|
56
|
+
|
57
|
+
regex = Rundoc::Parser::GITHUB_BLOCK
|
58
|
+
parsed = contents.match(/#{regex}/m).to_s
|
59
|
+
assert_equal "```ruby\n$ cd\nyo\nsup\n```\n", parsed
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_command_regex
|
63
|
+
regex = Rundoc::Parser::COMMAND_REGEX.call(":::")
|
64
|
+
|
65
|
+
contents = ":::$ mkdir schneems"
|
66
|
+
match = contents.match(regex)
|
67
|
+
assert_equal "", match[:tag]
|
68
|
+
assert_equal "$", match[:command]
|
69
|
+
assert_equal "mkdir schneems", match[:statement]
|
70
|
+
|
71
|
+
contents = ":::=$ mkdir schneems"
|
72
|
+
match = contents.match(regex)
|
73
|
+
assert_equal "=", match[:tag]
|
74
|
+
assert_equal "$", match[:command]
|
75
|
+
assert_equal "mkdir schneems", match[:statement]
|
76
|
+
|
77
|
+
contents = ":::= $ mkdir schneems"
|
78
|
+
match = contents.match(regex)
|
79
|
+
assert_equal "=", match[:tag]
|
80
|
+
assert_equal "$", match[:command]
|
81
|
+
assert_equal "mkdir schneems", match[:statement]
|
82
|
+
|
83
|
+
contents = ":::-$ mkdir schneems"
|
84
|
+
match = contents.match(regex)
|
85
|
+
assert_equal "-", match[:tag]
|
86
|
+
assert_equal "$", match[:command]
|
87
|
+
assert_equal "mkdir schneems", match[:statement]
|
88
|
+
|
89
|
+
contents = ":::- $ mkdir schneems"
|
90
|
+
match = contents.match(regex)
|
91
|
+
assert_equal "-", match[:tag]
|
92
|
+
assert_equal "$", match[:command]
|
93
|
+
assert_equal "mkdir schneems", match[:statement]
|
94
|
+
end
|
95
|
+
|
96
|
+
|
97
|
+
def test_codeblock_regex
|
98
|
+
|
99
|
+
contents = <<-RUBY
|
100
|
+
foo
|
101
|
+
|
102
|
+
```
|
103
|
+
:::$ mkdir
|
104
|
+
```
|
105
|
+
|
106
|
+
zoo
|
107
|
+
|
108
|
+
```
|
109
|
+
:::$ cd ..
|
110
|
+
something
|
111
|
+
```
|
112
|
+
|
113
|
+
bar
|
114
|
+
RUBY
|
115
|
+
|
116
|
+
regex = Rundoc::Parser::CODEBLOCK_REGEX
|
117
|
+
|
118
|
+
actual = contents.partition(regex)
|
119
|
+
expected = ["foo\n\n",
|
120
|
+
"```\n:::$ mkdir\n```\n",
|
121
|
+
"\nzoo\n\n```\n:::$ cd ..\nsomething\n```\n\nbar\n"]
|
122
|
+
|
123
|
+
assert_equal expected, actual
|
124
|
+
|
125
|
+
str = "```\n:::$ mkdir\n```\n"
|
126
|
+
match = str.match(regex)
|
127
|
+
assert_equal ":::$ mkdir\n", match[:contents]
|
128
|
+
|
129
|
+
str = "\n\n```\n:::$ cd ..\nsomething\n```\n\nbar\n"
|
130
|
+
match = str.match(regex)
|
131
|
+
assert_equal ":::$ cd ..\nsomething\n", match[:contents]
|
132
|
+
|
133
|
+
# partition, shift, codebloc,
|
134
|
+
end
|
135
|
+
|
136
|
+
def test_complex_regex
|
137
|
+
|
138
|
+
contents = <<-RUBY
|
139
|
+
```java
|
140
|
+
:::= write app/controllers/Application.java
|
141
|
+
package controllers;
|
142
|
+
|
143
|
+
import static java.util.concurrent.TimeUnit.SECONDS;
|
144
|
+
import models.Pinger;
|
145
|
+
import play.libs.Akka;
|
146
|
+
import play.libs.F.Callback0;
|
147
|
+
import play.mvc.Controller;
|
148
|
+
import play.mvc.Result;
|
149
|
+
import play.mvc.WebSocket;
|
150
|
+
import scala.concurrent.duration.Duration;
|
151
|
+
import views.html.index;
|
152
|
+
import akka.actor.ActorRef;
|
153
|
+
import akka.actor.Cancellable;
|
154
|
+
import akka.actor.Props;
|
155
|
+
|
156
|
+
public class Application extends Controller {
|
157
|
+
public static WebSocket<String> pingWs() {
|
158
|
+
return new WebSocket<String>() {
|
159
|
+
public void onReady(WebSocket.In<String> in, WebSocket.Out<String> out) {
|
160
|
+
final ActorRef pingActor = Akka.system().actorOf(Props.create(Pinger.class, in, out));
|
161
|
+
final Cancellable cancellable = Akka.system().scheduler().schedule(Duration.create(1, SECONDS),
|
162
|
+
Duration.create(1, SECONDS),
|
163
|
+
pingActor,
|
164
|
+
"Tick",
|
165
|
+
Akka.system().dispatcher(),
|
166
|
+
null
|
167
|
+
);
|
168
|
+
|
169
|
+
in.onClose(new Callback0() {
|
170
|
+
@Override
|
171
|
+
public void invoke() throws Throwable {
|
172
|
+
cancellable.cancel();
|
173
|
+
}
|
174
|
+
});
|
175
|
+
}
|
176
|
+
|
177
|
+
};
|
178
|
+
}
|
179
|
+
|
180
|
+
public static Result pingJs() {
|
181
|
+
return ok(views.js.ping.render());
|
182
|
+
}
|
183
|
+
|
184
|
+
public static Result index() {
|
185
|
+
return ok(index.render());
|
186
|
+
}
|
187
|
+
}
|
188
|
+
```
|
189
|
+
RUBY
|
190
|
+
|
191
|
+
regex = Rundoc::Parser::CODEBLOCK_REGEX
|
192
|
+
match = contents.match(regex)
|
193
|
+
assert_equal 'java', match[:lang]
|
194
|
+
assert_equal '```', match[:fence]
|
195
|
+
assert_equal '`', match[:fence_char]
|
196
|
+
|
197
|
+
assert_equal contents.strip, match.to_s.strip
|
198
|
+
end
|
199
|
+
|
200
|
+
end
|