summaryrefslogtreecommitdiff
path: root/tooling/rspec_flaky/flaky_examples_collection.rb
diff options
context:
space:
mode:
Diffstat (limited to 'tooling/rspec_flaky/flaky_examples_collection.rb')
-rw-r--r--tooling/rspec_flaky/flaky_examples_collection.rb38
1 files changed, 38 insertions, 0 deletions
diff --git a/tooling/rspec_flaky/flaky_examples_collection.rb b/tooling/rspec_flaky/flaky_examples_collection.rb
new file mode 100644
index 00000000000..acbfb411873
--- /dev/null
+++ b/tooling/rspec_flaky/flaky_examples_collection.rb
@@ -0,0 +1,38 @@
+# frozen_string_literal: true
+
+require 'active_support/hash_with_indifferent_access'
+require 'delegate'
+
+require_relative 'flaky_example'
+
+module RspecFlaky
+ class FlakyExamplesCollection < SimpleDelegator
+ def initialize(collection = {})
+ unless collection.is_a?(Hash)
+ raise ArgumentError, "`collection` must be a Hash, #{collection.class} given!"
+ end
+
+ collection_of_flaky_examples =
+ collection.map do |uid, example|
+ [
+ uid,
+ example.is_a?(RspecFlaky::FlakyExample) ? example : RspecFlaky::FlakyExample.new(example)
+ ]
+ end
+
+ super(Hash[collection_of_flaky_examples])
+ end
+
+ def to_h
+ transform_values { |example| example.to_h }.deep_symbolize_keys
+ end
+
+ def -(other)
+ unless other.respond_to?(:key)
+ raise ArgumentError, "`other` must respond to `#key?`, #{other.class} does not!"
+ end
+
+ self.class.new(reject { |uid, _| other.key?(uid) })
+ end
+ end
+end