Module: Julewire::GCP::SourceLocation

Defined in:
lib/julewire/gcp/source_location.rb

Class Method Summary collapse

Class Method Details

.call(options) ⇒ Object



11
12
13
14
15
16
17
18
# File 'lib/julewire/gcp/source_location.rb', line 11

def call(options)
  values = Core::Integration::Values::Shape
  location = {}
  values.append_field(location, "file", string_value(options[:file]))
  values.append_field(location, "line", line_value(options[:line]))
  values.append_field(location, "function", string_value(options[:function]))
  location unless location.empty?
end

.from_backtrace_line(line) ⇒ Object



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/julewire/gcp/source_location.rb', line 30

def from_backtrace_line(line)
  line = line.to_s
  index = line.rindex(FUNCTION_SEPARATOR)
  if index
    location = line[0, index]
    function = line[(index + FUNCTION_SEPARATOR.length)..]
  else
    location = line
    function = nil
  end
  file, line_number = split_file_and_line(location)
  return unless line_number

  call(
    file: file,
    line: line_number,
    function: normalize_function(function)
  )
end

.from_error(error) ⇒ Object



20
21
22
23
24
25
26
27
28
# File 'lib/julewire/gcp/source_location.rb', line 20

def from_error(error)
  return unless error.is_a?(Hash)

  Array(error[:backtrace]).each do |line|
    location = from_backtrace_line(line)
    return location if location
  end
  nil
end

.line_value(value) ⇒ Object



56
57
58
59
# File 'lib/julewire/gcp/source_location.rb', line 56

def line_value(value)
  string = value.to_s
  string if string.match?(/\A\d+\z/)
end

.normalize_function(function) ⇒ Object



72
73
74
75
76
77
78
79
80
# File 'lib/julewire/gcp/source_location.rb', line 72

def normalize_function(function)
  return unless function

  if function.length >= 2 && quoted?(function.getbyte(0)) && quoted?(function.getbyte(-1))
    function[1...-1]
  else
    function
  end
end

.quoted?(byte) ⇒ Boolean

Returns:

  • (Boolean)


82
83
84
# File 'lib/julewire/gcp/source_location.rb', line 82

def quoted?(byte)
  QUOTE_BYTES.include?(byte)
end

.split_file_and_line(location) ⇒ Object



61
62
63
64
65
66
67
68
69
70
# File 'lib/julewire/gcp/source_location.rb', line 61

def split_file_and_line(location)
  index = location.rindex(":")
  return unless index

  file = location[0, index]
  line = location[(index + 1)..]
  return if file.empty? || !line.match?(/\A\d+\z/)

  [file, line]
end

.string_value(value) ⇒ Object



50
51
52
53
54
# File 'lib/julewire/gcp/source_location.rb', line 50

def string_value(value)
  return if Core::Integration::Values::Read.blank?(value)

  value.to_s
end