58 lines
1.3 KiB
Ruby
58 lines
1.3 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Tooling
|
|
class TestMapPacker
|
|
SEPARATOR = '/'
|
|
MARKER = 1
|
|
|
|
def pack(map)
|
|
map.transform_values(&method(:create_tree_from_tests))
|
|
end
|
|
|
|
def unpack(compact_map)
|
|
compact_map.transform_values(&method(:retrieve_tests_from_tree))
|
|
end
|
|
|
|
private
|
|
|
|
def create_tree_from_tests(tests)
|
|
tests.inject({}) do |tree, test|
|
|
segments = test.split(SEPARATOR)
|
|
branch = create_branch_from_segments(segments)
|
|
deep_merge(tree, branch)
|
|
end
|
|
end
|
|
|
|
def create_branch_from_segments(segments)
|
|
segments.reverse.inject(MARKER) { |node, parent| { parent => node } }
|
|
end
|
|
|
|
def deep_merge(hash, other)
|
|
hash.merge(other) do |_, this_val, other_val|
|
|
if this_val.is_a?(Hash) && other_val.is_a?(Hash)
|
|
deep_merge(this_val, other_val)
|
|
else
|
|
other_val
|
|
end
|
|
end
|
|
end
|
|
|
|
def retrieve_tests_from_tree(tree)
|
|
traverse(tree).inject([]) do |tests, test|
|
|
tests << test
|
|
end
|
|
end
|
|
|
|
def traverse(tree, segments = [], &block)
|
|
return to_enum(__method__, tree, segments) unless block_given?
|
|
|
|
if tree == MARKER
|
|
return yield segments.join(SEPARATOR)
|
|
end
|
|
|
|
tree.each do |key, value|
|
|
traverse(value, segments + [key], &block)
|
|
end
|
|
end
|
|
end
|
|
end
|