rundoc 3.1.0 → 3.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7e89c8353e4727ae39613f24c38bf3a69f027c6d1e533e64e281a588405ff57f
4
- data.tar.gz: 34df7f620c446901596deec889b9c8f785bd10e0441a54e1904b799ae9b8f0cd
3
+ metadata.gz: 2c2298eda9572df3a7acbb3d9a81ba5bdc2b5c80ba5ebc913d22308780aeff47
4
+ data.tar.gz: d9b2f86f1cfe167657f4d0d76c23f44340b6f992b959864401c1496241fbcbea
5
5
  SHA512:
6
- metadata.gz: beb56a43157798ba53c4e63d715fd75892bc6d2b93bd0b8d379168c4dcc8807af3c31a5b8ac1a8af6215fa738bad6f8b4e2df525bae1c6590ef8bf7d3e94b29d
7
- data.tar.gz: 8f6555c197fc600cc5cbf60af7d558213f50ec2a01b3d72f57e09eec628ba3169a512230b9ae106071afb2b536a6b7a314b3a8a832eb64e158565d977ab28e06
6
+ metadata.gz: 0db0233ad2b0773f453f2eb487bebc2d3cd3fb114f44aaf2295206250722ca3c4a29ceb558d1546de88865cdb120bc113ac828397b9a50c04c06b50e9aa0a0d2
7
+ data.tar.gz: d89e65b47bca1d1bd76f5894621c2ea53a957215008b043e3be6e672e87093e3a6af3a8696c9ab03e1dcf2ebb39b8362b882bc38235a0e4c1718744f30d2592c
data/CHANGELOG.md CHANGED
@@ -1,5 +1,14 @@
1
1
  ## HEAD
2
2
 
3
+ ## 3.1.2
4
+
5
+ - Fix: Using `rundoc.require` inside of a document that was `rundoc.require`-d now sources files from the correct relative document path (https://github.com/zombocom/rundoc/pull/84)
6
+ - Fix: `rundoc <file> --with-contents <dir>` now expands the path passed in to the `--with-contents` so relative paths can safely be used (https://github.com/zombocom/rundoc/pull/83)
7
+
8
+ ## 3.1.1
9
+
10
+ - Fix: Include all code sections in the event of a failure, not just the last one (https://github.com/zombocom/rundoc/pull/71)
11
+
3
12
  ## 3.1.0
4
13
 
5
14
  - Add: `--with-contents` flag that accepts a directory. The **contents** of the directory (and not the directory itself) will be copied into the working dir before execution. This is useful for debugging a single rundoc step. ()
data/README.md CHANGED
@@ -88,6 +88,7 @@ This will generate a project folder with your project in it, and a markdown `REA
88
88
  - [background.stop](#background)
89
89
  - [background.log.read](#background)
90
90
  - [background.log.clear](#background)
91
+ - [background.wait](#background)
91
92
  - Take screenshots
92
93
  - [website.visit](#screenshots)
93
94
  - [website.nav](#screenshots)
@@ -410,6 +411,13 @@ To start a process, pass in the command as the first arg, and give it a name (so
410
411
  :::>> background.start("rails server", name: "server")
411
412
  ```
412
413
 
414
+ - Arguments
415
+ - name: Identifier of the background process, used in later invocations.
416
+ - wait (Optional): A string to wait for before continuing. This is useful to block moving on until an event happend such as a server was booted or web request was received. Also see `background.wait`
417
+ - timeout (Optional): A number of seconds to wait for a given string to be found in the logs.
418
+ - out (Optional): A bash redirect. Defaults to `2>&1` to merge stderr and stdout together.
419
+ - allow_fail (Optional): Set to `true` if the command exiting shouldn't halt doc generation. Poorly named, may be renamed in the future.
420
+
413
421
  You can make the background process wait until it receives a certain string in the logs. For instance to make sure that the server is fully booted:
414
422
 
415
423
  ```
@@ -422,18 +430,38 @@ You can stop the process by referencing the name:
422
430
  :::-- background.stop(name: "server")
423
431
  ```
424
432
 
433
+ - Arguments
434
+ - name
435
+
425
436
  You can also get the log contents:
426
437
 
427
438
  ```
428
439
  :::>> background.log.read(name: "server")
429
440
  ```
430
441
 
442
+ - Arguments
443
+ - name
444
+
431
445
  You can also truncate the logs:
432
446
 
433
447
  ```
434
448
  :::>> background.log.clear(name: "server")
435
449
  ```
436
450
 
451
+ - Arguments
452
+ - name
453
+
454
+ You can also wait for a given string to appear in the logs:
455
+
456
+ ```
457
+ :::>> background.wait(name: "server", wait: "method=GET")
458
+ ```
459
+
460
+ - Arguments
461
+ - name
462
+ - wait: Same as `background.start` a string value to look for before continuing.
463
+ - timeout: Maximum number of seconds to wait
464
+
437
465
  ## Screenshots
438
466
 
439
467
  You'll need selenium and `chromedriver` installed on your system to make screenshots work. On a mac you can run:
data/lib/rundoc/cli.rb CHANGED
@@ -203,7 +203,7 @@ module Rundoc
203
203
  to: on_failure_dir
204
204
  )
205
205
 
206
- on_failure_dir.join("RUNDOC_FAILED.md").write(Rundoc::CodeSection.partial_result_to_doc)
206
+ on_failure_dir.join("RUNDOC_FAILED.md").write(Rundoc::Parser.partial_result_to_doc)
207
207
  end
208
208
 
209
209
  private def on_success(output)
@@ -111,7 +111,7 @@ module Rundoc
111
111
  end
112
112
 
113
113
  opts.on("--with-contents <dir>", "Copies contents of directory into the tmp working dir") do |v|
114
- options[:with_contents_dir] = v
114
+ options[:with_contents_dir] = File.expand_path(v)
115
115
  end
116
116
 
117
117
  opts.on("--on-success-dir <dir>", "Success dir, relative to CWD. i.e. `<rundoc.md/dir>/#{CLI::DEFAULTS::ON_SUCCESS_DIR}/`.") do |v|
@@ -14,12 +14,17 @@ class ::Rundoc::CodeCommand
14
14
  end
15
15
 
16
16
  def call(env = {})
17
- document_path = @path.expand_path(env[:context].source_dir)
17
+ execution_context = env[:context]
18
+ document_path = @path.expand_path(execution_context.source_dir)
18
19
 
19
- puts "rundoc.require: Start executing #{@path.to_s.inspect}"
20
20
  output = Rundoc::Parser.new(
21
21
  document_path.read,
22
- context: env[:context]
22
+ context: Rundoc::Context::Execution.new(
23
+ source_path: document_path,
24
+ output_dir: execution_context.output_dir,
25
+ screenshots_dirname: execution_context.screenshots_dir,
26
+ with_contents_dir: execution_context.with_contents_dir
27
+ )
23
28
  ).to_md
24
29
 
25
30
  if render_result?
@@ -1,7 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Rundoc
4
- # holds code, parses and creates CodeCommand
4
+ # A code secttion respesents a block of fenced code
5
+ #
6
+ # A document can have multiple code sections
5
7
  class CodeSection
6
8
  class ParseError < StandardError
7
9
  def initialize(options = {})
data/lib/rundoc/parser.rb CHANGED
@@ -1,4 +1,8 @@
1
1
  module Rundoc
2
+ # This poorly named class is responsible for taking in the raw markdown and running it
3
+ #
4
+ # It works by pulling out the code blocks (CodeSection), and putting them onto a stack.
5
+ # It then executes each in turn and records the results.
2
6
  class Parser
3
7
  DEFAULT_KEYWORD = ":::"
4
8
  INDENT_BLOCK = '(?<before_indent>(^\s*$\n|\A)(^(?:[ ]{4}|\t))(?<indent_contents>.*)(?<after_indent>[^\s].*$\n?(?:(?:^\s*$\n?)*^(?:[ ]{4}|\t).*[^\s].*$\n?)*))'
@@ -7,6 +11,7 @@ module Rundoc
7
11
  COMMAND_REGEX = ->(keyword) {
8
12
  /^#{keyword}(?<tag>(\s|=|-|>)?(=|-|>)?)\s*(?<command>(\S)+)\s+(?<statement>.*)$/
9
13
  }
14
+ PARTIAL_RESULT = []
10
15
 
11
16
  attr_reader :contents, :keyword, :stack, :context
12
17
 
@@ -17,6 +22,7 @@ module Rundoc
17
22
  @keyword = keyword
18
23
  @stack = []
19
24
  partition
25
+ PARTIAL_RESULT.clear
20
26
  end
21
27
 
22
28
  def to_md
@@ -27,13 +33,26 @@ module Rundoc
27
33
  else
28
34
  s
29
35
  end
36
+ PARTIAL_RESULT.replace(result)
30
37
  end
31
- result.join("")
38
+
39
+ self.class.to_doc(result: result)
32
40
  rescue => e
33
41
  File.write("README.md", result.join(""))
34
42
  raise e
35
43
  end
36
44
 
45
+ def self.partial_result_to_doc
46
+ out = to_doc(result: PARTIAL_RESULT)
47
+ unfinished = CodeSection.partial_result_to_doc
48
+ out << unfinished if unfinished
49
+ out
50
+ end
51
+
52
+ def self.to_doc(result:)
53
+ result.join("")
54
+ end
55
+
37
56
  # split into [before_code, code, after_code], process code, and re-run until tail is empty
38
57
  def partition
39
58
  until contents.empty?
@@ -1,3 +1,3 @@
1
1
  module Rundoc
2
- VERSION = "3.1.0"
2
+ VERSION = "3.1.2"
3
3
  end
@@ -1,7 +1,58 @@
1
1
  require "test_helper"
2
2
 
3
3
  class IntegrationFailureTest < Minitest::Test
4
- def test_writes_to_dir_on_failure
4
+ def test_writes_to_dir_on_failure_two_block
5
+ Dir.mktmpdir do |dir|
6
+ Dir.chdir(dir) do
7
+ dir = Pathname(dir)
8
+
9
+ source_path = dir.join("RUNDOC.md")
10
+ source_path.write <<~EOF
11
+ ```
12
+ :::>> $ mkdir one
13
+ :::>> $ touch one/rofl.txt
14
+ ```
15
+
16
+ ```
17
+ :::>> $ mkdir two
18
+ :::>> $ touch two/rofl.txt
19
+ :::>> $ touch does/not/exist.txt
20
+ ```
21
+ EOF
22
+
23
+ io = StringIO.new
24
+
25
+ error = nil
26
+ begin
27
+ Rundoc::CLI.new(
28
+ io: io,
29
+ source_path: source_path,
30
+ on_success_dir: dir.join(SUCCESS_DIRNAME)
31
+ ).call
32
+ rescue => e
33
+ error = e
34
+ end
35
+
36
+ assert error
37
+ assert_includes error.message, "exited with non zero status"
38
+
39
+ refute dir.join(SUCCESS_DIRNAME).join("two").exist?
40
+ refute dir.join(SUCCESS_DIRNAME).join("two").join("rofl.txt").exist?
41
+
42
+ assert dir.join(FAILURE_DIRNAME).join("two").exist?
43
+ assert dir.join(FAILURE_DIRNAME).join("two").join("rofl.txt").exist?
44
+
45
+ doc = dir.join(FAILURE_DIRNAME).join("RUNDOC_FAILED.md").read
46
+ assert_includes doc, "$ mkdir one"
47
+ assert_includes doc, "$ touch one/rofl.txt"
48
+
49
+ assert_includes doc, "$ mkdir two"
50
+ assert_includes doc, "$ touch two/rofl.txt"
51
+ end
52
+ end
53
+ end
54
+
55
+ def test_writes_to_dir_on_failure_one_block
5
56
  Dir.mktmpdir do |dir|
6
57
  Dir.chdir(dir) do
7
58
  dir = Pathname(dir)
@@ -60,4 +60,38 @@ class IntegrationRequireTest < Minitest::Test
60
60
  end
61
61
  end
62
62
  end
63
+
64
+ def test_require_is_relative_to_current_file_not_source_file
65
+ Dir.mktmpdir do |dir|
66
+ Dir.chdir(dir) do
67
+ dir = Pathname(dir)
68
+
69
+ source_path = dir.join("RUNDOC.md")
70
+ source_path.write <<~EOF
71
+ ```
72
+ :::>> rundoc.require "./src/a.md"
73
+ ```
74
+ EOF
75
+
76
+ dir.join("src").tap(&:mkpath).join("a.md").write <<~EOF
77
+ ```
78
+ :::-> rundoc.require "./b.md"
79
+ ```
80
+ EOF
81
+
82
+ dir.join("src").join("b.md").write <<~EOF
83
+ ```
84
+ :::-> print.text Hello World!
85
+ ```
86
+ EOF
87
+
88
+ parsed = parse_contents(
89
+ source_path.read,
90
+ source_path: source_path
91
+ )
92
+ actual = parsed.to_md.gsub(Rundoc::CodeSection::AUTOGEN_WARNING, "")
93
+ assert_equal "Hello World!", actual.strip
94
+ end
95
+ end
96
+ end
63
97
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rundoc
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.0
4
+ version: 3.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Richard Schneeman
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-11-21 00:00:00.000000000 Z
11
+ date: 2024-11-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor