Module: Bryton::Lite::Runner
- Defined in:
- lib/bryton/lite.rb
Overview
Runs tests in the current directory tree.
Defined Under Namespace
Classes: Capture
Class Method Summary collapse
-
.dir(path, &block) ⇒ Object
Runs the tests in a directory.
-
.execute(name, path) ⇒ Object
Executes a file, parses the results, and returns the results.
-
.last_non_blank(str) ⇒ Object
Finds the last non-blank line in STDOUT from the file execution.
-
.run(&block) ⇒ Object
Run the tests.
-
.success? ⇒ Boolean
Returns the success or failure of the test run.
Class Method Details
.dir(path, &block) ⇒ Object
Runs the tests in a directory. Don’t call this method directly.
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
# File 'lib/bryton/lite.rb', line 54 def self.dir(path, &block) entries = Dir.entries('./') entries = entries.reject {|entry| entry.match(/\A\.+\z/mu)} # note file and path Bryton::Lite::Tests['file'] = {} Bryton::Lite::Tests['file']['path'] = path Bryton::Lite::Tests['file']['dir'] = true # loop through entries entries.each do |entry| entry_path = "#{path}/#{entry}" # if directory, recurse into it if File.directory?(entry) Dir.chdir(entry) do Bryton::Lite::Tests.nest do self.dir(entry_path, &block) end end # elsif the file is executable then execute it elsif File.executable?(entry) results = execute(entry, entry_path) Bryton::Lite::Tests.add_to_nest results if block_given? yield entry_path, results end end end end |
.execute(name, path) ⇒ Object
Executes a file, parses the results, and returns the results. Don’t call this method directly.
98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 |
# File 'lib/bryton/lite.rb', line 98 def self.execute(name, path) # init rv = {} rv['file'] = {} rv['file']['path'] = path # execute script cap = Bryton::Lite::Runner::Capture.new("./#{name}") # if script crashed if not cap.success? rv['success'] = false rv['errors'] ||= [] # build error error = {'id'=>'execution-failed'} error['id'] = 'execution-failed' error['stderr'] = cap.stderr # add error and return rv['errors'].push(error) return rv # if we get a non-blank line, attempt to parse it as JSON elsif non_blank = self.last_non_blank(cap.stdout) begin # retrieve and parse results results = JSON.parse( non_blank ) rv = rv.merge(results) # ensure that if there are errors, success is false if rv['errors'] and rv['errors'].any? rv['success'] = false end # return return rv rescue rv['success'] = false rv['errors'] = [] rv['errors'].push({'id'=>'invalid-json'}) return rv end # did not get non-blank line else rv['success'] = false rv['errors'] = [] rv['errors'].push({'id'=>'no-results'}) return rv end end |
.last_non_blank(str) ⇒ Object
Finds the last non-blank line in STDOUT from the file execution. Don’t call this method directly.
162 163 164 165 166 167 168 169 170 171 |
# File 'lib/bryton/lite.rb', line 162 def self.last_non_blank(str) str.lines.reverse.each do |line| if line.match(/\S/mu) return line end end # didn't find non-blank return nil end |
.run(&block) ⇒ Object
Run the tests. If you pass in a block, each test result is yielded with the path to the file and the results hash.
37 38 39 40 41 42 |
# File 'lib/bryton/lite.rb', line 37 def self.run(&block) Bryton::Lite::Tests.reset dir('.', &block) Bryton::Lite::Tests.try_succeed Bryton::Lite::Tests.reorder_results end |