Module: SimpleCov::ResultMerger
- Defined in:
- lib/simplecov/result_merger.rb
Overview
Singleton that is responsible for caching, loading and merging SimpleCov::Results into a single result for coverage analysis based upon multiple test suites.
Class Method Summary collapse
-
.clear_resultset ⇒ Object
Clear out the previously cached .resultset.
- .merge_and_store(*results) ⇒ Object
-
.merge_results(*results) ⇒ Object
Merge two or more SimpleCov::Results into a new one with merged coverage data and the command_name for the result consisting of a join on all source result’s names.
-
.merged_result ⇒ Object
Gets all SimpleCov::Results from cache, merges them and produces a new SimpleCov::Result with merged coverage data and the command_name for the result consisting of a join on all source result’s names.
-
.results ⇒ Object
Gets the resultset hash and re-creates all included instances of SimpleCov::Result from that.
-
.resultset ⇒ Object
Loads the cached resultset from JSON and returns it as a Hash, caching it for subsequent accesses.
-
.resultset_path ⇒ Object
The path to the .resultset.json cache file.
- .resultset_writelock ⇒ Object
-
.store_result(result) ⇒ Object
Saves the given SimpleCov::Result in the resultset cache.
-
.stored_data ⇒ Object
Returns the contents of the resultset cache as a string or if the file is missing or empty nil.
-
.synchronize_resultset ⇒ Object
Ensure only one process is reading or writing the resultset at any given time.
Class Method Details
.clear_resultset ⇒ Object
Clear out the previously cached .resultset
120 121 122 |
# File 'lib/simplecov/result_merger.rb', line 120 def clear_resultset @resultset = nil end |
.merge_and_store(*results) ⇒ Object
60 61 62 63 64 |
# File 'lib/simplecov/result_merger.rb', line 60 def merge_and_store(*results) result = merge_results(*results) store_result(result) if result result end |
.merge_results(*results) ⇒ Object
Merge two or more SimpleCov::Results into a new one with merged coverage data and the command_name for the result consisting of a join on all source result’s names
69 70 71 72 73 74 75 76 |
# File 'lib/simplecov/result_merger.rb', line 69 def merge_results(*results) parsed_results = JSON.parse(JSON.dump(results.map(&:original_result))) combined_result = SimpleCov::Combine::ResultsCombiner.combine(*parsed_results) result = SimpleCov::Result.new(combined_result) # Specify the command name result.command_name = results.map(&:command_name).sort.join(", ") result end |
.merged_result ⇒ Object
Gets all SimpleCov::Results from cache, merges them and produces a new SimpleCov::Result with merged coverage data and the command_name for the result consisting of a join on all source result’s names
83 84 85 |
# File 'lib/simplecov/result_merger.rb', line 83 def merged_result merge_results(*results) end |
.results ⇒ Object
Gets the resultset hash and re-creates all included instances of SimpleCov::Result from that. All results that are above the SimpleCov.merge_timeout will be dropped. Returns an array of SimpleCov::Result items.
55 56 57 58 |
# File 'lib/simplecov/result_merger.rb', line 55 def results results = Result.from_hash(resultset) results.select { |result| result.time_since_creation < SimpleCov.merge_timeout } end |
.resultset ⇒ Object
Loads the cached resultset from JSON and returns it as a Hash, caching it for subsequent accesses.
24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
# File 'lib/simplecov/result_merger.rb', line 24 def resultset @resultset ||= begin data = stored_data if data begin JSON.parse(data) || {} rescue StandardError {} end else {} end end end |
.resultset_path ⇒ Object
The path to the .resultset.json cache file
14 15 16 |
# File 'lib/simplecov/result_merger.rb', line 14 def resultset_path File.join(SimpleCov.coverage_path, ".resultset.json") end |
.resultset_writelock ⇒ Object
18 19 20 |
# File 'lib/simplecov/result_merger.rb', line 18 def resultset_writelock File.join(SimpleCov.coverage_path, ".resultset.json.lock") end |
.store_result(result) ⇒ Object
Saves the given SimpleCov::Result in the resultset cache
88 89 90 91 92 93 94 95 96 97 98 99 100 |
# File 'lib/simplecov/result_merger.rb', line 88 def store_result(result) synchronize_resultset do # Ensure we have the latest, in case it was already cached clear_resultset new_set = resultset command_name, data = result.to_hash.first new_set[command_name] = data File.open(resultset_path, "w+") do |f_| f_.puts JSON.pretty_generate(new_set) end end true end |
.stored_data ⇒ Object
Returns the contents of the resultset cache as a string or if the file is missing or empty nil
40 41 42 43 44 45 46 47 48 49 |
# File 'lib/simplecov/result_merger.rb', line 40 def stored_data synchronize_resultset do return unless File.exist?(resultset_path) data = File.read(resultset_path) return if data.nil? || data.length < 2 data end end |
.synchronize_resultset ⇒ Object
Ensure only one process is reading or writing the resultset at any given time
104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
# File 'lib/simplecov/result_merger.rb', line 104 def synchronize_resultset # make it reentrant return yield if defined?(@resultset_locked) && @resultset_locked begin @resultset_locked = true File.open(resultset_writelock, "w+") do |f| f.flock(File::LOCK_EX) yield end ensure @resultset_locked = false end end |