Module: Ast::Merge::Git::BenchmarkAdapter

Defined in:
lib/ast/merge/git/benchmark_adapter.rb,
sig/ast/merge/git.rbs

Overview

Versioned JSONL protocol for repeated benchmark operations in one Ruby process. rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/ModuleLength, Metrics/PerceivedComplexity -- protocol validation and dispatch remain explicit

Constant Summary collapse

REQUEST_SCHEMA =

Returns:

  • (String)
'structuredmerge.benchmark.adapter-request/v1'
RESPONSE_SCHEMA =

Returns:

  • (String)
'structuredmerge.benchmark.adapter-response/v1'
OPERATIONS =

Returns:

  • (Array[String])
%w[diff2 merge2 merge3].freeze
SOURCE_ROLES =

Returns:

  • (Hash[String, Array[String]])
{
  'diff2' => %w[before after],
  'merge2' => %w[incoming current],
  'merge3' => %w[base ours theirs]
}.freeze

Class Method Summary collapse

Class Method Details

.decode_source(encoded) ⇒ String

Parameters:

  • encoded (String)

Returns:

  • (String)


146
147
148
# File 'lib/ast/merge/git/benchmark_adapter.rb', line 146

def decode_source(encoded)
  encoded.unpack1('m0')
end

.encode_source(source) ⇒ String

Parameters:

  • source (String)

Returns:

  • (String)


142
143
144
# File 'lib/ast/merge/git/benchmark_adapter.rb', line 142

def encode_source(source)
  [source.b].pack('m0')
end

.execute(request) ⇒ Hash[String, untyped]

Parameters:

  • request (Hash[String, untyped])

Returns:

  • (Hash[String, untyped])


35
36
37
38
39
40
41
42
43
44
# File 'lib/ast/merge/git/benchmark_adapter.rb', line 35

def execute(request)
  started = monotonic_nanoseconds
  operation, selector, sources = validate_request(request)
  require selector.fetch('require')
  result = dispatch(operation, selector, sources, request.fetch('path_name'))

  response_for(request.fetch('request_id'), operation, result, monotonic_nanoseconds - started)
rescue ArgumentError, Ast::Merge::Error, KeyError, LoadError => e
  error_response(request.is_a?(Hash) ? request['request_id'] : nil, e, started: started)
end

.serve(input: $stdin, output: $stdout) ⇒ void

This method returns an undefined value.

Parameters:

  • input: (IO) (defaults to: $stdin)
  • output: (IO) (defaults to: $stdout)


22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/ast/merge/git/benchmark_adapter.rb', line 22

def serve(input: $stdin, output: $stdout)
  input.each_line do |line|
    next if line.strip.empty?

    response = execute(JSON.parse(line))
    output.puts(JSON.generate(response))
    output.flush
  rescue JSON::ParserError => e
    output.puts(JSON.generate(error_response(nil, e)))
    output.flush
  end
end