class ViewModel::ActiveRecord::UpdateData

def self.parse_hashes(root_subtree_hashes, referenced_subtree_hashes = {})

def self.parse_hashes(root_subtree_hashes, referenced_subtree_hashes = {})
  valid_reference_keys = referenced_subtree_hashes.keys.to_set
  valid_reference_keys.each do |ref|
    unless ref.is_a?(String)
      raise ViewModel::DeserializationError::InvalidSyntax.new("Invalid reference string: #{ref}")
    end
  end
  # Construct root UpdateData
  root_updates = root_subtree_hashes.map do |subtree_hash|
    metadata = ViewModel.extract_viewmodel_metadata(subtree_hash)
    viewmodel_class = ViewModel::Registry.for_view_name(metadata.view_name)
    verify_schema_version!(viewmodel_class, metadata.schema_version, metadata.id) if metadata.schema_version
    UpdateData.new(viewmodel_class, metadata, subtree_hash, valid_reference_keys)
  end
  # Ensure that no root is referred to more than once
  check_duplicate_updates(root_updates, type: 'root')
  # Construct reference UpdateData
  referenced_updates = referenced_subtree_hashes.transform_values do |subtree_hash|
    metadata = ViewModel.extract_viewmodel_metadata(subtree_hash)
    viewmodel_class = ViewModel::Registry.for_view_name(metadata.view_name)
    verify_schema_version!(viewmodel_class, metadata.schema_version, metadata.id) if metadata.schema_version
    UpdateData.new(viewmodel_class, metadata, subtree_hash, valid_reference_keys)
  end
  check_duplicate_updates(referenced_updates.values, type: 'reference')
  return root_updates, referenced_updates
end