rundoc 4.1.4 → 6.0.0

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.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +3 -1
  3. data/.standard.yml +1 -1
  4. data/CHANGELOG.md +12 -0
  5. data/README.md +98 -10
  6. data/lib/rundoc/cli.rb +18 -2
  7. data/lib/rundoc/code_command/background/log/clear.rb +12 -2
  8. data/lib/rundoc/code_command/background/log/read.rb +12 -2
  9. data/lib/rundoc/code_command/background/process_spawn.rb +3 -1
  10. data/lib/rundoc/code_command/background/start.rb +25 -6
  11. data/lib/rundoc/code_command/background/stdin_write.rb +21 -8
  12. data/lib/rundoc/code_command/background/stop.rb +12 -2
  13. data/lib/rundoc/code_command/background/wait.rb +15 -3
  14. data/lib/rundoc/code_command/background.rb +2 -0
  15. data/lib/rundoc/code_command/bash/cd.rb +12 -18
  16. data/lib/rundoc/code_command/bash.rb +43 -19
  17. data/lib/rundoc/code_command/comment.rb +33 -0
  18. data/lib/rundoc/code_command/deferred.rb +66 -0
  19. data/lib/rundoc/code_command/empty_binding.rb +18 -0
  20. data/lib/rundoc/code_command/file_command/append.rb +29 -8
  21. data/lib/rundoc/code_command/file_command/remove.rb +27 -5
  22. data/lib/rundoc/code_command/no_such_command.rb +8 -3
  23. data/lib/rundoc/code_command/pipe.rb +36 -16
  24. data/lib/rundoc/code_command/pre/erb.rb +28 -18
  25. data/lib/rundoc/code_command/print/erb.rb +27 -16
  26. data/lib/rundoc/code_command/print/text.rb +27 -8
  27. data/lib/rundoc/code_command/raw.rb +17 -5
  28. data/lib/rundoc/code_command/rundoc/ensure_later.rb +59 -0
  29. data/lib/rundoc/code_command/rundoc/require.rb +25 -17
  30. data/lib/rundoc/code_command/rundoc_command.rb +26 -9
  31. data/lib/rundoc/code_command/website/driver.rb +2 -0
  32. data/lib/rundoc/code_command/website/navigate.rb +18 -12
  33. data/lib/rundoc/code_command/website/screenshot.rb +17 -11
  34. data/lib/rundoc/code_command/website/visit.rb +23 -12
  35. data/lib/rundoc/code_command/website.rb +2 -0
  36. data/lib/rundoc/code_command/write.rb +37 -9
  37. data/lib/rundoc/code_command.rb +6 -48
  38. data/lib/rundoc/context/after_build.rb +2 -0
  39. data/lib/rundoc/context/execution.rb +2 -0
  40. data/lib/rundoc/document.rb +6 -2
  41. data/lib/rundoc/fenced_code_block.rb +10 -7
  42. data/lib/rundoc/peg_parser.rb +25 -9
  43. data/lib/rundoc/version.rb +3 -1
  44. data/lib/rundoc.rb +89 -17
  45. data/rundoc.gemspec +3 -0
  46. data/test/integration/ensure_later_test.rb +335 -0
  47. data/test/integration/print_test.rb +51 -0
  48. data/test/rundoc/code_commands/append_file_test.rb +35 -10
  49. data/test/rundoc/code_commands/background_test.rb +24 -22
  50. data/test/rundoc/code_commands/bash_test.rb +10 -5
  51. data/test/rundoc/code_commands/comment_test.rb +116 -0
  52. data/test/rundoc/code_commands/pipe_test.rb +2 -2
  53. data/test/rundoc/code_commands/print_test.rb +13 -25
  54. data/test/rundoc/code_commands/remove_contents_test.rb +8 -3
  55. data/test/rundoc/code_section_test.rb +28 -21
  56. data/test/rundoc/peg_parser_test.rb +42 -1
  57. data/test/test_helper.rb +4 -2
  58. metadata +23 -6
  59. data/lib/rundoc/code_command/rundoc/depend_on.rb +0 -13
  60. data/test/fixtures/depend_on/dependency/rundoc.md +0 -5
  61. data/test/fixtures/depend_on/main/rundoc.md +0 -10
@@ -1,8 +1,23 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ::Rundoc
2
- class CodeCommand
3
- class ::RundocCommand < ::Rundoc::CodeCommand
4
- def initialize(contents = "")
5
- @contents = contents
4
+ module CodeCommand
5
+ class RundocCommandArgs
6
+ attr_reader :code
7
+
8
+ def initialize(code = "")
9
+ @code = code
10
+ end
11
+ end
12
+
13
+ class RundocCommandRunner
14
+ attr_reader :io, :contents
15
+
16
+ def initialize(user_args:, render_command:, render_result:, io:, contents: nil)
17
+ @io = io
18
+ @contents = contents.dup if contents && !contents.empty?
19
+ @contents = user_args.code + (@contents || +"")
20
+ @binding = RUNDOC_ERB_BINDINGS[RUNDOC_DEFAULT_ERB_BINDING]
6
21
  end
7
22
 
8
23
  def to_md(env = {})
@@ -10,16 +25,18 @@ module ::Rundoc
10
25
  end
11
26
 
12
27
  def call(env = {})
13
- puts "Running: #{contents}"
14
- eval(contents) # rubocop:disable Security/Eval
28
+ io.puts "Running: #{contents}"
29
+ Rundoc.capture_stdout_stderr(io) do
30
+ eval(contents, @binding) # rubocop:disable Security/Eval
31
+ end
15
32
  ""
16
33
  end
17
34
  end
18
35
  end
19
36
  end
20
37
 
21
- Rundoc.register_code_command(:rundoc, RundocCommand)
22
- Rundoc.register_code_command(:"rundoc.configure", RundocCommand)
38
+ Rundoc.register_code_command(keyword: :rundoc, args_klass: Rundoc::CodeCommand::RundocCommandArgs, runner_klass: Rundoc::CodeCommand::RundocCommandRunner)
39
+ Rundoc.register_code_command(keyword: :"rundoc.configure", args_klass: Rundoc::CodeCommand::RundocCommandArgs, runner_klass: Rundoc::CodeCommand::RundocCommandRunner)
23
40
 
24
- require "rundoc/code_command/rundoc/depend_on"
25
41
  require "rundoc/code_command/rundoc/require"
42
+ require "rundoc/code_command/rundoc/ensure_later"
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "capybara"
2
4
 
3
5
  Capybara::Selenium::Driver.load_selenium
@@ -1,8 +1,22 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Rundoc::CodeCommand::Website
2
- class Navigate < Rundoc::CodeCommand
4
+ class NavigateArgs
5
+ attr_reader :name
6
+
3
7
  def initialize(name:)
4
8
  @name = name
9
+ end
10
+ end
11
+
12
+ class NavigateRunner
13
+ attr_reader :io, :contents
14
+
15
+ def initialize(user_args:, render_command:, render_result:, io:, contents: nil)
16
+ @name = user_args.name
5
17
  @driver = nil
18
+ @io = io
19
+ @contents = contents.dup if contents && !contents.empty?
6
20
  end
7
21
 
8
22
  def driver
@@ -14,20 +28,12 @@ class Rundoc::CodeCommand::Website
14
28
  end
15
29
 
16
30
  def call(env = {})
17
- puts "website.navigate [#{@name}]: #{contents}"
31
+ io.puts "website.navigate [#{@name}]: #{contents}"
18
32
  driver.safe_eval(contents, env)
19
33
  ""
20
34
  end
21
-
22
- def hidden?
23
- true
24
- end
25
-
26
- def not_hidden?
27
- !hidden?
28
- end
29
35
  end
30
36
  end
31
37
 
32
- Rundoc.register_code_command(:"website.nav", Rundoc::CodeCommand::Website::Navigate)
33
- Rundoc.register_code_command(:"website.navigate", Rundoc::CodeCommand::Website::Navigate)
38
+ Rundoc.register_code_command(keyword: :"website.nav", args_klass: Rundoc::CodeCommand::Website::NavigateArgs, runner_klass: Rundoc::CodeCommand::Website::NavigateRunner)
39
+ Rundoc.register_code_command(keyword: :"website.navigate", args_klass: Rundoc::CodeCommand::Website::NavigateArgs, runner_klass: Rundoc::CodeCommand::Website::NavigateRunner)
@@ -1,9 +1,23 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Rundoc::CodeCommand::Website
2
- class Screenshot < Rundoc::CodeCommand
4
+ class ScreenshotArgs
5
+ attr_reader :name, :upload
6
+
3
7
  def initialize(name:, upload: false)
4
8
  @name = name
5
9
  @upload = upload
10
+ end
11
+ end
12
+
13
+ class ScreenshotRunner
14
+ attr_reader :io
15
+
16
+ def initialize(user_args:, render_command:, render_result:, io:, contents: nil)
17
+ @name = user_args.name
18
+ @upload = user_args.upload
6
19
  @driver = nil
20
+ @io = io
7
21
  end
8
22
 
9
23
  def driver
@@ -15,7 +29,7 @@ class Rundoc::CodeCommand::Website
15
29
  end
16
30
 
17
31
  def call(env = {})
18
- puts "Taking screenshot: #{driver.current_url}"
32
+ io.puts "Taking screenshot: #{driver.current_url}"
19
33
  filename = driver.screenshot(
20
34
  upload: @upload,
21
35
  screenshots_dir: env[:context].screenshots_dir
@@ -25,14 +39,6 @@ class Rundoc::CodeCommand::Website
25
39
  env[:before] << "![Screenshot of #{driver.current_url}](#{relative_filename})"
26
40
  ""
27
41
  end
28
-
29
- # def hidden?
30
- # true
31
- # end
32
-
33
- # def not_hidden?
34
- # !hidden?
35
- # end
36
42
  end
37
43
  end
38
- Rundoc.register_code_command(:"website.screenshot", Rundoc::CodeCommand::Website::Screenshot)
44
+ Rundoc.register_code_command(keyword: :"website.screenshot", args_klass: Rundoc::CodeCommand::Website::ScreenshotArgs, runner_klass: Rundoc::CodeCommand::Website::ScreenshotRunner)
@@ -1,7 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Rundoc::CodeCommand::Website
4
- class Visit < Rundoc::CodeCommand
4
+ class VisitArgs
5
+ attr_reader :name, :url, :scroll, :height, :width, :visible, :max_attempts
6
+
5
7
  def initialize(name:, url: nil, scroll: nil, height: 720, width: 1024, visible: false, max_attempts: 3)
6
8
  @name = name
7
9
  @url = url
@@ -11,6 +13,22 @@ class Rundoc::CodeCommand::Website
11
13
  @visible = visible
12
14
  @max_attempts = max_attempts
13
15
  end
16
+ end
17
+
18
+ class VisitRunner
19
+ attr_reader :io, :contents
20
+
21
+ def initialize(user_args:, render_command:, render_result:, io:, contents: nil)
22
+ @name = user_args.name
23
+ @url = user_args.url
24
+ @scroll = user_args.scroll
25
+ @height = user_args.height
26
+ @width = user_args.width
27
+ @visible = user_args.visible
28
+ @max_attempts = user_args.max_attempts
29
+ @io = io
30
+ @contents = contents.dup if contents && !contents.empty?
31
+ end
14
32
 
15
33
  def driver
16
34
  @driver ||= Driver.new(
@@ -18,7 +36,8 @@ class Rundoc::CodeCommand::Website
18
36
  url: @url,
19
37
  height: @height,
20
38
  width: @width,
21
- visible: @visible
39
+ visible: @visible,
40
+ io: io
22
41
  ).tap do |driver|
23
42
  Driver.add(@name, driver)
24
43
  end
@@ -32,7 +51,7 @@ class Rundoc::CodeCommand::Website
32
51
  message = "Visting: #{@url}"
33
52
  message << "and executing:\n#{contents}" unless contents.nil? || contents.empty?
34
53
 
35
- puts message
54
+ io.puts message
36
55
 
37
56
  driver.visit(@url, max_attempts: @max_attempts) if @url
38
57
  driver.scroll(@scroll) if @scroll
@@ -42,15 +61,7 @@ class Rundoc::CodeCommand::Website
42
61
 
43
62
  ""
44
63
  end
45
-
46
- def hidden?
47
- true
48
- end
49
-
50
- def not_hidden?
51
- !hidden?
52
- end
53
64
  end
54
65
  end
55
66
 
56
- Rundoc.register_code_command(:"website.visit", Rundoc::CodeCommand::Website::Visit)
67
+ Rundoc.register_code_command(keyword: :"website.visit", args_klass: Rundoc::CodeCommand::Website::VisitArgs, runner_klass: Rundoc::CodeCommand::Website::VisitRunner)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Rundoc::CodeCommand::Website
2
4
  end
3
5
 
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Rundoc
2
- class CodeCommand
4
+ module CodeCommand
3
5
  module FileUtil
4
6
  def filename
5
7
  files = Dir.glob(@filename)
@@ -15,16 +17,42 @@ module Rundoc
15
17
  end
16
18
  end
17
19
 
18
- class Write < Rundoc::CodeCommand
19
- include FileUtil
20
+ class WriteArgs
21
+ attr_reader :path
22
+
23
+ def initialize(path)
24
+ @path = Pathname(path)
25
+ end
26
+ end
27
+
28
+ class WriteRunner
29
+ NEWLINE = Object.new
30
+ def NEWLINE.to_s
31
+ ""
32
+ end
33
+
34
+ def NEWLINE.empty?
35
+ false
36
+ end
37
+
38
+ include Rundoc::CodeCommand::FileUtil
39
+
40
+ attr_reader :io, :contents
41
+
42
+ def initialize(user_args:, render_command:, render_result:, io:, contents: nil)
43
+ @filename = user_args.path.to_s
44
+ @io = io
45
+ @render_command = render_command
46
+ @contents = contents.dup if contents && !contents.empty?
47
+ end
20
48
 
21
- def initialize(filename)
22
- @filename = filename
49
+ def render_command?
50
+ @render_command
23
51
  end
24
52
 
25
53
  def to_md(env)
26
54
  if render_command?
27
- if env[:commands].any? { |c| c[:object].not_hidden? }
55
+ if env[:commands].any? { |c| c[:visibility].not_hidden? }
28
56
  raise "must call write in its own code section"
29
57
  end
30
58
  env[:before] << "In file `#{filename}` write:"
@@ -34,7 +62,7 @@ module Rundoc
34
62
  end
35
63
 
36
64
  def call(env = {})
37
- puts "Writing to: '#{filename}'"
65
+ io.puts "Writing to: '#{filename}'"
38
66
  mkdir_p
39
67
  File.write(filename, contents)
40
68
  contents
@@ -43,8 +71,8 @@ module Rundoc
43
71
  end
44
72
  end
45
73
 
46
- Rundoc.register_code_command(:write, Rundoc::CodeCommand::Write)
47
- Rundoc.register_code_command(:"file.write", Rundoc::CodeCommand::Write)
74
+ Rundoc.register_code_command(keyword: :write, args_klass: Rundoc::CodeCommand::WriteArgs, runner_klass: Rundoc::CodeCommand::WriteRunner)
75
+ Rundoc.register_code_command(keyword: :"file.write", args_klass: Rundoc::CodeCommand::WriteArgs, runner_klass: Rundoc::CodeCommand::WriteRunner)
48
76
 
49
77
  require "rundoc/code_command/file_command/append"
50
78
  require "rundoc/code_command/file_command/remove"
@@ -1,55 +1,12 @@
1
- module Rundoc
2
- # Generic CodeCommand class to be inherited
3
- #
4
- class CodeCommand
5
- # Newlines are stripped and re-added, this tells the project that
6
- # we're intentionally wanting an extra newline
7
- NEWLINE = Object.new
8
- def NEWLINE.to_s
9
- ""
10
- end
11
-
12
- def NEWLINE.empty?
13
- false
14
- end
15
-
16
- attr_accessor :render_result, :render_command,
17
- :command, :contents, :keyword,
18
- :original_args
19
-
20
- alias_method :render_result?, :render_result
21
- alias_method :render_command?, :render_command
22
-
23
- def initialize(*args)
24
- end
1
+ # frozen_string_literal: true
25
2
 
26
- def hidden?
27
- !render_command? && !render_result?
28
- end
29
-
30
- def not_hidden?
31
- !hidden?
32
- end
33
-
34
- def push(contents)
35
- @contents ||= ""
36
- @contents << contents
37
- end
38
- alias_method :<<, :push
39
-
40
- # Executes command to build project
41
- # Is expected to return the result of the command
42
- def call(env = {})
43
- raise "not implemented on #{inspect}"
44
- end
45
-
46
- # the output of the command, i.e. `$ cat foo.txt`
47
- def to_md(env = {})
48
- raise "not implemented on #{inspect}"
49
- end
3
+ module Rundoc
4
+ module CodeCommand
50
5
  end
51
6
  end
52
7
 
8
+ require "rundoc/code_command/empty_binding"
9
+ require "rundoc/code_command/deferred"
53
10
  require "rundoc/code_command/bash"
54
11
  require "rundoc/code_command/pipe"
55
12
  require "rundoc/code_command/write"
@@ -61,3 +18,4 @@ require "rundoc/code_command/website"
61
18
  require "rundoc/code_command/print/text"
62
19
  require "rundoc/code_command/print/erb"
63
20
  require "rundoc/code_command/pre/erb"
21
+ require "rundoc/code_command/comment"
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Rundoc
2
4
  module Context
3
5
  # Public interface for the `Rundoc.after_build` proc
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Rundoc
2
4
  module Context
3
5
  # Holds configuration for the currently executing script
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Rundoc
2
4
  # Represents a single rundoc file on disk,
3
5
  #
@@ -11,7 +13,8 @@ module Rundoc
11
13
 
12
14
  attr_reader :contents, :stack, :context
13
15
 
14
- def initialize(contents, context:)
16
+ def initialize(contents, context:, io: $stdout)
17
+ @io = io
15
18
  @context = context
16
19
  @contents = contents
17
20
  @original = contents.dup
@@ -59,7 +62,8 @@ module Rundoc
59
62
  fence: match[:fence],
60
63
  lang: match[:lang],
61
64
  code: match[:contents],
62
- context: context
65
+ context: context,
66
+ io: @io
63
67
  )
64
68
  end
65
69
  @contents = tail
@@ -15,7 +15,7 @@ module Rundoc
15
15
  def executed_commands
16
16
  raise "Nothing executed" unless @env[:commands].any?
17
17
 
18
- @env[:commands].map { |c| c[:object] }
18
+ @env[:commands].map { |c| c[:visibility] }
19
19
  end
20
20
 
21
21
  # @param fence [String] the fence used to start the code block like "```".
@@ -24,7 +24,8 @@ module Rundoc
24
24
  # @param code [String] the code block contents inside the fence.
25
25
  # @param context [Context::Execution] The details about where
26
26
  # the code block came from.
27
- def initialize(fence:, lang:, code:, context:)
27
+ def initialize(fence:, lang:, code:, context:, io: $stdout)
28
+ @io = io
28
29
  @fence = fence
29
30
  @lang = lang
30
31
  @code = code
@@ -54,12 +55,13 @@ module Rundoc
54
55
  env[:after] = []
55
56
  env[:context] = @context
56
57
  env[:stack] = @stack
58
+ while (item = @stack.pop)
59
+ code_command = item.build(io: @io)
57
60
 
58
- while (code_command = @stack.pop)
59
61
  code_output = code_command.call(env) || ""
60
62
  code_line = code_command.to_md(env) || ""
61
- result << code_line if code_command.render_command?
62
- result << code_output if code_command.render_result?
63
+ result << code_line if item.render_command?
64
+ result << code_output if item.render_result?
63
65
 
64
66
  PARTIAL_RESULT.replace(result)
65
67
  PARTIAL_ENV.replace(env)
@@ -67,11 +69,12 @@ module Rundoc
67
69
  env[:commands] << {
68
70
  object: code_command,
69
71
  output: code_output,
70
- command: code_line
72
+ command: code_line,
73
+ visibility: item
71
74
  }
72
75
  end
73
76
 
74
- if env[:commands].any? { |c| c[:object].not_hidden? }
77
+ if env[:commands].any? { |c| c[:visibility].not_hidden? }
75
78
  @rendered = self.class.to_doc(result: result, env: env)
76
79
  end
77
80
  self
@@ -1,9 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "parslet"
2
4
 
3
5
  module Rundoc
4
6
  class PegParser < Parslet::Parser
5
7
  rule(:spaces) { match('\s').repeat(1) }
6
8
  rule(:spaces?) { spaces.maybe }
9
+ rule(:horizontal_spaces) { match('[ \t]').repeat(1) }
7
10
  rule(:comma) { spaces? >> str(",") >> spaces? }
8
11
  rule(:digit) { match("[0-9]") }
9
12
  rule(:lparen) { str("(") >> spaces? }
@@ -36,9 +39,16 @@ module Rundoc
36
39
  ).as(:number)
37
40
  }
38
41
 
42
+ rule(:symbol) {
43
+ str(":") >> (
44
+ match("[a-zA-Z_]") >> match("[a-zA-Z0-9_]").repeat
45
+ ).as(:symbol)
46
+ }
47
+
39
48
  rule(:value) {
40
49
  string |
41
50
  number |
51
+ symbol |
42
52
  str("true").as(true) |
43
53
  str("false").as(false) |
44
54
  str("nil").as(:nil)
@@ -87,7 +97,7 @@ module Rundoc
87
97
  }
88
98
 
89
99
  rule(:seattle_method) {
90
- funcall >> spaces >>
100
+ funcall >> horizontal_spaces >>
91
101
  args.as(:args)
92
102
  }
93
103
 
@@ -172,6 +182,7 @@ module Rundoc
172
182
  rule(true => simple(:tr)) { true }
173
183
  rule(false => simple(:fa)) { false }
174
184
  rule(string: simple(:st)) { st.to_s }
185
+ rule(symbol: simple(:sy)) { sy.to_s.to_sym }
175
186
 
176
187
  rule(number: simple(:nb)) {
177
188
  /[eE.]/.match?(nb) ? Float(nb) : Integer(nb)
@@ -242,8 +253,8 @@ module Rundoc
242
253
  raise TransformError.new(message: message, line_and_column: line_and_column)
243
254
  end
244
255
  Visability.new(
245
- command: command.to_s == ">".freeze,
246
- result: result.to_s == ">".freeze
256
+ command: command.to_s == ">",
257
+ result: result.to_s == ">"
247
258
  )
248
259
  }
249
260
 
@@ -265,16 +276,21 @@ module Rundoc
265
276
  code_command
266
277
  }
267
278
 
268
- # The lines before a CodeCommand are rendered
269
- # without running any code
270
279
  rule(raw_code: simple(:raw_code)) {
271
- CodeCommand::Raw.new(raw_code)
280
+ deferred = CodeCommand::Deferred.new(args_instance: nil, runner_klass: CodeCommand::Raw)
281
+ deferred.render_command = false
282
+ deferred.render_result = true
283
+ deferred.push(raw_code.to_s)
284
+ deferred
272
285
  }
273
286
 
274
- # Sometimes
275
287
  rule(raw_code: sequence(:raw_code)) {
276
- hidden = raw_code.nil? || raw_code.empty?
277
- CodeCommand::Raw.new(raw_code, visible: !hidden)
288
+ visible = !raw_code.nil? && !raw_code.empty?
289
+ deferred = CodeCommand::Deferred.new(args_instance: nil, runner_klass: CodeCommand::Raw)
290
+ deferred.render_command = false
291
+ deferred.render_result = visible
292
+ deferred.push(raw_code.map(&:to_s).join)
293
+ deferred
278
294
  }
279
295
  end
280
296
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Rundoc
2
- VERSION = "4.1.4"
4
+ VERSION = "6.0.0"
3
5
  end