rundoc 1.1.3 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/check_changelog.yml +16 -7
  3. data/.github/workflows/ci.yml +48 -0
  4. data/.standard.yml +6 -0
  5. data/CHANGELOG.md +8 -0
  6. data/Gemfile +1 -1
  7. data/README.md +98 -5
  8. data/Rakefile +9 -10
  9. data/lib/rundoc/cli.rb +15 -17
  10. data/lib/rundoc/code_command/background/log/clear.rb +1 -1
  11. data/lib/rundoc/code_command/background/log/read.rb +1 -1
  12. data/lib/rundoc/code_command/background/process_spawn.rb +8 -9
  13. data/lib/rundoc/code_command/background/start.rb +7 -7
  14. data/lib/rundoc/code_command/background/stop.rb +1 -1
  15. data/lib/rundoc/code_command/background/wait.rb +2 -2
  16. data/lib/rundoc/code_command/background.rb +6 -6
  17. data/lib/rundoc/code_command/bash/cd.rb +6 -7
  18. data/lib/rundoc/code_command/bash.rb +10 -12
  19. data/lib/rundoc/code_command/file_command/append.rb +12 -16
  20. data/lib/rundoc/code_command/file_command/remove.rb +6 -9
  21. data/lib/rundoc/code_command/no_such_command.rb +0 -1
  22. data/lib/rundoc/code_command/pipe.rb +2 -5
  23. data/lib/rundoc/code_command/print/erb.rb +48 -0
  24. data/lib/rundoc/code_command/print/text.rb +33 -0
  25. data/lib/rundoc/code_command/raw.rb +1 -1
  26. data/lib/rundoc/code_command/rundoc/depend_on.rb +0 -1
  27. data/lib/rundoc/code_command/rundoc/require.rb +2 -3
  28. data/lib/rundoc/code_command/rundoc_command.rb +3 -4
  29. data/lib/rundoc/code_command/website/driver.rb +17 -17
  30. data/lib/rundoc/code_command/website/navigate.rb +2 -2
  31. data/lib/rundoc/code_command/website/screenshot.rb +1 -1
  32. data/lib/rundoc/code_command/website/visit.rb +4 -5
  33. data/lib/rundoc/code_command/website.rb +4 -4
  34. data/lib/rundoc/code_command/write.rb +10 -11
  35. data/lib/rundoc/code_command.rb +28 -17
  36. data/lib/rundoc/code_section.rb +42 -25
  37. data/lib/rundoc/parser.rb +17 -19
  38. data/lib/rundoc/peg_parser.rb +57 -59
  39. data/lib/rundoc/version.rb +1 -1
  40. data/lib/rundoc.rb +10 -14
  41. data/rundoc.gemspec +19 -21
  42. data/test/fixtures/rails_4/rundoc.md +94 -30
  43. data/test/fixtures/rails_5/rundoc.md +69 -10
  44. data/test/fixtures/rails_6/rundoc.md +226 -165
  45. data/test/fixtures/rails_7/rundoc.md +477 -0
  46. data/test/integration/print_test.rb +194 -0
  47. data/test/rundoc/code_commands/append_file_test.rb +5 -8
  48. data/test/rundoc/code_commands/background_test.rb +3 -6
  49. data/test/rundoc/code_commands/bash_test.rb +7 -9
  50. data/test/rundoc/code_commands/pipe_test.rb +9 -9
  51. data/test/rundoc/code_commands/print_test.rb +94 -0
  52. data/test/rundoc/code_commands/remove_contents_test.rb +4 -5
  53. data/test/rundoc/code_section_test.rb +50 -56
  54. data/test/rundoc/parser_test.rb +28 -61
  55. data/test/rundoc/peg_parser_test.rb +49 -53
  56. data/test/rundoc/regex_test.rb +120 -127
  57. data/test/rundoc/test_parse_java.rb +1 -3
  58. data/test/test_helper.rb +4 -6
  59. metadata +39 -42
  60. data/.travis.yml +0 -8
  61. data/lib/rundoc/code_command/repl.rb +0 -37
@@ -1,4 +1,4 @@
1
- require 'test_helper'
1
+ require "test_helper"
2
2
 
3
3
  class BackgroundTest < Minitest::Test
4
4
  def test_process_spawn_gc
@@ -9,8 +9,7 @@ class BackgroundTest < Minitest::Test
9
9
 
10
10
  background_start = Rundoc::CodeCommand::Background::Start.new("tail -f #{file}",
11
11
  name: "tail2",
12
- wait: "f"
13
- )
12
+ wait: "f")
14
13
 
15
14
  GC.start
16
15
 
@@ -30,14 +29,12 @@ class BackgroundTest < Minitest::Test
30
29
  def test_background_start
31
30
  Dir.mktmpdir do |dir|
32
31
  Dir.chdir(dir) do
33
-
34
32
  file = "foo.txt"
35
33
  `echo 'foo' >> #{file}`
36
34
 
37
35
  background_start = Rundoc::CodeCommand::Background::Start.new("tail -f #{file}",
38
36
  name: "tail",
39
- wait: "f"
40
- )
37
+ wait: "f")
41
38
  output = background_start.call
42
39
 
43
40
  assert_match("foo", output)
@@ -1,36 +1,34 @@
1
- require 'test_helper'
1
+ require "test_helper"
2
2
 
3
3
  class BashTest < Minitest::Test
4
-
5
4
  def test_bash_returns_cd
6
5
  original_dir = `pwd`
7
6
  Rundoc::CodeCommand::Bash.new("cd ..").call
8
- now_dir = `pwd`
7
+ now_dir = `pwd`
9
8
  refute_equal original_dir, now_dir
10
9
  ensure
11
10
  Dir.chdir(original_dir.strip)
12
11
  end
13
12
 
14
13
  def test_bash_stderr_with_or_is_capture
15
-
16
14
  command = "1>&2 echo 'msg to STDERR 1' || 1>&2 echo 'msg to STDERR 2'"
17
15
  bash = Rundoc::CodeCommand::Bash.new(command)
18
16
  assert_equal "$ #{command}", bash.to_md
19
- assert_equal "msg to STDERR 1\n", bash.call
17
+ assert_equal "msg to STDERR 1\n", bash.call
20
18
  end
21
19
 
22
20
  def test_bash_shells_and_shows_correctly
23
21
  ["pwd", "ls"].each do |command|
24
- bash = Rundoc::CodeCommand::Bash.new(command)
22
+ bash = Rundoc::CodeCommand::Bash.new(command)
25
23
  assert_equal "$ #{command}", bash.to_md
26
- assert_equal `#{command}`, bash.call
24
+ assert_equal `#{command}`, bash.call
27
25
  end
28
26
  end
29
27
 
30
28
  def test_stdin
31
29
  command = "tail -n 2"
32
- bash = Rundoc::CodeCommand::Bash.new(command)
30
+ bash = Rundoc::CodeCommand::Bash.new(command)
33
31
  bash << "foo\nbar\nbaz\n"
34
- assert_equal "bar\nbaz\n", bash.call
32
+ assert_equal "bar\nbaz\n", bash.call
35
33
  end
36
34
  end
@@ -1,12 +1,12 @@
1
- require 'test_helper'
1
+ require "test_helper"
2
2
 
3
3
  class PipeTest < Minitest::Test
4
4
  def test_pipe
5
5
  pipe_cmd = "tail -n 2"
6
- cmd = "ls"
7
- out = `#{cmd}`
8
- pipe = Rundoc::CodeCommand::Pipe.new(pipe_cmd)
9
- actual = pipe.call(commands: [{command: cmd, output: out}])
6
+ cmd = "ls"
7
+ out = `#{cmd}`
8
+ pipe = Rundoc::CodeCommand::Pipe.new(pipe_cmd)
9
+ actual = pipe.call(commands: [{command: cmd, output: out}])
10
10
 
11
11
  expected = `#{cmd} | #{pipe_cmd}`
12
12
  assert_equal expected, actual
@@ -14,10 +14,10 @@ class PipeTest < Minitest::Test
14
14
 
15
15
  def test_moar_pipe_with_dollar
16
16
  pipe_cmd = "tail -n 2"
17
- cmd = "ls"
18
- out = `#{cmd}`
19
- pipe = Rundoc::CodeCommand::Pipe.new("$ #{pipe_cmd}")
20
- actual = pipe.call(commands: [{command: cmd, output: out}])
17
+ cmd = "ls"
18
+ out = `#{cmd}`
19
+ pipe = Rundoc::CodeCommand::Pipe.new("$ #{pipe_cmd}")
20
+ actual = pipe.call(commands: [{command: cmd, output: out}])
21
21
 
22
22
  expected = `#{cmd} | #{pipe_cmd}`
23
23
  assert_equal expected, actual
@@ -0,0 +1,94 @@
1
+ require "test_helper"
2
+
3
+ class PrintTest < Minitest::Test
4
+ def test_plain_text_before_block
5
+ env = {}
6
+ env[:before] = []
7
+
8
+ input = %($ rails new myapp # Not a command since it's missing the ":::>>")
9
+ cmd = Rundoc::CodeCommand::PrintText.new(input)
10
+ cmd.render_command = false
11
+ cmd.render_result = true
12
+
13
+ assert_equal "", cmd.to_md(env)
14
+ assert_equal "", cmd.call
15
+ assert_equal ["$ rails new myapp # Not a command since it's missing the \":::>>\""], env[:before]
16
+ end
17
+
18
+ def test_plain_text_in_block
19
+ env = {}
20
+ env[:before] = []
21
+
22
+ input = %($ rails new myapp # Not a command since it's missing the ":::>>")
23
+ cmd = Rundoc::CodeCommand::PrintText.new(input)
24
+ cmd.render_command = true
25
+ cmd.render_result = true
26
+
27
+ assert_equal "", cmd.to_md(env)
28
+ assert_equal input, cmd.call
29
+
30
+ assert_equal [], env[:before]
31
+ end
32
+
33
+ def test_erb_before_block
34
+ env = {}
35
+ env[:before] = []
36
+
37
+ input = %($ rails new <%= 'myapp' %> # Not a command since it's missing the ":::>>")
38
+ cmd = Rundoc::CodeCommand::PrintERB.new(input)
39
+ cmd.render_command = false
40
+ cmd.render_result = true
41
+
42
+ assert_equal "", cmd.to_md(env)
43
+ assert_equal "", cmd.call
44
+ assert_equal ["$ rails new myapp # Not a command since it's missing the \":::>>\""],
45
+ env[:before]
46
+ end
47
+
48
+ def test_erb_in_block
49
+ env = {}
50
+ env[:before] = []
51
+
52
+ cmd = Rundoc::CodeCommand::PrintERB.new
53
+ cmd.contents = %(<%= "foo" %>)
54
+ cmd.render_command = true
55
+ cmd.render_result = true
56
+
57
+ assert_equal "", cmd.to_md(env)
58
+ assert_equal "foo", cmd.call
59
+ assert_equal [], env[:before]
60
+ end
61
+
62
+ def test_binding_is_preserved
63
+ env = {}
64
+ env[:before] = []
65
+ cmd = Rundoc::CodeCommand::PrintERB.new
66
+ cmd.contents = %{<%= @foo = SecureRandom.hex(16) %>}
67
+ cmd.render_command = true
68
+ cmd.render_result = true
69
+
70
+ assert_equal "", cmd.to_md(env)
71
+ assert_equal [], env[:before]
72
+ expected = cmd.call
73
+
74
+ assert !expected.empty?
75
+
76
+ cmd = Rundoc::CodeCommand::PrintERB.new
77
+ cmd.contents = %(<%= @foo %>)
78
+ cmd.render_command = true
79
+ cmd.render_result = true
80
+
81
+ assert_equal "", cmd.to_md(env)
82
+ assert_equal expected, cmd.call
83
+ assert_equal [], env[:before]
84
+
85
+ cmd = Rundoc::CodeCommand::PrintERB.new(binding: "different")
86
+ cmd.contents = %(<%= @foo %>)
87
+ cmd.render_command = true
88
+ cmd.render_result = true
89
+
90
+ assert_equal "", cmd.to_md(env)
91
+ assert_equal "", cmd.call
92
+ assert_equal [], env[:before]
93
+ end
94
+ end
@@ -1,7 +1,6 @@
1
- require 'test_helper'
1
+ require "test_helper"
2
2
 
3
3
  class RemoveContentsTest < Minitest::Test
4
-
5
4
  def setup
6
5
  @gemfile = <<-RUBY
7
6
 
@@ -17,7 +16,6 @@ class RemoveContentsTest < Minitest::Test
17
16
  def test_appends_to_a_file
18
17
  Dir.mktmpdir do |dir|
19
18
  Dir.chdir(dir) do
20
-
21
19
  @file = "foo.rb"
22
20
  `echo "#{@gemfile}" >> #{@file}`
23
21
 
@@ -31,10 +29,11 @@ class RemoveContentsTest < Minitest::Test
31
29
 
32
30
  env = {}
33
31
  env[:commands] = []
34
- env[:before] = "```ruby"
32
+ env[:before] = []
33
+ env[:fence_start] = "```ruby"
35
34
  cc.to_md(env)
36
35
 
37
- assert_equal "In file `foo.rb` remove:\n\n```ruby", env[:before]
36
+ assert_equal ["In file `foo.rb` remove:", Rundoc::CodeCommand::NEWLINE], env[:before]
38
37
  end
39
38
  end
40
39
  end
@@ -1,21 +1,16 @@
1
- require 'test_helper'
1
+ require "test_helper"
2
2
 
3
3
  class CodeSectionTest < Minitest::Test
4
-
5
- def setup
6
- end
7
-
8
4
  def test_does_not_render_if_all_contents_hidden
9
- contents = <<-RUBY
10
- sup
5
+ contents = <<~RUBY
6
+ sup
11
7
 
12
- ```
13
- :::-- $ mkdir foo
14
- ```
15
-
16
- yo
17
- RUBY
8
+ ```
9
+ :::-- $ mkdir foo
10
+ ```
18
11
 
12
+ yo
13
+ RUBY
19
14
 
20
15
  Dir.mktmpdir do |dir|
21
16
  Dir.chdir(dir) do
@@ -26,55 +21,55 @@ RUBY
26
21
  end
27
22
  end
28
23
 
29
-
30
24
  def test_no_code
31
- contents = <<-RUBY
32
- ```ruby
33
- gem 'sqlite3'
34
- ```
35
- RUBY
25
+ contents = <<~RUBY
26
+ ```ruby
27
+ gem 'sqlite3'
28
+ ```
29
+
30
+ RUBY
36
31
 
37
32
  match = contents.match(Rundoc::Parser::CODEBLOCK_REGEX)
38
33
  result = Rundoc::CodeSection.new(match, keyword: ":::").render
39
- assert_equal contents, result
34
+ assert_equal contents, result.gsub(Rundoc::CodeSection::AUTOGEN_WARNING, "\n")
40
35
  end
41
36
 
42
37
  def test_show_command_hide_render
43
- contents = <<-RUBY
44
- ```
45
- :::>- $ echo "foo"
46
- ```
47
- RUBY
38
+ contents = <<~RUBY
39
+ ```
40
+ :::>- $ echo "foo"
41
+ ```
42
+ RUBY
48
43
 
49
44
  match = contents.match(Rundoc::Parser::CODEBLOCK_REGEX)
50
45
  code_section = Rundoc::CodeSection.new(match, keyword: ":::")
51
46
  code_section.render
52
47
 
53
48
  code_command = code_section.commands.first
54
- assert_equal true, code_command.render_command
49
+ assert_equal true, code_command.render_command
55
50
  assert_equal false, code_command.render_result
56
51
 
57
- contents = <<-RUBY
58
- ```
59
- :::>- $ echo "foo"
60
- ```
61
- RUBY
52
+ contents = <<~RUBY
53
+ ```
54
+ :::>- $ echo "foo"
55
+ ```
56
+ RUBY
62
57
 
63
58
  match = contents.match(Rundoc::Parser::CODEBLOCK_REGEX)
64
59
  code_section = Rundoc::CodeSection.new(match, keyword: ":::")
65
60
  code_section.render
66
61
 
67
62
  code_command = code_section.commands.first
68
- assert_equal true, code_command.render_command
63
+ assert_equal true, code_command.render_command
69
64
  assert_equal false, code_command.render_result
70
65
  end
71
66
 
72
67
  def test_show_command_show_render
73
- contents = <<-RUBY
74
- ```
75
- :::>> $ echo "foo"
76
- ```
77
- RUBY
68
+ contents = <<~RUBY
69
+ ```
70
+ :::>> $ echo "foo"
71
+ ```
72
+ RUBY
78
73
 
79
74
  match = contents.match(Rundoc::Parser::CODEBLOCK_REGEX)
80
75
  code_section = Rundoc::CodeSection.new(match, keyword: ":::")
@@ -87,49 +82,48 @@ RUBY
87
82
  end
88
83
 
89
84
  def test_hide_command_hide_render
90
- contents = <<-RUBY
91
- ```
92
- :::-- $ echo "foo"
93
- ```
94
- RUBY
85
+ contents = <<~RUBY
86
+ ```
87
+ :::-- $ echo "foo"
88
+ ```
89
+ RUBY
95
90
 
96
91
  match = contents.match(Rundoc::Parser::CODEBLOCK_REGEX)
97
92
  code_section = Rundoc::CodeSection.new(match, keyword: ":::")
98
93
  code_section.render
99
94
 
100
95
  code_command = code_section.commands.first
101
- assert_equal false, code_command.render_command
96
+ assert_equal false, code_command.render_command
102
97
  assert_equal false, code_command.render_result
103
98
 
104
- contents = <<-RUBY
105
- ```
106
- :::-- $ echo "foo"
107
- ```
108
- RUBY
99
+ contents = <<~RUBY
100
+ ```
101
+ :::-- $ echo "foo"
102
+ ```
103
+ RUBY
109
104
 
110
105
  match = contents.match(Rundoc::Parser::CODEBLOCK_REGEX)
111
106
  code_section = Rundoc::CodeSection.new(match, keyword: ":::")
112
107
  code_section.render
113
108
 
114
109
  code_command = code_section.commands.first
115
- assert_equal false, code_command.render_command
110
+ assert_equal false, code_command.render_command
116
111
  assert_equal false, code_command.render_result
117
112
  end
118
113
 
119
114
  def test_hide_command_show_render
120
- contents = <<-RUBY
121
- ```
122
- :::-> $ echo "foo"
123
- ```
124
- RUBY
115
+ contents = <<~RUBY
116
+ ```
117
+ :::-> $ echo "foo"
118
+ ```
119
+ RUBY
125
120
 
126
121
  match = contents.match(Rundoc::Parser::CODEBLOCK_REGEX)
127
122
  code_section = Rundoc::CodeSection.new(match, keyword: ":::")
128
123
  code_section.render
129
124
 
130
125
  code_command = code_section.commands.first
131
- assert_equal false, code_command.render_command
126
+ assert_equal false, code_command.render_command
132
127
  assert_equal true, code_command.render_result
133
128
  end
134
-
135
129
  end
@@ -1,98 +1,65 @@
1
- require 'test_helper'
1
+ require "test_helper"
2
2
 
3
3
  class ParserTest < Minitest::Test
4
-
5
- def setup
6
- end
7
-
8
4
  def test_parse_bash
9
- contents = <<-RUBY
10
- sup
5
+ contents = <<~RUBY
6
+ sup
11
7
 
12
- ```
13
- :::>- $ mkdir foo
14
- :::>> $ ls
15
- ```
16
-
17
- yo
18
- RUBY
8
+ ```
9
+ :::>- $ mkdir foo
10
+ :::>> $ ls
11
+ ```
19
12
 
13
+ yo
14
+ RUBY
20
15
 
21
16
  Dir.mktmpdir do |dir|
22
17
  Dir.chdir(dir) do
23
18
  expected = "sup\n\n```\n$ mkdir foo\n$ ls\nfoo\n```\n\nyo\n"
24
19
  parsed = Rundoc::Parser.new(contents)
25
- actual = parsed.to_md
20
+ actual = parsed.to_md.gsub(Rundoc::CodeSection::AUTOGEN_WARNING, "")
26
21
  assert_equal expected, actual
27
22
  end
28
23
  end
29
24
  end
30
25
 
31
-
32
26
  def test_parse_write_commands
33
- contents = <<-RUBY
34
- sup
27
+ contents = <<~RUBY
28
+ sup
35
29
 
36
- ```
37
- :::>> write foo/code.rb
38
- a = 1 + 1
39
- b = a * 2
40
- ```
41
- yo
42
- RUBY
30
+ ```
31
+ :::>> write foo/code.rb
32
+ a = 1 + 1
33
+ b = a * 2
34
+ ```
35
+ yo
36
+ RUBY
43
37
 
44
38
  Dir.mktmpdir do |dir|
45
39
  Dir.chdir(dir) do
46
-
47
40
  expected = "sup\n\nIn file `foo/code.rb` write:\n\n```\na = 1 + 1\nb = a * 2\n```\nyo\n"
48
41
  parsed = Rundoc::Parser.new(contents)
49
- actual = parsed.to_md
42
+ actual = parsed.to_md.gsub(Rundoc::CodeSection::AUTOGEN_WARNING, "")
50
43
  assert_equal expected, actual
51
44
  end
52
45
  end
53
46
 
47
+ contents = <<~RUBY
54
48
 
55
- contents = <<-RUBY
56
-
57
- ```
58
- :::>> write foo/newb.rb
59
- puts 'hello world'
60
- :::>> $ cat foo/newb.rb
61
- ```
62
- RUBY
49
+ ```
50
+ :::>> write foo/newb.rb
51
+ puts 'hello world'
52
+ :::>> $ cat foo/newb.rb
53
+ ```
54
+ RUBY
63
55
 
64
56
  Dir.mktmpdir do |dir|
65
57
  Dir.chdir(dir) do
66
-
67
58
  expected = "\nIn file `foo/newb.rb` write:\n\n```\nputs 'hello world'\n$ cat foo/newb.rb\nputs 'hello world'\n```\n"
68
59
  parsed = Rundoc::Parser.new(contents)
69
- actual = parsed.to_md
60
+ actual = parsed.to_md.gsub(Rundoc::CodeSection::AUTOGEN_WARNING, "")
70
61
  assert_equal expected, actual
71
62
  end
72
63
  end
73
64
  end
74
-
75
- def test_irb
76
-
77
- contents = <<-RUBY
78
- ```
79
- :::>> irb --simple-prompt
80
- a = 3
81
- b = "foo" * a
82
- puts b
83
- ```
84
- RUBY
85
-
86
- Dir.mktmpdir do |dir|
87
- Dir.chdir(dir) do
88
-
89
- parsed = Rundoc::Parser.new(contents)
90
- actual = parsed.to_md
91
- expected = "```\n$ irb --simple-prompt\na = 3\n=> 3\r\nb = \"foo\" * a\n=> \"foofoofoo\"\r\nputs b\nfoofoofoo\r\n=> nil\n```\n"
92
- assert_equal expected, actual
93
- end
94
- end
95
-
96
- end
97
-
98
65
  end