Class: VCR::UnusedCassettes::CallContext
- Inherits:
-
Object
- Object
- VCR::UnusedCassettes::CallContext
- Defined in:
- lib/vcr/unused_cassettes/call_context.rb
Defined Under Namespace
Classes: MultiValue
Constant Summary collapse
- ValueUnresolveable =
Class.new(StandardError)
Instance Method Summary collapse
- #enter_method(def_node) ⇒ Object
- #exit_method ⇒ Object
- #extract_value(node, string_interpolation_error: :raise) ⇒ Object
-
#initialize(method_index: nil) ⇒ CallContext
constructor
A new instance of CallContext.
- #resolve_constant(constant_name) ⇒ Object
- #resolve_variable(variable_name) ⇒ Object
- #track(node) ⇒ Object
Constructor Details
#initialize(method_index: nil) ⇒ CallContext
Returns a new instance of CallContext.
11 12 13 14 15 16 17 18 |
# File 'lib/vcr/unused_cassettes/call_context.rb', line 11 def initialize(method_index: nil) @method_index = method_index @context = { variables: {}, constants: {} } @parameter_scopes = [] end |
Instance Method Details
#enter_method(def_node) ⇒ Object
32 33 34 |
# File 'lib/vcr/unused_cassettes/call_context.rb', line 32 def enter_method(def_node) @parameter_scopes.push(build_parameter_frame(def_node)) end |
#exit_method ⇒ Object
36 37 38 |
# File 'lib/vcr/unused_cassettes/call_context.rb', line 36 def exit_method @parameter_scopes.pop end |
#extract_value(node, string_interpolation_error: :raise) ⇒ Object
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 |
# File 'lib/vcr/unused_cassettes/call_context.rb', line 51 def extract_value(node, string_interpolation_error: :raise) case node.type when :nil_node nil when :string_node node.unescaped when :symbol_node node.unescaped.to_sym when :hash_node, :keyword_hash_node node.elements.each_with_object({}) do |element, hash| if element.type == :assoc_splat_node hash.merge(extract_value(element.value, string_interpolation_error: string_interpolation_error)) next end key = extract_value(element.key, string_interpolation_error: string_interpolation_error) value = extract_value(element.value, string_interpolation_error: string_interpolation_error) hash[key] = value rescue ValueUnresolveable next end when :array_node node.elements.map do |element| extract_value(element, string_interpolation_error: string_interpolation_error) end when :interpolated_string_node = node.parts.map { |part_node| (part_node, string_interpolation_error) } combinations = .reduce([[]]) do |acc, | acc.flat_map { |prefix| .map { |opt| prefix + [opt] } } end results = combinations.map { |parts| parts.map(&:to_s).join }.uniq (results.size == 1) ? results.first : MultiValue.new(results) when :local_variable_read_node, :instance_variable_read_node unless variable_bound?(node.name) raise ValueUnresolveable, "Could not resolve value for node: #{node.inspect}" end value = resolve_variable(node.name) if value.is_a?(MultiValue) && string_interpolation_error != :wildcard raise ValueUnresolveable, "Multi-value binding cannot be embedded: #{node.inspect}" end value when :constant_read_node @context.dig(:constants, node.name) when :assoc_splat_node extract_value(node.value, string_interpolation_error: string_interpolation_error) else if node.respond_to?(:value) && !node.value.is_a?(Prism::Node) node.value else raise ValueUnresolveable, "Could not resolve value for node: #{node.inspect}" end end end |
#resolve_constant(constant_name) ⇒ Object
47 48 49 |
# File 'lib/vcr/unused_cassettes/call_context.rb', line 47 def resolve_constant(constant_name) @context.dig(:constants, constant_name) end |
#resolve_variable(variable_name) ⇒ Object
40 41 42 43 44 45 |
# File 'lib/vcr/unused_cassettes/call_context.rb', line 40 def resolve_variable(variable_name) @parameter_scopes.reverse_each do |frame| return frame[variable_name] if frame.key?(variable_name) end @context.dig(:variables, variable_name) end |
#track(node) ⇒ Object
20 21 22 23 24 25 26 27 28 29 30 |
# File 'lib/vcr/unused_cassettes/call_context.rb', line 20 def track(node) reset_local_variables! if new_test_node?(node) case node.type when :local_variable_write_node store_variable(node.name, node.value) when :constant_write_node store_constant(node.name, node.value) when :instance_variable_write_node store_variable(node.name, node.value) end end |