From be72efe16615e8aba1798c39b4035d7122afb8c0 Mon Sep 17 00:00:00 2001 From: Andy Waite <13400+andyw8@users.noreply.github.com> Date: Mon, 18 Nov 2024 10:45:05 -0500 Subject: [PATCH] Prevent `index_all` being called multiple times --- lib/ruby_indexer/lib/ruby_indexer/index.rb | 10 ++++++++++ lib/ruby_indexer/test/index_test.rb | 7 +++++++ 2 files changed, 17 insertions(+) diff --git a/lib/ruby_indexer/lib/ruby_indexer/index.rb b/lib/ruby_indexer/lib/ruby_indexer/index.rb index 7effc5b77..ee09c773b 100644 --- a/lib/ruby_indexer/lib/ruby_indexer/index.rb +++ b/lib/ruby_indexer/lib/ruby_indexer/index.rb @@ -7,6 +7,7 @@ class Index class UnresolvableAliasError < StandardError; end class NonExistingNamespaceError < StandardError; end + class IndexNotEmptyError < StandardError; end # The minimum Jaro-Winkler similarity score for an entry to be considered a match for a given fuzzy search query ENTRY_SIMILARITY_THRESHOLD = 0.7 @@ -360,6 +361,15 @@ def resolve(name, nesting, seen_names = []) ).void end def index_all(indexable_paths: @configuration.indexables, &block) + # When troubleshooting an indexing issue, e.g. through irb, it's not obvious that `index_all` will augment the + # existing index values, meaning it may contain 'stale' entries. This check ensures that the user is aware of this + # behavior and can take appropriate action. + # binding.break + if @entries.any? + raise IndexNotEmptyError, + "The index is not empty. To prevent invalid entries, `index_all` can only be called once." + end + RBSIndexer.new(self).index_ruby_core # Calculate how many paths are worth 1% of progress progress_step = (indexable_paths.length / 100.0).ceil diff --git a/lib/ruby_indexer/test/index_test.rb b/lib/ruby_indexer/test/index_test.rb index c83d3b0e6..2723edc0a 100644 --- a/lib/ruby_indexer/test/index_test.rb +++ b/lib/ruby_indexer/test/index_test.rb @@ -2023,5 +2023,12 @@ def test_build_non_redundant_name ), ) end + + def test_prevents_multiple_calls_to_index_all + # For this test class, `index_all` is already called once in `setup`. + assert_raises(Index::IndexNotEmptyError) do + @index.index_all + end + end end end