Class: VCR::UnusedCassettes::CassetteUsageFinder
- Inherits:
-
Object
- Object
- VCR::UnusedCassettes::CassetteUsageFinder
- Defined in:
- lib/vcr/unused_cassettes/cassette_usage_finder.rb
Instance Attribute Summary collapse
-
#call_context ⇒ Object
Returns the value of attribute call_context.
-
#filename ⇒ Object
Returns the value of attribute filename.
-
#used_cassettes ⇒ Object
Returns the value of attribute used_cassettes.
-
#warnings ⇒ Object
Returns the value of attribute warnings.
Instance Method Summary collapse
- #build_warning(node, error) ⇒ Object
- #extract_options(node) ⇒ Object
- #find_cassette_name(node) ⇒ Object
- #find_cassette_usages ⇒ Object
- #find_cassette_usages_in(node) ⇒ Object
-
#initialize(filename) ⇒ CassetteUsageFinder
constructor
A new instance of CassetteUsageFinder.
- #node_contains_call?(node) ⇒ Boolean
- #record_cassette_uses(node) ⇒ Object
Constructor Details
#initialize(filename) ⇒ CassetteUsageFinder
Returns a new instance of CassetteUsageFinder.
9 10 11 12 13 |
# File 'lib/vcr/unused_cassettes/cassette_usage_finder.rb', line 9 def initialize(filename) self.filename = filename self.used_cassettes = [] self.warnings = [] end |
Instance Attribute Details
#call_context ⇒ Object
Returns the value of attribute call_context.
7 8 9 |
# File 'lib/vcr/unused_cassettes/cassette_usage_finder.rb', line 7 def call_context @call_context end |
#filename ⇒ Object
Returns the value of attribute filename.
7 8 9 |
# File 'lib/vcr/unused_cassettes/cassette_usage_finder.rb', line 7 def filename @filename end |
#used_cassettes ⇒ Object
Returns the value of attribute used_cassettes.
7 8 9 |
# File 'lib/vcr/unused_cassettes/cassette_usage_finder.rb', line 7 def used_cassettes @used_cassettes end |
#warnings ⇒ Object
Returns the value of attribute warnings.
7 8 9 |
# File 'lib/vcr/unused_cassettes/cassette_usage_finder.rb', line 7 def warnings @warnings end |
Instance Method Details
#build_warning(node, error) ⇒ Object
95 96 97 98 99 100 101 |
# File 'lib/vcr/unused_cassettes/cassette_usage_finder.rb', line 95 def build_warning(node, error) Warning.new.tap do |warning| warning. = "Could not determine cassette name for #{filename}:#{node.location.start_line}" warning.details = error. warning.backtrace = error.backtrace end end |
#extract_options(node) ⇒ Object
66 67 68 69 70 71 72 73 74 75 |
# File 'lib/vcr/unused_cassettes/cassette_usage_finder.rb', line 66 def (node) return nil if node.arguments.arguments.size <= 1 node.arguments.arguments.each do |argument_node| next unless argument_node.is_a?(Prism::KeywordHashNode) return call_context.extract_value(argument_node, string_interpolation_error: :raise) end nil rescue CallContext::ValueUnresolveable => error warnings << build_warning(node, error) end |
#find_cassette_name(node) ⇒ Object
86 87 88 89 90 91 92 93 |
# File 'lib/vcr/unused_cassettes/cassette_usage_finder.rb', line 86 def find_cassette_name(node) # cassette is the first argument of the use_cassette call cassette_argument = node.arguments.arguments.first call_context.extract_value(cassette_argument, string_interpolation_error: :wildcard) rescue CallContext::ValueUnresolveable => error warnings << build_warning(node, error) nil end |
#find_cassette_usages ⇒ Object
15 16 17 18 19 20 21 22 23 24 25 |
# File 'lib/vcr/unused_cassettes/cassette_usage_finder.rb', line 15 def find_cassette_usages parse_result = Prism.parse_file(filename) return [[], []] unless parse_result method_index = MethodIndex.new(parse_result.value) self.call_context = CallContext.new(method_index: method_index) find_cassette_usages_in(parse_result.value) [used_cassettes, warnings] end |
#find_cassette_usages_in(node) ⇒ Object
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
# File 'lib/vcr/unused_cassettes/cassette_usage_finder.rb', line 27 def find_cassette_usages_in(node) return if node.nil? call_context.track(node) if node_contains_call?(node) record_cassette_uses(node) end return if node.child_nodes.nil? if node.is_a?(Prism::DefNode) call_context.enter_method(node) begin node.child_nodes.each { |child| find_cassette_usages_in(child) } ensure call_context.exit_method end else node.child_nodes.each { |child| find_cassette_usages_in(child) } end end |
#node_contains_call?(node) ⇒ Boolean
77 78 79 80 81 82 83 84 |
# File 'lib/vcr/unused_cassettes/cassette_usage_finder.rb', line 77 def node_contains_call?(node) return false unless node.is_a?(Prism::CallNode) receiver = node.receiver return false unless receiver.is_a?(Prism::ConstantReadNode) && receiver.name == :VCR node.name == :use_cassette end |
#record_cassette_uses(node) ⇒ Object
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
# File 'lib/vcr/unused_cassettes/cassette_usage_finder.rb', line 50 def record_cassette_uses(node) found_name = find_cassette_name(node) return if found_name.nil? = (node) patterns = found_name.is_a?(CallContext::MultiValue) ? found_name.values : [found_name] patterns.each do |pattern| next unless pattern.is_a?(String) && /[a-zA-Z0-9*]/.match?(pattern) cassette_use = {pattern: pattern} cassette_use[:persister] = [:persist_with] if &.has_key?(:persist_with) cassette_use[:serializer] = [:serialize_with] if &.has_key?(:serialize_with) used_cassettes << cassette_use end end |