Class: RailVerdict::VerificationEnvironment
- Inherits:
-
Object
- Object
- RailVerdict::VerificationEnvironment
- Defined in:
- lib/rail_verdict/verification_environment.rb
Constant Summary collapse
- MAX_ENV_PROBE_BYTES =
64 * 1024
- MAX_PROBE_TIMEOUT =
5.0
Instance Attribute Summary collapse
-
#analyzer_versions ⇒ Object
readonly
Returns the value of attribute analyzer_versions.
-
#available ⇒ Object
readonly
Returns the value of attribute available.
-
#digest ⇒ Object
readonly
Returns the value of attribute digest.
-
#railverdict_version ⇒ Object
readonly
Returns the value of attribute railverdict_version.
-
#ruby_engine ⇒ Object
readonly
Returns the value of attribute ruby_engine.
-
#ruby_version ⇒ Object
readonly
Returns the value of attribute ruby_version.
-
#unavailable_reason ⇒ Object
readonly
Returns the value of attribute unavailable_reason.
Class Method Summary collapse
- .capture(repository_root:, configuration: nil, runner: ProcessRunner, timeout_seconds: MAX_PROBE_TIMEOUT) ⇒ Object
- .capture_for_receipt(receipt_analyzer_keys, repository_root:, configuration: nil, runner: ProcessRunner, timeout_seconds: MAX_PROBE_TIMEOUT) ⇒ Object
Instance Method Summary collapse
- #available? ⇒ Boolean
-
#initialize(railverdict_version:, ruby_engine:, ruby_version:, analyzer_versions:, digest: nil, unavailable_reason: nil, available: true) ⇒ VerificationEnvironment
constructor
A new instance of VerificationEnvironment.
Constructor Details
#initialize(railverdict_version:, ruby_engine:, ruby_version:, analyzer_versions:, digest: nil, unavailable_reason: nil, available: true) ⇒ VerificationEnvironment
Returns a new instance of VerificationEnvironment.
14 15 16 17 18 19 20 21 22 23 |
# File 'lib/rail_verdict/verification_environment.rb', line 14 def initialize(railverdict_version:, ruby_engine:, ruby_version:, analyzer_versions:, digest: nil, unavailable_reason: nil, available: true) @railverdict_version = railverdict_version @ruby_engine = ruby_engine @ruby_version = ruby_version @analyzer_versions = analyzer_versions.freeze @digest = digest @unavailable_reason = unavailable_reason @available = available freeze end |
Instance Attribute Details
#analyzer_versions ⇒ Object (readonly)
Returns the value of attribute analyzer_versions.
12 13 14 |
# File 'lib/rail_verdict/verification_environment.rb', line 12 def analyzer_versions @analyzer_versions end |
#available ⇒ Object (readonly)
Returns the value of attribute available.
12 13 14 |
# File 'lib/rail_verdict/verification_environment.rb', line 12 def available @available end |
#digest ⇒ Object (readonly)
Returns the value of attribute digest.
12 13 14 |
# File 'lib/rail_verdict/verification_environment.rb', line 12 def digest @digest end |
#railverdict_version ⇒ Object (readonly)
Returns the value of attribute railverdict_version.
12 13 14 |
# File 'lib/rail_verdict/verification_environment.rb', line 12 def railverdict_version @railverdict_version end |
#ruby_engine ⇒ Object (readonly)
Returns the value of attribute ruby_engine.
12 13 14 |
# File 'lib/rail_verdict/verification_environment.rb', line 12 def ruby_engine @ruby_engine end |
#ruby_version ⇒ Object (readonly)
Returns the value of attribute ruby_version.
12 13 14 |
# File 'lib/rail_verdict/verification_environment.rb', line 12 def ruby_version @ruby_version end |
#unavailable_reason ⇒ Object (readonly)
Returns the value of attribute unavailable_reason.
12 13 14 |
# File 'lib/rail_verdict/verification_environment.rb', line 12 def unavailable_reason @unavailable_reason end |
Class Method Details
.capture(repository_root:, configuration: nil, runner: ProcessRunner, timeout_seconds: MAX_PROBE_TIMEOUT) ⇒ Object
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 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 86 87 88 89 90 91 92 93 94 95 96 97 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 |
# File 'lib/rail_verdict/verification_environment.rb', line 29 def self.capture(repository_root:, configuration: nil, runner: ProcessRunner, timeout_seconds: MAX_PROBE_TIMEOUT) railverdict_version = RailVerdict::VERSION.to_s ruby_engine = RUBY_ENGINE.to_s ruby_version = RUBY_VERSION.to_s config = configuration if config.nil? && repository_root begin root_real = File.realpath(repository_root) config_path = File.join(root_real, ".railverdict.yml") config = Configuration.load(config_path) if File.file?(config_path) rescue StandardError config = nil end end analyzer_versions = {} probes_failed = [] if config config.analyzers.each do |name, selection| next unless selection.fetch("enabled") adapter_class = Check::REGISTRY[name] next unless adapter_class adapter = build_adapter(name) next unless adapter probe_timeout = resolve_probe_timeout(config, name, timeout_seconds) probe = probe_adapter(adapter, repository_root, runner, probe_timeout) if name.to_s == "simplecov" && probe && probe.status == "unavailable" && probe..to_s.include?("coverage file is absent") # SimpleCov without coverage file is not a version-probe failure; skip it next end if probe.nil? || probe.status != "succeeded" || probe.version.nil? || probe.version.to_s.strip.empty? if selection["required"] == false next end probes_failed << name next end version = RailVerdict::Analyzers::Shared.canonical_tool_version(probe.version) analyzer_versions[name.to_s] = version end end # If any enabled required analyzer probe failed, environment is unobservable fail-closed unless probes_failed.empty? return new( railverdict_version: railverdict_version, ruby_engine: ruby_engine, ruby_version: ruby_version, analyzer_versions: analyzer_versions.sort.to_h, digest: nil, unavailable_reason: "analyzer_version_unobservable:#{probes_failed.sort.join(',')}", available: false ) end # Detect "unknown" canonicalized versions as unobservable as well unknown_keys = analyzer_versions.select { |_, v| v == "unknown" }.keys unless unknown_keys.empty? return new( railverdict_version: railverdict_version, ruby_engine: ruby_engine, ruby_version: ruby_version, analyzer_versions: analyzer_versions.sort.to_h, digest: nil, unavailable_reason: "analyzer_version_unobservable:#{unknown_keys.sort.join(',')}", available: false ) end sorted = analyzer_versions.sort.to_h payload = { "railverdict_version" => railverdict_version, "ruby_engine" => ruby_engine, "ruby_version" => ruby_version, "analyzer_versions" => sorted } digest = "sha256:#{Digest::SHA256.hexdigest(CanonicalJSON.generate(payload))}" new( railverdict_version: railverdict_version, ruby_engine: ruby_engine, ruby_version: ruby_version, analyzer_versions: sorted, digest: digest, available: true ) rescue StandardError => error new( railverdict_version: RailVerdict::VERSION.to_s, ruby_engine: RUBY_ENGINE.to_s, ruby_version: RUBY_VERSION.to_s, analyzer_versions: {}, digest: nil, unavailable_reason: "environment_capture_failed:#{error.class}", available: false ) end |
.capture_for_receipt(receipt_analyzer_keys, repository_root:, configuration: nil, runner: ProcessRunner, timeout_seconds: MAX_PROBE_TIMEOUT) ⇒ Object
130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 |
# File 'lib/rail_verdict/verification_environment.rb', line 130 def self.capture_for_receipt(receipt_analyzer_keys, repository_root:, configuration: nil, runner: ProcessRunner, timeout_seconds: MAX_PROBE_TIMEOUT) keys = Array(receipt_analyzer_keys).map(&:to_s) return capture(repository_root: repository_root, configuration: configuration, runner: runner, timeout_seconds: timeout_seconds) if keys.empty? env = capture(repository_root: repository_root, configuration: configuration, runner: runner, timeout_seconds: timeout_seconds) return env unless env.available? filtered = env.analyzer_versions.select { |k, _| keys.include?(k) } payload = { "railverdict_version" => env.railverdict_version, "ruby_engine" => env.ruby_engine, "ruby_version" => env.ruby_version, "analyzer_versions" => filtered.sort.to_h } digest = "sha256:#{Digest::SHA256.hexdigest(CanonicalJSON.generate(payload))}" new( railverdict_version: env.railverdict_version, ruby_engine: env.ruby_engine, ruby_version: env.ruby_version, analyzer_versions: filtered.sort.to_h, digest: digest, available: true ) end |
Instance Method Details
#available? ⇒ Boolean
25 26 27 |
# File 'lib/rail_verdict/verification_environment.rb', line 25 def available? @available end |