code: def merge_things(self, inputs):
      from metaflow.current import current
      from metaflow.exception import (
          UnhandledInMergeArtifactsException,
          MetaflowException,
      )
  
      # Test to make sure non-merged values are reported
      assert_exception(
          lambda: self.merge_artifacts(inputs),
          UnhandledInMergeArtifactsException,
      )
  
      # Test to make sure nothing is set if failed merge_artifacts
      assert not hasattr(self, "non_modified_passdown")
      assert not hasattr(self, "manual_merge_required")
  
      # Test to make sure that only one of exclude/include is used
      assert_exception(
          lambda: self.merge_artifacts(
              inputs,
              exclude=["ignore_me"],
              include=["non_modified_passdown"],
          ),
          MetaflowException,
      )
  
      # Test to make sure nothing is set if failed merge_artifacts
      assert not hasattr(self, "non_modified_passdown")
      assert not hasattr(self, "manual_merge_required")
  
      # Test actual merge (ignores set values and excluded names, merges common and non modified)
      self.manual_merge_required = current.task_id
      self.merge_artifacts(inputs, exclude=["ignore_me"])
  
      # Ensure that everything we expect is passed down
      assert_equals(self.non_modified_passdown, "a")
      assert_equals(self.modified_to_same_value, "e")
      assert_equals(self.manual_merge_required, current.task_id)
      assert not hasattr(self, "ignore_me")
  
file_path: metaflow/test/core/tests/merge_artifacts.py
imports: from metaflow_test import MetaflowTest, ExpectationFailed, steps
label_desc: Use image node_id 3 for calling the MergeArtifactsTest obj's underlying member method code with example usage: obj.merge_things(inputs) without return types