old_contents: #!/usr/bin/env python3
  """Classes for working with all automata, including Turing machines."""
  
  import abc
  
  import automata.base.exceptions as exceptions
  
  
  class Automaton(metaclass=abc.ABCMeta):
      """An abstract base class for all automata, including Turing machines."""
  
      @abc.abstractmethod
      def __init__(self):
          """Initialize a complete automaton."""
          raise NotImplementedError()
  
      @abc.abstractmethod
      def validate(self):
          """Return True if this automaton is internally consistent."""
          raise NotImplementedError()
  
      @abc.abstractmethod
      def read_input_stepwise(self, input_str):
          """Check if the given string is accepted by this automaton."""
          raise NotImplementedError()
  
      def read_input(self, input_str):
          """
          Check if the given string is accepted by this automaton.
  
          Return the automaton's final configuration if this string is valid.
          """
          validation_generator = self.read_input_stepwise(input_str)
          for config in validation_generator:
              pass
          return config
  
      def _validate_initial_state(self):
          """Raise an error if the initial state is invalid."""
          if self.initial_state not in self.states:
              raise exceptions.InvalidStateError(
                  '{} is not a valid initial state'.format(self.initial_state))
  
      def _validate_initial_state_transitions(self):
          """Raise an error if the initial state has no transitions defined."""
          if self.initial_state not in self.transitions:
              raise exceptions.MissingStateError(
                  'initial state {} has no transitions defined'.format(
                      self.initial_state))
  
      def _validate_final_states(self):
          """Raise an error if any final states are invalid."""
          invalid_states = self.final_states - self.states
          if invalid_states:
              raise exceptions.InvalidStateError(
                  'final states are not valid ({})'.format(
                      ', '.join(invalid_states)))
  
      def copy(self):
          """Create a deep copy of the automaton."""
          return self.__class__(**self.__dict__)
  
      def __eq__(self, other):
          """Check if two automata are equal."""
          return self.__dict__ == other.__dict__
  
new_contents: #!/usr/bin/env python3
  """Classes for working with all automata, including Turing machines."""
  
  import abc
  
  import automata.base.exceptions as exceptions
  
  
  class Automaton(metaclass=abc.ABCMeta):
      """An abstract base class for all automata, including Turing machines."""
  
      @abc.abstractmethod
      def __init__(self):
          """Initialize a complete automaton."""
          raise NotImplementedError()
  
      @abc.abstractmethod
      def validate(self):
          """Return True if this automaton is internally consistent."""
          raise NotImplementedError()
  
      @abc.abstractmethod
      def read_input_stepwise(self, input_str):
          """Return a generator that yields each step while reading input."""
          raise NotImplementedError()
  
      def read_input(self, input_str):
          """
          Check if the given string is accepted by this automaton.
  
          Return the automaton's final configuration if this string is valid.
          """
          validation_generator = self.read_input_stepwise(input_str)
          for config in validation_generator:
              pass
          return config
  
      def _validate_initial_state(self):
          """Raise an error if the initial state is invalid."""
          if self.initial_state not in self.states:
              raise exceptions.InvalidStateError(
                  '{} is not a valid initial state'.format(self.initial_state))
  
      def _validate_initial_state_transitions(self):
          """Raise an error if the initial state has no transitions defined."""
          if self.initial_state not in self.transitions:
              raise exceptions.MissingStateError(
                  'initial state {} has no transitions defined'.format(
                      self.initial_state))
  
      def _validate_final_states(self):
          """Raise an error if any final states are invalid."""
          invalid_states = self.final_states - self.states
          if invalid_states:
              raise exceptions.InvalidStateError(
                  'final states are not valid ({})'.format(
                      ', '.join(invalid_states)))
  
      def copy(self):
          """Create a deep copy of the automaton."""
          return self.__class__(**self.__dict__)
  
      def __eq__(self, other):
          """Check if two automata are equal."""
          return self.__dict__ == other.__dict__
  
subject: Revise read_input_stepwise docstring to be clearer