lib/covered/config.rb in covered-0.19.1 vs lib/covered/config.rb in covered-0.20.0
- old
+ new
@@ -1,29 +1,33 @@
# frozen_string_literal: true
# Released under the MIT License.
-# Copyright, 2022, by Samuel Williams.
+# Copyright, 2022-2023, by Samuel Williams.
require_relative 'policy'
module Covered
class Config
PATH = "config/covered.rb"
+ def self.root
+ ENV['COVERED_ROOT'] || Dir.pwd
+ end
+
def self.path(root)
- path = ::File.join(root, PATH)
+ path = ::File.expand_path(PATH, root)
if ::File.exist?(path)
return path
end
end
def self.coverage
ENV['COVERAGE']
end
- def self.load(root: Dir.pwd, coverage: self.coverage)
+ def self.load(root: self.root, coverage: self.coverage)
derived = Class.new(self)
if path = self.path(root)
config = Module.new
config.module_eval(::File.read(path), path)
@@ -35,58 +39,98 @@
def initialize(root, coverage)
@root = root
@coverage = coverage
@policy = nil
+
+ @environment = nil
end
- def record?
+ def report?
!!@coverage
end
+ alias :record? :report?
+
attr :coverage
def policy
@policy ||= Policy.new.tap{|policy| make_policy(policy)}.freeze
end
def output
policy.output
end
- def enable
- policy.enable
+ def start
+ # Save and setup the environment:
+ @environment = ENV.to_h
+ autostart!
+
+ # Start coverage tracking:
+ policy.start
end
- def disable
- policy.disable
+ def finish
+ # Finish coverage tracking:
+ policy.finish
+
+ # Restore the environment:
+ ENV.replace(@environment)
+ @environment = nil
end
- def flush
- policy.flush
- end
-
def call(output)
policy.call(output)
end
def each(&block)
policy.each(&block)
end
+ def ignore_paths
+ ['test/', 'fixtures/', 'spec/', 'vendor/', 'config/']
+ end
+
+
# Override this method to implement your own policy.
def make_policy(policy)
# Only files in the root would be tracked:
policy.root(@root)
+ patterns = ignore_paths.map do |path|
+ File.join(@root, path)
+ end
+
# We will ignore any files in the test or spec directory:
- policy.skip(/^.*\/(test|fixtures|spec|vendor|config)\//)
+ policy.skip(Regexp.union(patterns))
# We will include all files under lib, even if they aren't loaded:
policy.include("lib/**/*.rb")
policy.persist!
policy.reports!(@coverage)
+ end
+
+ protected
+
+ REQUIRE_COVERED_AUTOSTART = '-rcovered/autostart'
+
+ def autostart!
+ if rubyopt = ENV['RUBYOPT'] and !rubyopt.empty?
+ rubyopt = [rubyopt.strip, REQUIRE_COVERED_AUTOSTART].join(' ')
+ else
+ rubyopt = REQUIRE_COVERED_AUTOSTART
+ end
+
+ ENV['RUBYOPT'] = rubyopt
+
+ unless ENV['COVERED_ROOT']
+ ENV['COVERED_ROOT'] = @root
+ end
+
+ # Don't report coverage in child processes:
+ ENV.delete('COVERAGE')
end
end
end