Class: Ast::Merge::Git::Corpus

Inherits:
Object
  • Object
show all
Defined in:
lib/ast/merge/git/corpus.rb,
sig/ast/merge/git.rbs

Overview

rubocop:disable Metrics/AbcSize, Metrics/ClassLength, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity -- evidence validation and raw-result assembly remain explicit and auditable Validates and executes pinned Git-history corpus cases.

Defined Under Namespace

Classes: Error

Constant Summary collapse

CLASSIFICATIONS =

Returns:

  • (Array[String])
%w[
  exact_automatic_resolution
  structurally_equivalent_resolution
  conflict_expected
  ambiguous_manual_review
  excluded
].freeze
BACKLOG_STATUSES =

Returns:

  • (Array[String])
%w[blocked admitted resolved].freeze
SHA_PATTERN =

Returns:

  • (Regexp)
/\A[0-9a-f]{40}\z/
CASE_ID_PATTERN =
/\A[a-z0-9]+(?:-[a-z0-9]+)*\z/
REQUIRED_CASE_KEYS =

Returns:

  • (Array[String])
%w[
  case_id merge_commit base_commit parent_commits path blob_oids selector
  capability_tags stratum oracle
].freeze

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(manifest) ⇒ Corpus

Returns a new instance of Corpus.

Parameters:

  • manifest (Hash[String, untyped])


41
42
43
# File 'lib/ast/merge/git/corpus.rb', line 41

def initialize(manifest)
  @manifest = manifest
end

Instance Attribute Details

#manifestHash[String, untyped] (readonly)

Returns the value of attribute manifest.

Returns:

  • (Hash[String, untyped])


31
32
33
# File 'lib/ast/merge/git/corpus.rb', line 31

def manifest
  @manifest
end

Class Method Details

.load(path) ⇒ Corpus

Parameters:

  • path (String)

Returns:



33
34
35
36
37
38
39
# File 'lib/ast/merge/git/corpus.rb', line 33

def self.load(path)
  new(JSON.parse(File.binread(path)))
rescue JSON::ParserError => e
  raise Error, "invalid manifest JSON: #{e.message}"
rescue SystemCallError => e
  raise Error, "cannot read manifest: #{e.message}"
end

Instance Method Details

#cases(case_id = nil) ⇒ Array[Hash[String, untyped]]

Parameters:

  • case_id (String, nil) (defaults to: nil)

Returns:

  • (Array[Hash[String, untyped]])


61
62
63
64
65
66
67
# File 'lib/ast/merge/git/corpus.rb', line 61

def cases(case_id = nil)
  validate!
  return manifest['cases'] unless case_id

  [manifest['cases'].find { |item| item['case_id'] == case_id } ||
    raise(Error, "unknown case: #{case_id}")]
end

#validate!true

Returns:

  • (true)

Raises:



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/ast/merge/git/corpus.rb', line 45

def validate!
  require_keys(manifest, %w[schema_version corpus_id source claim_policy admission_backlog cases], 'manifest')
  raise Error, 'schema_version must be 1' unless manifest['schema_version'] == 1

  validate_source!
  validate_backlog!
  raise Error, 'cases must be a non-empty array' unless manifest['cases'].is_a?(Array) && manifest['cases'].any?

  ids = manifest['cases'].map { |item| validate_case!(item) }
  raise Error, 'case_id values must be unique' unless ids.uniq.length == ids.length

  validate_admitted_backlog!(ids)

  true
end