class_docstr: Class for running FiftyOne migrations.
  
  Args:
      head: the current revision
      destination: the destination revision
class_docstr_tok: ["Class","for","running","FiftyOne","migrations",".","Args",":","head",":","the","current","revision","destination",":","the","destination","revision"]
code: def __init__(
      self,
      head,
      destination,
      _revisions=None,
      _admin_revisions=None,
  ):
      pkg_ver = Version(foc.VERSION)
      head_ver = Version(head)
      dest_ver = Version(destination)
      if head_ver > pkg_ver or dest_ver > pkg_ver:
          raise EnvironmentError(
              "You must have fiftyone>=%s installed in order to migrate "
              "from v%s to v%s, but you are currently running fiftyone==%s."
              "\n\nSee https://docs.voxel51.com/getting_started/install.html#downgrading-fiftyone "
              "for information about downgrading FiftyOne."
              % (max(head_ver, dest_ver), head_ver, dest_ver, pkg_ver)
          )
  
      if _revisions is None:
          _revisions = _get_all_revisions()
  
      if _admin_revisions is None:
          _admin_revisions = _get_all_revisions(admin=True)
  
      self._head = head
      self._destination = destination
      self._revisions, self._direction = _get_revisions_to_run(
          head, destination, _revisions
      )
      self._admin_revisions, _ = _get_revisions_to_run(
          head, destination, _admin_revisions
      )
  
imports: import bisect
  import logging
  import os
  from packaging.requirements import Requirement
  from packaging.version import Version
  import eta.core.utils
  import fiftyone
  import fiftyone.constants
  import fiftyone.core.odm
  import fiftyone.core.utils
label_desc: Use image node_id 1 to create a new MigrationRunner object from inherited base classes: object with example: obj = MigrationRunner(head, destination, _revisions, _admin_revisions)